From 9073002ea17d67768a8fd2018e015023c5043fb8 Mon Sep 17 00:00:00 2001 From: Lucas Date: Tue, 16 Jun 2026 16:38:47 +0800 Subject: [PATCH] Skip static cbuffer variables in explicit layout indexing --- tools/clang/lib/SPIRV/DeclResultIdMapper.cpp | 5 +++++ .../var.static-const.cbuffer.hlsl | 21 +++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 tools/clang/test/CodeGenSPIRV/var.static-const.cbuffer.hlsl diff --git a/tools/clang/lib/SPIRV/DeclResultIdMapper.cpp b/tools/clang/lib/SPIRV/DeclResultIdMapper.cpp index 1a1078bf0b..d9777a10ad 100644 --- a/tools/clang/lib/SPIRV/DeclResultIdMapper.cpp +++ b/tools/clang/lib/SPIRV/DeclResultIdMapper.cpp @@ -309,6 +309,11 @@ bool shouldSkipInStructLayout(const Decl *decl) { // Ignore embeded function decls if (isa(decl)) return true; + // Ignore static variables. They are not part of struct-like explicit + // layouts and should not consume a member index. + if (const auto *varDecl = dyn_cast(decl)) + if (varDecl->getStorageClass() == StorageClass::SC_Static) + return true; // Ignore empty decls if (isa(decl)) return true; diff --git a/tools/clang/test/CodeGenSPIRV/var.static-const.cbuffer.hlsl b/tools/clang/test/CodeGenSPIRV/var.static-const.cbuffer.hlsl new file mode 100644 index 0000000000..dd05d55815 --- /dev/null +++ b/tools/clang/test/CodeGenSPIRV/var.static-const.cbuffer.hlsl @@ -0,0 +1,21 @@ +// RUN: %dxc -T ps_6_0 -E main %s -spirv 2>&1 | FileCheck %s + +cbuffer MetadataCB { + uint m0; static const int c0 = 0; + uint m1; static const int c1 = 0; + uint m2; static const int c2 = 0; +}; + +float4 main() : SV_Target { + return float4(asfloat(m2), 0, 0, 0); +} + +// CHECK: warning: cbuffer member initializer ignored since no Vulkan equivalent +// CHECK: warning: cbuffer member initializer ignored since no Vulkan equivalent +// CHECK: warning: cbuffer member initializer ignored since no Vulkan equivalent +// CHECK: OpName %type_MetadataCB "type.MetadataCB" +// CHECK-NEXT: OpMemberName %type_MetadataCB 0 "m0" +// CHECK-NEXT: OpMemberName %type_MetadataCB 1 "m1" +// CHECK-NEXT: OpMemberName %type_MetadataCB 2 "m2" +// CHECK: %type_MetadataCB = OpTypeStruct %uint %uint %uint +// CHECK: OpAccessChain %_ptr_Uniform_uint %MetadataCB %int_2