升级到 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*
方法,错误就会消失。
我也尝试使用 int
s 而不是 uint
s 但问题仍然存在。我做错了什么或者这可能是代码生成错误?
如果 SPIR-V 验证器说 glslangValidator 生成的某些内容无效,那么这要么是 glslangValidator 错误,要么是 SPIR-V 验证器错误。可能最好在 https://github.com/KhronosGroup/glslang 提交错误;如果那里的维护者认为他们在做正确的事,他们会跟进 spirv-tools 人。
虽然看HLSL InterlockedMax docs,它不是应该有三个参数吗?此处的 glslangValidator 错误可能只是未能针对无效输入发出错误。但我不是 HLSL 专家,也许还有其他一些带有两个参数和一个 return 值的变体。
我的计算着色器(用 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*
方法,错误就会消失。
我也尝试使用 int
s 而不是 uint
s 但问题仍然存在。我做错了什么或者这可能是代码生成错误?
如果 SPIR-V 验证器说 glslangValidator 生成的某些内容无效,那么这要么是 glslangValidator 错误,要么是 SPIR-V 验证器错误。可能最好在 https://github.com/KhronosGroup/glslang 提交错误;如果那里的维护者认为他们在做正确的事,他们会跟进 spirv-tools 人。
虽然看HLSL InterlockedMax docs,它不是应该有三个参数吗?此处的 glslangValidator 错误可能只是未能针对无效输入发出错误。但我不是 HLSL 专家,也许还有其他一些带有两个参数和一个 return 值的变体。