VRChat で Linux を実行できるピクセル シェーダー形式の RISC-V エミュレーター

独自のシェーダを備えた 3D モデルをロードできるマルチプレイヤー オンライン ゲーム VRChat の仮想 3D 空間内で Linux の起動を組織する実験の結果が公開されました。 思いついたアイデアを実装するために、RISC-V アーキテクチャのエミュレータが作成され、ピクセル (フラグメント) シェーダの形式で GPU 側で実行されました (VRChat は計算シェーダと UAV をサポートしていません)。 エミュレータ コードは MIT ライセンスに基づいて公開されています。

このエミュレータは C 言語での実装に基づいており、その作成には Rust 言語で開発された最小限のエミュレータ riscv-rust の開発が使用されています。 準備された C コードは、VRChat へのロードに適した HLSL のピクセル シェーダーに変換されます。 エミュレータは、rv32imasu 命令セット アーキテクチャ、SV32 メモリ管理ユニット、および最小限のペリフェラル セット (UART およびタイマー) を完全にサポートします。 準備された機能は、Linux カーネル 5.13.5 と基本的な BusyBox コマンド ライン環境をロードするのに十分であり、VRChat 仮想世界から直接対話できるようになります。

VRChat で Linux を実行できるピクセル シェーダー形式の RISC-V エミュレーター
VRChat で Linux を実行できるピクセル シェーダー形式の RISC-V エミュレーター

エミュレータは、独自のダイナミック テクスチャ (Unity Custom Render Texture) の形式でシェーダに実装され、VRChat 用に提供される Udon スクリプトによって補完され、実行中にエミュレータを制御するために使用されます。 RAM の内容とエミュレートされたシステムのプロセッサ状態は、サイズ 2048x2048 ピクセルのテクスチャの形式で保存されます。 エミュレートされたプロセッサは 250 kHz の周波数で動作します。 Linux に加えて、エミュレータでは Micropython も実行できます。

VRChat で Linux を実行できるピクセル シェーダー形式の RISC-V エミュレーター

読み取りと書き込みをサポートする永続的なデータ ストレージを作成するには、シェーダーによって生成された長方形の領域にバインドされた Camera オブジェクトを使用し、レンダリングされたテクスチャの出力をシェーダー入力に送信することがコツです。 このようにして、ピクセル シェーダの実行中に書き込まれたピクセルは、次のフレームが処理されるときに読み取ることができます。

ピクセル シェーダーを適用すると、テクスチャ ピクセルごとに別のシェーダー インスタンスが並行して起動されます。 この機能は実装を大幅に複雑にし、エミュレートされたシステム全体の状態を個別に調整し、処理されたピクセルの位置とその中でエンコードされた CPU 状態またはエミュレートされたシステムの RAM の内容との比較を必要とします (各ピクセルは 128 をエンコードできます)。ちょっとした情報)。 シェーダー コードには、Perl プリプロセッサ perlpp が使用される実装を簡素化するために、膨大な数のチェックを組み込む必要があります。



出所: オープンネット.ru

コメントを追加します