Un émulateur RISC-V sous forme de pixel shader qui permet d'exécuter Linux dans VRChat

Les résultats d'une expérience sur l'organisation du lancement de Linux dans l'espace virtuel 3D du jeu multijoueur en ligne VRChat, qui permet de charger des modèles 3D avec leurs propres shaders, ont été publiés. Pour mettre en œuvre l'idée conçue, un émulateur de l'architecture RISC-V a été créé, exécuté côté GPU sous la forme d'un shader de pixel (fragment) (VRChat ne prend pas en charge les shaders informatiques et les UAV). Le code de l'émulateur est publié sous licence MIT.

L'émulateur est basé sur une implémentation en langage C, dont la création, à son tour, a utilisé les développements de l'émulateur minimaliste riscv-rust, développé en langage Rust. Le code C préparé est traduit en un pixel shader en HLSL, adapté au chargement dans VRChat. L'émulateur fournit une prise en charge complète de l'architecture du jeu d'instructions rv32imasu, de l'unité de gestion de mémoire SV32 et d'un ensemble minimal de périphériques (UART et minuterie). Les capacités préparées sont suffisantes pour charger le noyau Linux 5.13.5 et l'environnement de ligne de commande de base BusyBox, avec lequel vous pouvez interagir directement depuis le monde virtuel VRChat.

Un émulateur RISC-V sous forme de pixel shader qui permet d'exécuter Linux dans VRChat
Un émulateur RISC-V sous forme de pixel shader qui permet d'exécuter Linux dans VRChat

L'émulateur est implémenté dans le shader sous la forme de sa propre texture dynamique (Unity Custom Render Texture), complétée par des scripts Udon fournis pour VRChat, utilisés pour contrôler l'émulateur lors de son exécution. Le contenu de la RAM et l'état du processeur du système émulé sont stockés sous la forme d'une texture de 2048 x 2048 pixels. Le processeur émulé fonctionne à une fréquence de 250 kHz. En plus de Linux, l'émulateur peut également exécuter Micropython.

Un émulateur RISC-V sous forme de pixel shader qui permet d'exécuter Linux dans VRChat

Pour créer un stockage de données persistant avec prise en charge de la lecture et de l'écriture, une astuce consiste à utiliser un objet Camera lié à une zone rectangulaire générée par le shader et à diriger la sortie de la texture rendue vers l'entrée du shader. De cette façon, tout pixel écrit lors de l’exécution du pixel shader peut être lu lors du traitement de l’image suivante.

Lors de l'application de pixel shaders, une instance de shader distincte est lancée en parallèle pour chaque pixel de texture. Cette fonctionnalité complique considérablement la mise en œuvre et nécessite une coordination séparée de l'état de l'ensemble du système émulé et une comparaison de la position du pixel traité avec l'état du CPU qui y est codé ou le contenu de la RAM du système émulé (chaque pixel peut coder 128 bits d’information). Le code du shader nécessite l'inclusion d'un grand nombre de vérifications, pour simplifier la mise en œuvre desquelles le préprocesseur Perl perlpp a été utilisé.



Source: opennet.ru

Ajouter un commentaire