升级到 LunarG SDK 1.0.68.0 后 InterlockedMax 出现 SPIR-V 错误

SPIR-V error with InterlockedMax after upgrading to LunarG SDK 1.0.68.0

我的计算着色器(用 HLSL 编写)编译并使用早期的 SDK 1.0.65.0。我更新到 1.0.68.0 并重新编译它,现在调用 vkCreateShaderModule:

时出现此错误

Vulkan error: [SC], code: 5: SPIR-V module not valid: AtomicSMax: expected Result Type to be int scalar type

我确认错误来自我的着色器中的这个函数:

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.0.68.0\Bin\glslangValidator -D -V -S comp -e CSMain LightCuller.hlsl -o LightCuller.spv

如果我不使用那些 Interlocked* 方法,错误就会消失。 我也尝试使用 ints 而不是 uints 但问题仍然存在。我做错了什么或者这可能是代码生成错误?

如果 SPIR-V 验证器说 glslangValidator 生成的某些内容无效,那么这要么是 glslangValidator 错误,要么是 SPIR-V 验证器错误。可能最好在 https://github.com/KhronosGroup/glslang 提交错误;如果那里的维护者认为他们在做正确的事,他们会跟进 spirv-tools 人。

虽然看HLSL InterlockedMax docs,它不是应该有三个参数吗?此处的 glslangValidator 错误可能只是未能针对无效输入发出错误。但我不是 HLSL 专家,也许还有其他一些带有两个参数和一个 return 值的变体。