像素着色器形式的 RISC-V 模拟器,允许您在 VRChat 中运行 Linux

在多人在线游戏 VRChat 的虚拟 3D 空间内组织 Linux 启动的实验结果已经发布,该游戏允许使用自己的着色器加载 3D 模型。 为了实现设想的想法,创建了 RISC-V 架构的模拟器,以像素(片段)着色器的形式在 GPU 端执行(VRChat 不支持计算着色器和无人机)。 模拟器代码根据 MIT 许可证发布。

该模拟器基于 C 语言的实现,其创建又使用了以 Rust 语言开发的简约模拟器 riscv-rust 的开发成果。 准备好的C代码被翻译成HLSL中的像素着色器,适合加载到VRChat中。 该仿真器全面支持 rv32imasu 指令集架构、SV32 内存管理单元和最少的外设集(UART 和定时器)。 准备好的功能足以加载Linux内核5.13.5和基本的BusyBox命令行环境,您可以直接从VRChat虚拟世界进行交互。

像素着色器形式的 RISC-V 模拟器,允许您在 VRChat 中运行 Linux
像素着色器形式的 RISC-V 模拟器,允许您在 VRChat 中运行 Linux

模拟器在着色器中以自己的动态纹理(Unity自定义渲染纹理)的形式实现,并辅以为VRChat提供的Udon脚本,用于在模拟器执行过程中控制模拟器。 RAM 的内容和仿真系统的处理器状态以纹理的形式存储,大小为 2048x2048 像素。 仿真处理器的运行频率为 250 kHz。 除了Linux之外,模拟器还可以运行Micropython。

像素着色器形式的 RISC-V 模拟器,允许您在 VRChat 中运行 Linux

要创建支持读写的持久数据存储,一个技巧是使用绑定到着色器生成的矩形区域的 Camera 对象,并将渲染纹理的输出定向到着色器输入。 这样,在处理下一帧时,可以读取在像素着色器执行期间写入的任何像素。

应用像素着色器时,将为每个纹理像素并行启动一个单独的着色器实例。 此功能使实现变得非常复杂,并且需要单独协调整个仿真系统的状态,并将处理的像素的位置与编码在其中的 CPU 的状态或仿真系统的 RAM 的内容进行比较(每个像素可以编码 128 位信息)。 着色器代码需要包含大量检查,以简化使用 perl 预处理器 perlpp 的实现。



来源: opennet.ru

添加评论