Emulator RISC-V dalam bentuk pixel shader yang memungkinkan Anda menjalankan Linux di VRChat

Hasil percobaan mengatur peluncuran Linux di dalam ruang 3D virtual dari game online multipemain VRChat, yang memungkinkan memuat model 3D dengan shadernya sendiri, telah dipublikasikan. Untuk mengimplementasikan ide tersebut, emulator arsitektur RISC-V dibuat, dieksekusi di sisi GPU dalam bentuk shader piksel (fragmen) (VRChat tidak mendukung shader komputasi dan UAV). Kode emulator diterbitkan di bawah lisensi MIT.

Emulator ini didasarkan pada implementasi dalam bahasa C, yang pembuatannya, pada gilirannya, menggunakan pengembangan emulator minimalis riscv-rust, yang dikembangkan dalam bahasa Rust. Kode C yang disiapkan diterjemahkan ke dalam pixel shader di HLSL, cocok untuk dimuat ke VRChat. Emulator ini memberikan dukungan penuh untuk arsitektur set instruksi rv32imasu, unit manajemen memori SV32, dan seperangkat periferal minimal (UART dan timer). Kemampuan yang disiapkan cukup untuk memuat kernel Linux 5.13.5 dan lingkungan baris perintah dasar BusyBox, yang dengannya Anda dapat berinteraksi langsung dari dunia virtual VRChat.

Emulator RISC-V dalam bentuk pixel shader yang memungkinkan Anda menjalankan Linux di VRChat
Emulator RISC-V dalam bentuk pixel shader yang memungkinkan Anda menjalankan Linux di VRChat

Emulator diimplementasikan dalam shader dalam bentuk tekstur dinamisnya sendiri (Unity Custom Render Texture), dilengkapi dengan skrip Udon yang disediakan untuk VRChat, yang digunakan untuk mengontrol emulator selama eksekusinya. Isi RAM dan status prosesor dari sistem yang ditiru disimpan dalam bentuk tekstur berukuran 2048x2048 piksel. Prosesor yang ditiru beroperasi pada frekuensi 250 kHz. Selain Linux, emulatornya juga bisa menjalankan Micropython.

Emulator RISC-V dalam bentuk pixel shader yang memungkinkan Anda menjalankan Linux di VRChat

Untuk membuat penyimpanan data persisten dengan dukungan untuk membaca dan menulis, triknya adalah dengan menggunakan objek Kamera yang diikat ke area persegi panjang yang dihasilkan oleh shader dan mengarahkan keluaran tekstur yang dirender ke masukan shader. Dengan cara ini, setiap piksel yang ditulis selama eksekusi pixel shader dapat dibaca saat frame berikutnya diproses.

Saat menerapkan pixel shader, instance shader terpisah diluncurkan secara paralel untuk setiap piksel tekstur. Fitur ini secara signifikan mempersulit implementasi dan memerlukan koordinasi terpisah dari status seluruh sistem yang ditiru dan membandingkan posisi piksel yang diproses dengan status CPU yang dikodekan di dalamnya atau konten RAM dari sistem yang ditiru (setiap piksel dapat mengkodekan 128 sedikit informasi). Kode shader memerlukan penyertaan sejumlah besar pemeriksaan, untuk menyederhanakan implementasi yang digunakan perl preprocessor perlpp.



Sumber: opennet.ru

Tambah komentar