En RISC-V emulator i form av en pixel shader som låter dig köra Linux i VRChat

Resultaten av ett experiment om att organisera lanseringen av Linux i det virtuella 3D-utrymmet i multiplayer-onlinespelet VRChat, som gör det möjligt att ladda 3D-modeller med sina egna shaders, har publicerats. För att implementera den uttänkta idén skapades en emulator av RISC-V-arkitekturen, exekverad på GPU-sidan i form av en pixel (fragment) shader (VRChat stöder inte beräkningsskuggning och UAV). Emulatorkoden publiceras under MIT-licensen.

Emulatorn är baserad på en implementering i C-språket, vars skapande i sin tur använde utvecklingen av den minimalistiska emulatorn riscv-rust, utvecklad i Rust-språket. Den förberedda C-koden översätts till en pixelshader i HLSL, lämplig för laddning i VRChat. Emulatorn ger fullt stöd för rv32imasus instruktionsuppsättningsarkitektur, SV32-minneshanteringsenheten och en minimal uppsättning kringutrustning (UART och timer). De förberedda funktionerna räcker för att ladda Linux-kärnan 5.13.5 och den grundläggande BusyBox-kommandoradsmiljön, med vilken du kan interagera direkt från den virtuella VRChat-världen.

En RISC-V emulator i form av en pixel shader som låter dig köra Linux i VRChat
En RISC-V emulator i form av en pixel shader som låter dig köra Linux i VRChat

Emulatorn implementeras i skuggan i form av sin egen dynamiska textur (Unity Custom Render Texture), kompletterad med Udon-skript som tillhandahålls för VRChat, som används för att styra emulatorn under dess körning. Innehållet i RAM-minnet och processortillståndet för det emulerade systemet lagras i form av en textur, 2048x2048 pixlar i storlek. Den emulerade processorn arbetar med en frekvens på 250 kHz. Förutom Linux kan emulatorn även köra Micropython.

En RISC-V emulator i form av en pixel shader som låter dig köra Linux i VRChat

För att skapa beständig datalagring med stöd för läsning och skrivning är ett knep att använda ett kameraobjekt bundet till ett rektangulärt område som genereras av skuggningen och rikta utmatningen av den renderade texturen till skuggningsinmatningen. På så sätt kan vilken pixel som helst som skrivs under körning av pixelskuggning läsas när nästa bildruta bearbetas.

När du använder pixelskuggningar startas en separat skuggningsinstans parallellt för varje texturpixel. Denna funktion komplicerar implementeringen avsevärt och kräver separat koordinering av tillståndet för hela det emulerade systemet och jämförelse av positionen för den behandlade pixeln med CPU-tillståndet kodat i den eller innehållet i RAM-minnet i det emulerade systemet (varje pixel kan koda 128 bitar av information). Skuggningskoden kräver inkludering av ett stort antal kontroller, för att förenkla implementeringen av vilken perl-förprocessorn perlpp användes.



Källa: opennet.ru

Lägg en kommentar