标量着色器调用
S_SWAPPC_B64 和 S_CALL_B64 保存完整的返回地址,并运行一个有界的局部子程序,包括位于 ENDPGM 之后的被调用者。经过验证的 AGC fetch 着色器可以按同样的方式链接。
仓库笔记截至 2026年10月10日
调用与返回
SOP1 操作码 0x21 是 S_SWAPPC_B64。SOPK 操作码 0x16 是 S_CALL_B64,目标在 PC + 4 + sign_extend(SIMM16) * 4,其中包括向后的调用。两者都把下一条指令的地址写入目的地 SGPR 对。匹配的 S_SETPC_B64 返回到那里。CALL 不改动 SCC 和 EXEC。
目的地为空的 SWAPPC 仍然是既有的 S_SETPC_B64 继续。局部 SWAPPC 目标可以由 GETPC 加上或减去一个全宽立即数来解析。即使该指令也写入链接寄存器,目标仍会被捕获。位于 ENDPGM 之后的被调用者会一直解码到它匹配的返回,并处在分配和指令边界之内。普通的硬件继续仍然会在尾随元数据之前停下。
调用如何下沉
控制流图增加显式的调用边和返回边。被调用者共享调用者的寄存器状态,并使用有界的 SPIR-V 分派器。不受支持的调用不能落入线性控制流路径。主机侧资源发现会跟随调用和返回,因此在被调用者内部初始化的描述符仍然可见。
每一个受支持的调用拥有一对不同的、偶对齐的 SGPR,范围从 s0:s1 到 s104:s105,并且恰好有一个匹配的返回。被调用者按检查器所允许的方式嵌套或顺序排列。目的地是任意运行时值的一般动态目标仍然不受支持。
fetch 着色器与探测
当调用未被改动的用户数据对与 AGC 所注册的地址匹配时,外部 fetch 着色器会被链接。fetch 函数体解码到它返回用的 SETPC,而这个 SETPC 必须读取调用者的链接对。分析缓存把普通程序和 fetch 函数体区分开,因此较旧的 fetch 插入不能覆盖局部子程序的返回。
一次 42 次分派的 GPU 探测检查 21,504 个字。10 月 9 日的报告并不声称仅凭这些调用就有新的游戏里程碑或新的帧率。
已经实现的部分
- 带完整返回地址和匹配 S_SETPC_B64 的 S_SWAPPC_B64 与 S_CALL_B64。
- 嵌套的被调用者,以及放在 ENDPGM 之后、仍在既有边界内的被调用者。
- 链接经过验证的 AGC fetch 着色器,其返回读取调用者的链接。
- 覆盖 21,504 个字的 42 次分派探测。
尚未实现的部分
- 一般的动态调用目标不受支持。
- 一次调用需要一对偶对齐的链接寄存器,以及一个匹配的返回。
- 这次探测不是每秒帧数结果。
相关机制
这些页面说明什么