Foram publicados os resultados de um experimento sobre a implementação do Linux em um espaço 3D virtual dentro do jogo online multiplayer VRChat, que permite o upload de modelos 3D com seus próprios shaders. Para realizar a ideia proposta, foi criado um emulador da arquitetura RISC-V, executado do lado da GPU na forma de um shader de pixel (fragment shader) (o VRChat não suporta shaders de computação e UAV). O código do emulador foi publicado sob a licença MIT.
A base do emulador é uma implementação na linguagem C, a partir da qual foram utilizadas, por sua vez, as contribuições de um emulador minimalista riscv-rust, desenvolvido na linguagem Rust. O código em C preparado é traduzido em um shader de pixel na linguagem HLSL, apto para upload no VRChat. O emulador oferece suporte completo à arquitetura do conjunto de instruções rv32imasu, bloco de controle de memória SV32 e um conjunto mínimo de dispositivos periféricos (UART e timer). Os recursos disponíveis são suficientes para carregar o kernel do Linux 5.13.5 e um ambiente básico de linha de comando BusyBox, com o qual é possível interagir diretamente do mundo virtual do VRChat.


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

Para organizar o armazenamento permanente de dados com suporte de leitura e gravação, é utilizada uma técnica relacionada ao uso de um objeto Camera, vinculado a uma área retangular gerada pelo shader, e a direção de saída da textura renderizada para a entrada do shader. Dessa forma, qualquer pixel gravado durante a execução do shader de pixel pode ser lido no processamento do próximo quadro.
Ao aplicar shaders de pixel, uma instância separada do shader é executada em paralelo para cada pixel da textura. Essa característica torna a implementação significativamente mais complexa e exige uma coordenação cuidadosa do estado de todo o sistema emulado e a associação da posição do pixel processado ao estado da CPU codificado nele ou ao conteúdo da RAM do sistema emulado (cada pixel pode codificar 128 bits de informação). O código do shader requer a inclusão de um grande número de verificações, para as quais foi utilizado o pré-processador Perl perlpp para simplificar a implementação.

Fonte: opennet.ru
