Un emulator RISC-V sub forma unui pixel shader care vă permite să rulați Linux în VRChat

Au fost publicate rezultatele unui experiment de organizare a lansării Linux în spațiul virtual 3D al jocului online multiplayer VRChat, care permite încărcarea modelelor 3D cu propriile shadere. Pentru a implementa ideea concepută, a fost creat un emulator al arhitecturii RISC-V, executat pe partea GPU sub forma unui shader de pixeli (fragment) (VRChat nu acceptă shadere computaționale și UAV). Codul emulatorului este publicat sub licența MIT.

Emulatorul se bazează pe o implementare în limbajul C, a cărei creație a folosit, la rândul său, dezvoltările emulatorului minimalist riscv-rust, dezvoltat în limbajul Rust. Codul C pregătit este tradus într-un pixel shader în HLSL, potrivit pentru încărcare în VRChat. Emulatorul oferă suport complet pentru arhitectura setului de instrucțiuni rv32imasu, unitatea de gestionare a memoriei SV32 și un set minim de periferice (UART și temporizator). Capacitățile pregătite sunt suficiente pentru a încărca kernel-ul Linux 5.13.5 și mediul de bază de linie de comandă BusyBox, cu care puteți interacționa direct din lumea virtuală VRChat.

Un emulator RISC-V sub forma unui pixel shader care vă permite să rulați Linux în VRChat
Un emulator RISC-V sub forma unui pixel shader care vă permite să rulați Linux în VRChat

Emulatorul este implementat în shader sub forma propriei texturi dinamice (Unity Custom Render Texture), completată de scripturi Udon furnizate pentru VRChat, folosite pentru a controla emulatorul în timpul execuției acestuia. Conținutul memoriei RAM și starea procesorului sistemului emulat sunt stocate sub forma unei texturi, cu dimensiunea de 2048x2048 pixeli. Procesorul emulat funcționează la o frecvență de 250 kHz. Pe lângă Linux, emulatorul poate rula și Micropython.

Un emulator RISC-V sub forma unui pixel shader care vă permite să rulați Linux în VRChat

Pentru a crea stocare persistentă a datelor cu suport pentru citire și scriere, un truc este să utilizați un obiect Camera legat de o zonă dreptunghiulară generată de shader și să direcționați rezultatul texturii randate către intrarea shader. În acest fel, orice pixel scris în timpul execuției pixel shader poate fi citit atunci când următorul cadru este procesat.

Când se aplică pixel shader, o instanță shader separată este lansată în paralel pentru fiecare pixel de textură. Această caracteristică complică semnificativ implementarea și necesită o coordonare separată a stării întregului sistem emulat și compararea poziției pixelului procesat cu starea CPU codificată în acesta sau conținutul memoriei RAM a sistemului emulat (fiecare pixel poate codifica 128). biți de informații). Codul shader necesită includerea unui număr mare de verificări, pentru a simplifica implementarea cărora a fost folosit preprocesorul perl perlpp.



Sursa: opennet.ru

Adauga un comentariu