RISC-V emulators pikseļu ēnotāja veidā, kas ļauj palaist Linux VRChat

Ir publicēti eksperimenta rezultāti par Linux palaišanas organizēšanu vairāku spēlētāju tiešsaistes spēles VRChat virtuālajā 3D telpā, kas ļauj ielādēt 3D modeļus ar saviem ēnotājiem. Iecerētās idejas īstenošanai tika izveidots RISC-V arhitektūras emulators, kas izpildīts GPU pusē pikseļu (fragmentu) ēnotāja veidā (VRChat neatbalsta skaitļošanas ēnotājus un UAV). Emulatora kods ir publicēts saskaņā ar MIT licenci.

Emulatora pamatā ir implementācija C valodā, kuras izveidē savukārt izmantotas Rust valodā izstrādātā minimālistiskā emulatora riscv-rust izstrādnes. Sagatavotais C kods tiek tulkots pikseļu ēnotājā HLSL, kas ir piemērots ielādei VRChat. Emulators nodrošina pilnu atbalstu rv32imasu instrukciju kopas arhitektūrai, SV32 atmiņas pārvaldības vienībai un minimālam perifērijas ierīču komplektam (UART un taimeris). Sagatavotās iespējas ir pietiekamas, lai ielādētu Linux kodolu 5.13.5 un pamata BusyBox komandrindas vidi, ar kuru var mijiedarboties tieši no VRChat virtuālās pasaules.

RISC-V emulators pikseļu ēnotāja veidā, kas ļauj palaist Linux VRChat
RISC-V emulators pikseļu ēnotāja veidā, kas ļauj palaist Linux VRChat

Emulators ir ieviests ēnotā savas dinamiskās tekstūras veidā (Unity Custom Render Texture), ko papildina VRChat nodrošinātie Udon skripti, kurus izmanto, lai kontrolētu emulatoru tā izpildes laikā. RAM saturs un emulētās sistēmas procesora stāvoklis tiek saglabāts tekstūras veidā, 2048x2048 pikseļu izmērā. Emulētais procesors darbojas ar 250 kHz frekvenci. Papildus Linux emulators var palaist arī Micropython.

RISC-V emulators pikseļu ēnotāja veidā, kas ļauj palaist Linux VRChat

Lai izveidotu pastāvīgu datu krātuvi ar lasīšanas un rakstīšanas atbalstu, ir jāizmanto kameras objekts, kas ir saistīts ar ēnotāja ģenerētu taisnstūra laukumu, un renderētās tekstūras izvadi tiek novirzīti uz ēnotāja ievadi. Tādā veidā jebkuru pikseļu, kas ierakstīts pikseļu ēnotāja izpildes laikā, var nolasīt, kad tiek apstrādāts nākamais kadrs.

Lietojot pikseļu ēnotājus, katram tekstūras pikselim paralēli tiek palaista atsevišķa ēnotāja instance. Šī funkcija ievērojami apgrūtina ieviešanu un prasa atsevišķu visas emulētās sistēmas stāvokļa koordināciju un apstrādātā pikseļa pozīcijas salīdzināšanu ar tajā kodēto CPU stāvokli vai emulētās sistēmas RAM saturu (katrs pikselis var kodēt 128 informācijas biti). Shader kodam ir jāiekļauj milzīgs skaits pārbaužu, kuru ieviešanas vienkāršošanai tika izmantots perl priekšprocesors perlpp.



Avots: opennet.ru

Pievieno komentāru