RISC-V emuliatorius pikselių šešėliuotojo pavidalu, leidžiantis paleisti Linux VRChat

Paskelbti eksperimento, organizuojant Linux paleidimą kelių žaidėjų internetinio žaidimo VRChat virtualioje 3D erdvėje, leidžiančio įkelti 3D modelius su savo šešėliais, rezultatai. Sugalvotai idėjai įgyvendinti buvo sukurtas RISC-V architektūros emuliatorius, vykdomas GPU pusėje pikselių (fragmento) šešėlio pavidalu (VRChat nepalaiko skaičiavimo šešėlių ir UAV). Emuliatoriaus kodas paskelbtas pagal MIT licenciją.

Emuliatorius yra pagrįstas įgyvendinimu C kalba, kuriai, savo ruožtu, buvo naudojami minimalistinio emuliatoriaus riscv-rust, sukurto Rust kalba, patobulinimai. Paruoštas C kodas yra išverstas į pixel shader HLSL, tinka įkelti į VRChat. Emuliatorius visiškai palaiko rv32imasu instrukcijų rinkinio architektūrą, SV32 atminties valdymo bloką ir minimalų periferinių įrenginių rinkinį (UART ir laikmatį). Paruoštų galimybių pakanka įkelti Linux branduolį 5.13.5 ir pagrindinę BusyBox komandų eilutės aplinką, su kuria galima bendrauti tiesiogiai iš VRChat virtualaus pasaulio.

RISC-V emuliatorius pikselių šešėliuotojo pavidalu, leidžiantis paleisti Linux VRChat
RISC-V emuliatorius pikselių šešėliuotojo pavidalu, leidžiantis paleisti Linux VRChat

Emuliatorius yra įdiegtas šešėlyje savo dinaminės tekstūros (Unity Custom Render Texture) pavidalu, papildytu VRChat numatytais Udon scenarijais, naudojamais emuliatoriui valdyti jo vykdymo metu. RAM turinys ir emuliuotos sistemos procesoriaus būsena saugomi tekstūros pavidalu, 2048x2048 pikselių dydžio. Emuliuotas procesorius veikia 250 kHz dažniu. Be Linux, emuliatorius taip pat gali paleisti Micropython.

RISC-V emuliatorius pikselių šešėliuotojo pavidalu, leidžiantis paleisti Linux VRChat

Norint sukurti nuolatinę duomenų saugyklą su skaitymo ir rašymo palaikymu, reikia naudoti kameros objektą, susietą su šešėliuotojo sugeneruota stačiakampe sritimi, ir nukreipti pateiktos tekstūros išvestį į atspalvio įvestį. Tokiu būdu bet kuris pikselis, įrašytas pikselių šešėliuotojo vykdymo metu, gali būti nuskaitytas, kai apdorojamas kitas kadras.

Taikant pikselių šešėliuotojus, kiekvienam tekstūros pikseliui lygiagrečiai paleidžiamas atskiras šešėliavimo pavyzdys. Ši funkcija gerokai apsunkina diegimą ir reikalauja atskiro visos emuliuojamos sistemos būsenos koordinavimo bei apdorojamo pikselio padėties palyginimo su jame užkoduota procesoriaus būsena arba emuliuojamos sistemos RAM turiniu (kiekvienas pikselis gali užkoduoti 128 informacijos gabaliukai). Shader kodas reikalauja įtraukti daugybę patikrinimų, kurių įgyvendinimą supaprastinti buvo naudojamas perl išankstinis procesorius perlpp.



Šaltinis: opennet.ru

Добавить комментарий