0

我的计算着色器(用 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*方法,错误就会消失。我也尝试使用ints 而不是uints 但问题仍然存在。我做错了什么或者这可能是一个代码生成错误?

4

1 回答 1

1

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

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

于 2018-02-16T17:36:43.920 回答