Megjelentek a kísérlet eredményei, amely során Linux indítását szervezték meg egy többszereplős online játék, a VRChat virtuális 3D terében, lehetővé téve 3D modellek saját shaderjeivel való betöltését. A kitűzött ötlet megvalósítása érdekében létrehoztak egy RISC-V architektúra emulátort, amely a GPU oldalán, pixel shader (fragment shader) formájában működik (a VRChat nem támogatja a számítási shader-eket és UAV-t). Az emulátor kódját MIT licenc alatt tették közzé.
Az emulátor alapja C nyelven készült megvalósítás, amely során a minimalista riscv-rust emulátor fejlesztései is felhasználásra kerültek, Rust nyelven. A készített C kódot HLSL nyelven írt pixel shader-re fordítják, amely betölthető a VRChat-be. Az emulátor teljes támogatást biztosít az rv32imasu utasításkészlet architektúrához, a memória vezérlő SV32-hez és a minimális perifériás eszközökhöz (UART és timer). A készített lehetőségek elegendőek Linux 5.13.5 kernel és a BusyBox parancssori környezet betöltéséhez, amely közvetlenül interakcióba léphet a VRChat virtuális világával.


Az emulátor shader formájában van megvalósítva, saját dinamikus textúraként (Unity Custom Render Texture), kiegészítve a VRChat számára biztosított Udon script-ekkel, amelyek az emulátor irányítására szolgálnak a futása alatt. A memória tartalma és az emulált rendszer processzorának állapota textúraként kerül tárolásra, 2048×2048 pixel méretben. Az emulált processzor 250 kHz frekvencián működik. A Linux mellett a Micropython is futtatható az emulátorban.

Az adatok állandó tárolásának és olvasásának támogatására egy trükköt használnak, amely a Camera objektum használatára épül, amely egy shader által generált téglalap alakú területhez van kötve, és a renderelt textúra kimenetét irányítja a shader bemenetére. Így bármely pixel, amelyet a pixel shader futása során írtak, beolvasható a következő frame feldolgozása során.
A pixel shader instance is run separately in parallel for each pixel of the texture. This feature significantly complicates implementation and requires specific coordination of the state of the entire emulated system and matching the processing pixel's position with the information encoded in it, such as the CPU state or the contents of the emulated system's RAM (each pixel can encode 128 bits of information). The shader code requires a vast number of checks, for which the Perl preprocessor perlpp was utilized to simplify the implementation.

Forrás: opennet.ru
