NGG 顶点着色器
合并后的 NGG 顶点程序,包括以 S_SETPC_B64 继续的 fetch 着色器,作为一个图形阶段来翻译。导出程序保留自己的用户数据窗口。
仓库笔记截至 2026年10月10日
fetch 与导出是不同的程序
PlayStation 5 的绘制常常把顶点工作拆成 fetch 着色器和导出着色器。fetch 着色器用 S_SETPC_B64 跳到导出代码,以此结束它的属性前导。PS5PCEM 把这次继续当作同一个顶点程序的一部分,并翻译合并后的结果。
NGG 导出程序不借用几何着色器的用户数据组。它的标量寄存器从自己的用户数据快照初始化,导出程序从 s8 开始。假定资源表住在 s0:s1 是翻译器特意避免的错误。表指针来自元数据所声明的 ShaderResourceTable user-SGPR 对。
顶点属性
fetch 着色器与扩展用户数据,会和内嵌的顶点缓冲区表、顶点属性表一起解析。最多 32 个输入语义保留它们的语义索引、落入的硬件 VGPR、AGC 属性格式、字节偏移、实例速率,以及 128 位缓冲区描述符。
属性查找使用语义字节,而不是硬件映射字节。不完整的表对,或超出受支持域的索引,会在任何客户机读取之前被拒绝。顶点阶段的 PARAM 导出变成片元插值输入,后面的像素着色器由此看到这些插值量。
调用进 fetch 着色器
当调用的用户数据对仍然持有 AGC 所注册的地址时,经过验证的外部 fetch 着色器也可以从 S_SWAPPC_B64 或 S_CALL_B64 链接进来。fetch 函数体一直解码到它返回用的 S_SETPC_B64,而这次返回必须读取调用者的链接对。哪些调用合法,细节在标量调用那一页。
合并后的 NGG 翻译让三维场景能够越过过去会停住解码器的 fetch 前导。它本身并不补上缺失的像素着色器或缺失的渲染目标。
已经实现的部分
- 合并后的 NGG 顶点程序,包括以 S_SETPC_B64 结束的 fetch 前导。
- 导出程序单独的用户数据窗口。
- 最多 32 个顶点语义,带格式、偏移、实例速率和缓冲区描述符。
- 连接到片元插值输入的 PARAM 导出。
尚未实现的部分
- 返回与调用者链接对不匹配的 fetch 着色器不会被链接。
- 一般的动态调用仍然不受支持。见标量调用。
- 依赖不受支持的导出或插值量的几何,该次绘制仍然失败。
相关机制
这些页面说明什么