From 824dd2a36d932d8b918a7761e38661cd1fa7d1ef Mon Sep 17 00:00:00 2001 From: Steven Perron Date: Fri, 28 Nov 2025 13:13:14 -0500 Subject: [PATCH 1/2] [SPIRV] Fix layout rule for BufferPointer pointee type When picking the layout rule for the Pointee type of a BufferPointer, we are using the layout for the object containing the pointer, but that is incorrect. The layout for the PhysicalStorageBuffer should always follow the storage buffer layout rules. Fixes #7893 --- external/SPIRV-Headers | 2 +- external/SPIRV-Tools | 2 +- tools/clang/lib/SPIRV/LowerTypeVisitor.cpp | 6 ++-- ...uffer-pointer.different-storage-class.hlsl | 29 +++++++++++++++++++ 4 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 tools/clang/test/CodeGenSPIRV/vk.buffer-pointer.different-storage-class.hlsl diff --git a/external/SPIRV-Headers b/external/SPIRV-Headers index b824a462d4..01e0577914 160000 --- a/external/SPIRV-Headers +++ b/external/SPIRV-Headers @@ -1 +1 @@ -Subproject commit b824a462d4256d720bebb40e78b9eb8f78bbb305 +Subproject commit 01e0577914a75a2569c846778c2f93aa8e6feddd diff --git a/external/SPIRV-Tools b/external/SPIRV-Tools index 262bdab481..09ac18fad6 160000 --- a/external/SPIRV-Tools +++ b/external/SPIRV-Tools @@ -1 +1 @@ -Subproject commit 262bdab48146c937467f826699a40da0fdfc0f1a +Subproject commit 09ac18fad693787b7b1f1e4881877de866751732 diff --git a/tools/clang/lib/SPIRV/LowerTypeVisitor.cpp b/tools/clang/lib/SPIRV/LowerTypeVisitor.cpp index 45d04e8160..b660ea70df 100644 --- a/tools/clang/lib/SPIRV/LowerTypeVisitor.cpp +++ b/tools/clang/lib/SPIRV/LowerTypeVisitor.cpp @@ -836,12 +836,10 @@ const SpirvType *LowerTypeVisitor::lowerVkTypeInVkNamespace( } QualType realType = hlsl::GetHLSLResourceTemplateParamType(type); - if (rule == SpirvLayoutRule::Void) { - rule = spvOptions.sBufferLayoutRule; - } visitedTypeStack.push_back(type); - const SpirvType *spirvType = lowerType(realType, rule, llvm::None, srcLoc); + const SpirvType *spirvType = + lowerType(realType, spvOptions.sBufferLayoutRule, llvm::None, srcLoc); const auto *pointerType = spvContext.getPointerType( spirvType, spv::StorageClass::PhysicalStorageBuffer); spvContext.registerForwardReference(type, pointerType); diff --git a/tools/clang/test/CodeGenSPIRV/vk.buffer-pointer.different-storage-class.hlsl b/tools/clang/test/CodeGenSPIRV/vk.buffer-pointer.different-storage-class.hlsl new file mode 100644 index 0000000000..d6762b4915 --- /dev/null +++ b/tools/clang/test/CodeGenSPIRV/vk.buffer-pointer.different-storage-class.hlsl @@ -0,0 +1,29 @@ +// RUN: %dxc -spirv -E main -T cs_6_7 %s | FileCheck %s + + +struct Foo { + int val[4]; +}; + +// CHECK: OpDecorate [[ARRAY_INT_4:%[_0-9A-Za-z]*]] ArrayStride 4 +// CHECK: [[TYPE_FOO:%[_0-9A-Za-z]*]] = OpTypeStruct [[ARRAY_INT_4]] +// CHECK: [[PTR_PHYS_BUF_FOO:%[_0-9A-Za-z]*]] = OpTypePointer PhysicalStorageBuffer [[TYPE_FOO]] +// CHECK: [[TYPE_TEST_STRUCT:%[_0-9A-Za-z]*]] = OpTypeStruct [[PTR_PHYS_BUF_FOO]] %_ptr_PhysicalStorageBuffer_int +// CHECK: [[PTR_UNIFORM_TYPE_TEST:%[_0-9A-Za-z]*]] = OpTypePointer Uniform [[TYPE_TEST_STRUCT]] +// CHECK: [[TEST_VAR:%[_0-9A-Za-z]*]] = OpVariable [[PTR_UNIFORM_TYPE_TEST]] Uniform +cbuffer Test { + // The layout of `Foo` for the Buffer pointer should be the layout for + // the storage buffer, even if the pointer is in a cbuffer. + vk::BufferPointer fooBuf; + vk::BufferPointer outBuf; +}; + + + +[numthreads(256, 1, 1)] +void main(in uint3 threadId : SV_DispatchThreadID) { +// CHECK: [[FOO_BUF_ACCESS_CHAIN:%[_0-9A-Za-z]*]] = OpAccessChain %_ptr_Uniform__ptr_PhysicalStorageBuffer_Foo [[TEST_VAR]] %int_0 +// CHECK: [[FOO_BUF_LOAD:%[_0-9A-Za-z]*]] = OpLoad %_ptr_PhysicalStorageBuffer_Foo [[FOO_BUF_ACCESS_CHAIN]] + int val = fooBuf.Get().val[0]; + outBuf.Get() = val; +} From c866de06ea45fe8eab75b05bf076ad61c9e9b49a Mon Sep 17 00:00:00 2001 From: Steven Perron Date: Mon, 1 Dec 2025 12:16:56 -0500 Subject: [PATCH 2/2] revert submodule change. --- external/SPIRV-Headers | 2 +- external/SPIRV-Tools | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/external/SPIRV-Headers b/external/SPIRV-Headers index 01e0577914..b824a462d4 160000 --- a/external/SPIRV-Headers +++ b/external/SPIRV-Headers @@ -1 +1 @@ -Subproject commit 01e0577914a75a2569c846778c2f93aa8e6feddd +Subproject commit b824a462d4256d720bebb40e78b9eb8f78bbb305 diff --git a/external/SPIRV-Tools b/external/SPIRV-Tools index 09ac18fad6..262bdab481 160000 --- a/external/SPIRV-Tools +++ b/external/SPIRV-Tools @@ -1 +1 @@ -Subproject commit 09ac18fad693787b7b1f1e4881877de866751732 +Subproject commit 262bdab48146c937467f826699a40da0fdfc0f1a