我试图将内核作为vec4的直接数组存储在GLSL代码中,如下所示:
vec4 kernel1[512] = vec4[512](
vec4(0,0,0,0), ...);
vec4 kernel2[512] = vec4[512](
vec4(0,0,0,0), ...);
vec4 identity matrix[4] = vec4[4](...);
所有这些都用在GLSL代码中。问题是现在,vulkan无法使用着色器和调试扩展报告以下错误消息:
XXXXX超出常量寄存器限制;编译程序需要1024个以上的寄存器
我的dx11代码中有相同的设置,一切正常。我想知道是否有一个扩展允许我使用更多的1024个寄存器。如果你知道另一个解决方案在vulkan中有相同的设置,我将不胜感激。
答案 0 :(得分:2)
为此着色器生成的SPIR-V是一个非常直接的代码转换。驱动程序的编译器需要在某处存储至少1024个vec4文字值来创建动态数组。可以将其视为存储在代码段中的数据。显然这超出了Nvidia的一些内部限制(可能无效,但你不想这样做,见下文)。
我没有方便的DX11 fxc,但是如果我没记错,它会采用这样的代码并将kernel1和kernel2声明移动到本质上为hlsl编译器保留的隐藏常量缓冲区。这是由前端编译器完成的,而不是驱动程序的编译器(尽管驱动程序可以将保留的常量缓冲区映射到代码段数据,或者映射到普通的常量缓冲区插槽,或其他任何东西,无论它想要什么)。
Vulkan和SPIR-V没有为编译器保留的统一(常量)缓冲区绑定,但您希望HLSL编译器正在做同样的事情。只需用统一缓冲区声明替换这些声明,然后通过API将数据放入这些缓冲区中。