-
Notifications
You must be signed in to change notification settings - Fork 953
Description
glslang version: 16.2.0
SPIR-V target: 1.6 / Vulkan 1.4
Description
When a GLSL shader declares a shared (or other) array whose size is a specialization constant expression, and SpvOptions::emitNonSemanticShaderDebugInfo = true, glslang emits a DebugTypeArray instruction whose component-count operand is the result of a presumably OpSpecConstantOp rather than an OpConstant (it's the result of arithmetic on spec constants, I am not fluently in SPRIV).
The NonSemantic.Shader.DebugInfo.100 specification requires the component count to be:
an
OpConstantwith a 32- or 64-bits integer scalar type, or aDebugGlobalVariable/DebugLocalVariablewith a 32- or 64-bits unsigned integer scalar type
Minimal reproducer
#version 460
#extension GL_KHR_shader_subgroup_arithmetic : enable
layout(local_size_x_id = 0, local_size_y_id = 1, local_size_z = 1) in;
layout(constant_id = 2) const int SUBGROUP_SIZE = 32;
shared float subgroup_sums[
(gl_WorkGroupSize.x * gl_WorkGroupSize.y + SUBGROUP_SIZE - 1) / SUBGROUP_SIZE
];
void main() {}Compile with emitNonSemanticShaderDebugInfo enabled, then validate:
Error
NonSemantic.Shader.DebugInfo.100 DebugTypeArray: Component Count must be OpConstant
with a 32- or 64-bits integer scalar type or DebugGlobalVariable or DebugLocalVariable
with a 32- or 64-bits unsigned integer scalar type
%97 = OpExtInst %void %1 DebugTypeArray %39 %95
Expected behaviour
glslang should either:
- Use the spec constant's default value as a plain
OpConstantfor theDebugTypeArraydimension, or - Emit a
DebugGlobalVariable/DebugLocalVariablereference as the dimension, or - Omit the
DebugTypeArrayfor arrays whose size cannot be expressed as a plain constant
Note
I reproduced it with https://github.com/LDAP/merian-example-sum at commit ef51b2b58db222db226bebe57b93657c40f679ef with glslang lib installed. I am not very familiar with SPIRV, some of the above are my assumptions on how this works.