RDNA2 着色器到 SPIR-V
PlayStation 5 着色器是 RDNA2 机器码。PS5PCEM 解码 GFX10 各族,建立控制流图,并把受支持的操作降为供 Vulkan 使用的 SPIR-V 1.5。
仓库笔记截至 2026年10月10日
解码
前端识别标量的 SOP1、SOP2、SOPK、SOPC、SOPP 和 SMEM 编码,向量的 VOP1、VOP2、VOP3、VOP3P、VOPC 和 VINTRP 编码,以及 MUBUF、MTBUF、FLAT、DS、MIMG 和 EXP。架构上的单字和双字包体、可选字面量以及 MIMG 的 NSA 地址字都会保留,因此后面一个不受支持的操作码不会使流失去同步。
已知族内部无法识别的操作码会变成一条不受支持的指令,它仍然携带自己的族、数字操作码、原始字和一个原因。SDWA 和 DPP 扩展字保留它们的选择器、修饰符和 lane 掩码。解码器不会给它不认识的操作码改名。
控制流与带类型的 IR
直接分支目标把程序拆成基本块。前向合并、嵌套区域和后向边分开记录。现行翻译器可以从已解码指令生成代码。设置 PS5_GPU_SHADER_IR=1 会选择合法化后的带类型 IR。设置 PS5_GPU_SSA=1 会增加 phi 和 def-use 状态、常量折叠,以及迭代的死代码消除。
无环选择变成结构化的 SPIR-V 合并,汇合处带有 phi 值。自然循环变成循环合并。不可约控制流变成块索引分派器,并保留 VCC 和 EXEC 谓词,因此本应跳过某次写入的 lane 仍然会跳过它。EXEC 掩码在一个 SPIR-V 块内部被复用,并在每个标签处丢弃,因为分支一侧的值并不支配另一侧。
10 月 9 日的套件测到了什么
10 月 9 日的标量调用检查点通过了 259 项 GPU 分析测试中的 259 项,以及 232 项 Vulkan 测试中的 232 项。RDNA2 套件通过了 281 项中的 271 项,失败的仍是原有的那十项,并有一处已报告的泄漏。这些指令探测并不能为游戏确立新的帧率。
多纹素图像加载、水平 gather、NGG fetch 着色器和有界标量调用作为各自的路径实现,并在各自的页面上说明。不在已测量集合里的存储以及描述符组合仍然不受支持。
已经实现的部分
- 解码 GFX10 的标量、向量、内存、图像和导出各族,包括字面量和 NSA 字。
- 结构化选择、自然循环,以及为不可约控制流保留 lane 掩码的分派器。
- 可选的带类型 IR 和 SSA 清理,由环境变量选择。
- 供受支持的 ALU、内存、图像、插值和导出操作使用的 SPIR-V 1.5。
尚未实现的部分
- RDNA2 套件原有的十个失败仍然存在,另有一处已报告的泄漏。
- 不受支持的操作码会停住这次下沉。它不会被替换成猜测的操作。
- 指令测试不是帧率结果。
相关机制
这些页面说明什么