Um emulador RISC-V na forma de pixel shader que permite executar Linux no VRChat

Foram publicados os resultados de uma experiência de organização do lançamento do Linux dentro do espaço virtual 3D do jogo online multiplayer VRChat, que permite carregar modelos 3D com shaders próprios. Para implementar a ideia concebida, foi criado um emulador da arquitetura RISC-V, executado no lado da GPU na forma de um shader de pixel (fragmento) (VRChat não suporta shaders computacionais e UAV). O código do emulador é publicado sob a licença do MIT.

O emulador é baseado em uma implementação na linguagem C, cuja criação, por sua vez, utilizou os desenvolvimentos do emulador minimalista riscv-rust, desenvolvido na linguagem Rust. O código C preparado é traduzido em um pixel shader em HLSL, adequado para carregamento no VRChat. O emulador fornece suporte completo para a arquitetura do conjunto de instruções rv32imasu, a unidade de gerenciamento de memória SV32 e um conjunto mínimo de periféricos (UART e temporizador). Os recursos preparados são suficientes para carregar o kernel Linux 5.13.5 e o ambiente básico de linha de comando BusyBox, com o qual você pode interagir diretamente do mundo virtual VRChat.

Um emulador RISC-V na forma de pixel shader que permite executar Linux no VRChat
Um emulador RISC-V na forma de pixel shader que permite executar Linux no VRChat

O emulador é implementado no shader na forma de sua própria textura dinâmica (Unity Custom Render Texture), complementada por scripts Udon fornecidos para VRChat, usados ​​para controlar o emulador durante sua execução. O conteúdo da RAM e o estado do processador do sistema emulado são armazenados na forma de uma textura com tamanho de 2048x2048 pixels. O processador emulado opera a uma frequência de 250 kHz. Além do Linux, o emulador também pode rodar Micropython.

Um emulador RISC-V na forma de pixel shader que permite executar Linux no VRChat

Para criar um armazenamento persistente de dados com suporte para leitura e gravação, um truque é usar um objeto Camera vinculado a uma área retangular gerada pelo shader e direcionar a saída da textura renderizada para a entrada do shader. Dessa forma, qualquer pixel gravado durante a execução do pixel shader pode ser lido quando o próximo quadro for processado.

Ao aplicar pixel shaders, uma instância de shader separada é iniciada em paralelo para cada pixel de textura. Este recurso complica significativamente a implementação e requer coordenação separada do estado de todo o sistema emulado e comparação da posição do pixel processado com o estado da CPU codificado nele ou o conteúdo da RAM do sistema emulado (cada pixel pode codificar 128 pedaços de informação). O código do shader requer a inclusão de um grande número de verificações, para simplificar a implementação das quais foi utilizado o pré-processador perl perlpp.



Fonte: opennet.ru

Adicionar um comentário