En RISC-V emulator i form af en pixel shader, der giver dig mulighed for at køre Linux i VRChat

Resultaterne af et eksperiment med at organisere lanceringen af ​​Linux i det virtuelle 3D-rum i multiplayer-onlinespillet VRChat, som tillader indlæsning af 3D-modeller med deres egne shaders, er blevet offentliggjort. For at implementere den udtænkte idé blev der skabt en emulator af RISC-V-arkitekturen, udført på GPU-siden i form af en pixel (fragment) shader (VRChat understøtter ikke computational shaders og UAV). Emulatorkoden udgives under MIT-licensen.

Emulatoren er baseret på en implementering i C-sproget, hvis oprettelse igen brugte udviklingen af ​​den minimalistiske emulator riscv-rust, udviklet i Rust-sproget. Den forberedte C-kode er oversat til en pixel shader i HLSL, velegnet til indlæsning i VRChat. Emulatoren giver fuld understøttelse af rv32imasu-instruktionssæt-arkitekturen, SV32-hukommelsesstyringsenheden og et minimalt sæt periferiudstyr (UART og timer). De forberedte muligheder er nok til at indlæse Linux-kernen 5.13.5 og det grundlæggende BusyBox-kommandolinjemiljø, som du kan interagere direkte fra den virtuelle VRChat-verden med.

En RISC-V emulator i form af en pixel shader, der giver dig mulighed for at køre Linux i VRChat
En RISC-V emulator i form af en pixel shader, der giver dig mulighed for at køre Linux i VRChat

Emulatoren er implementeret i shaderen i form af sin egen dynamiske tekstur (Unity Custom Render Texture), suppleret med Udon-scripts, der leveres til VRChat, der bruges til at styre emulatoren under dens udførelse. Indholdet af RAM'en og processortilstanden for det emulerede system gemmes i form af en tekstur, 2048x2048 pixels i størrelse. Den emulerede processor arbejder ved en frekvens på 250 kHz. Udover Linux kan emulatoren også køre Micropython.

En RISC-V emulator i form af en pixel shader, der giver dig mulighed for at køre Linux i VRChat

For at skabe vedvarende datalagring med understøttelse af læsning og skrivning er et trick at bruge et kameraobjekt bundet til et rektangulært område, der er genereret af skyggen, og dirigere outputtet af den gengivede tekstur til skyggeindgangen. På denne måde kan enhver pixel, der er skrevet under udførelse af pixel shader, læses, når den næste frame behandles.

Når du anvender pixel shaders, lanceres en separat shader-instans parallelt for hver teksturpixel. Denne funktion komplicerer implementeringen betydeligt og kræver separat koordinering af tilstanden for hele det emulerede system og sammenligning af positionen af ​​den behandlede pixel med CPU-tilstanden kodet i den eller indholdet af RAM'en i det emulerede system (hver pixel kan kode 128 stykker information). Shader-koden kræver inkludering af et stort antal kontroller, for at forenkle implementeringen af ​​hvilken perl-forprocessoren perlpp blev brugt.



Kilde: opennet.ru

Tilføj en kommentar