Skip to content

DebugTypeArray emitted with OpSpecConstantOp dimension violates NonSemantic.Shader.DebugInfo.100 spec #4186

@LDAP

Description

@LDAP

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 OpConstant with a 32- or 64-bits integer scalar type, or a DebugGlobalVariable / DebugLocalVariable with 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 OpConstant for the DebugTypeArray dimension, or
  • Emit a DebugGlobalVariable / DebugLocalVariable reference as the dimension, or
  • Omit the DebugTypeArray for 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.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions