我的计算着色器(用 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
s 而不是uint
s 但问题仍然存在。我做错了什么或者这可能是一个代码生成错误?