我正在为 SPIR-V 着色器编写二进制处理模块,以解决由于驱动程序错误而导致的 float4x3[6] 矩阵的对齐问题。现在我有:
- 注入必要的适当 OpTypes 和 OpTypePointers。
- 处理二进制文件以将常量缓冲区成员从 float4x3[6] 更改为 vec4[18]
- 注入函数将 vec4[18] 正确解包到 float4x3[6] 中,接受 vec4[18] 作为指向统一数组 18 的指针。
- 创建了私有存储限定符矩阵解包目标作为 OpVariables。(SPIR-V 中的私有只是意味着调用级全局......)。
- 注入了关于复合提取和构造的序言来调用我的新函数。(因为我看到我们需要将参数从常量缓冲区复制到函数,所以这就是我所做的)。
- 从入口点调用该函数,以便每个 float4x3[6] 成员在 main() 启动时准备好解包矩阵。
- 更改了引用常量缓冲区中给定成员的 OpAccessChain 操作,并将它们与引用我的新私有目标的访问链交换。
但现在我遇到了麻烦。看起来 SPIR-V 中的函数可以接受 Private 或 Function 存储限定符指针。不是都。有什么办法可以告诉 SPIR-V “是的,你可以在这里将这两个存储类作为参数转储”?
或者我是否需要重新设计我的解决方案以利用函数存储类矩阵目标,并在每次将它们用于新函数时注入它们并调用以解压它们?这似乎不太优雅,因为那时可能会有更多的解包操作。而且更轻松,因为我必须分别扫描每个 OpFunction 块并将带有函数存储的 OpVariables 注入使用矩阵的每个块中。
我的问题是,在完成所有这些机器之后,我的目标是作为私有存储持续时间的 OpTypePointer 生活的。因此我不能在从 HLSL 生成的任何 SPIR-V 函数中使用它们,因为它们采用函数持续时间的 OpTypePointers。我的解包函数是唯一的例外,因为我直接将它逐字节地注入到 SPIR-V asm 中,并且能够精确地调整标头中的 OpFunctionParameters。