独自のシェーダを備えた 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 仮想世界から直接対話できるようになります。
エミュレータは、独自のダイナミック テクスチャ (Unity Custom Render Texture) の形式でシェーダに実装され、VRChat 用に提供される Udon スクリプトによって補完され、実行中にエミュレータを制御するために使用されます。 RAM の内容とエミュレートされたシステムのプロセッサ状態は、サイズ 2048x2048 ピクセルのテクスチャの形式で保存されます。 エミュレートされたプロセッサは 250 kHz の周波数で動作します。 Linux に加えて、エミュレータでは Micropython も実行できます。
読み取りと書き込みをサポートする永続的なデータ ストレージを作成するには、シェーダーによって生成された長方形の領域にバインドされた Camera オブジェクトを使用し、レンダリングされたテクスチャの出力をシェーダー入力に送信することがコツです。 このようにして、ピクセル シェーダの実行中に書き込まれたピクセルは、次のフレームが処理されるときに読み取ることができます。
ピクセル シェーダーを適用すると、テクスチャ ピクセルごとに別のシェーダー インスタンスが並行して起動されます。 この機能は実装を大幅に複雑にし、エミュレートされたシステム全体の状態を個別に調整し、処理されたピクセルの位置とその中でエンコードされた CPU 状態またはエミュレートされたシステムの RAM の内容との比較を必要とします (各ピクセルは 128 をエンコードできます)。ちょっとした情報)。 シェーダー コードには、Perl プリプロセッサ perlpp が使用される実装を簡素化するために、膨大な数のチェックを組み込む必要があります。
出所: オープンネット.ru