我的计算着色器(用HLSL编写)编译并使用早期的SDK 1.0.65.0。我更新到1.0.68.0并重新编译它,现在我在调用vkCreateShaderModule
时出现此错误:
Vulkan错误:[SC],代码:5:SPIR-V模块无效:AtomicSMax: 预期结果类型为int标量类型
我验证了错误来自我的着色器中的此函数:
groupshared uint ldsZMax;
groupshared uint ldsZMin;
...
void CalculateMinMaxDepthInLds( uint3 globalThreadIdx, uint depthBufferSampleIdx )
{
float viewPosZ = depthTexture.Load( uint3( globalThreadIdx.x, globalThreadIdx.y, 0 ) ).x;
uint z = asuint( viewPosZ );
if (viewPosZ != 0.f)
{
InterlockedMax( ldsZMax, z );
InterlockedMin( ldsZMin, z );
}
}
我用这个命令编译着色器:
C:\VulkanSDK\1.0.68.0\Bin\glslangValidator -D -V -S comp -e CSMain LightCuller.hlsl -o LightCuller.spv
如果我不使用这些Interlocked*
方法,错误就会消失。
我还尝试使用int
而不是uint
,但问题仍然存在。我做错了什么或者这可能是一个codegen错误?
答案 0 :(得分:1)
如果SPIR-V验证器说glslangValidator生成的内容无效,那么这可能是glslangValidator错误或SPIR-V验证程序错误。可能最好在https://github.com/KhronosGroup/glslang提交错误;如果那里的维护者认为他们正在做正确的事情,他们会跟进spirv-tools人员。
虽然看HLSL InterlockedMax docs,但它不应该有三个参数吗?这里的glslangValidator错误可能只是无法为无效输入发出错误。但我不是HLSL专家,可能还有一些其他变量有两个参数和一个返回值。