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

时间:2018-02-16 16:38:32

标签: hlsl vulkan compute-shader spir-v

我的计算着色器(用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错误?

1 个答案:

答案 0 :(得分:1)

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

虽然看HLSL InterlockedMax docs,但它不应该有三个参数吗?这里的glslangValidator错误可能只是无法为无效输入发出错误。但我不是HLSL专家,可能还有一些其他变量有两个参数和一个返回值。