Skip to content

Commit 48d6e3c

Browse files
authored
[SPIRV] Get alignemnt from pointee type for vk::BufferPoitner store (#7501)
A small mistake for stores to vk:BufferPointer when storing directly to the return value of `get()`. We were getting the alignment of the pointer itself, which is always 8 instead of the type pointed to. I tested loads, and it does not have the same problem. Fixes #7459
1 parent 72149fa commit 48d6e3c

File tree

3 files changed

+11
-3
lines changed

3 files changed

+11
-3
lines changed

tools/clang/lib/SPIRV/SpirvBuilder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ SpirvStore *SpirvBuilder::createStore(SpirvInstruction *address,
313313
AlignmentSizeCalculator alignmentCalc(astContext, spirvOptions);
314314
uint32_t align, size, stride;
315315
std::tie(align, size) = alignmentCalc.getAlignmentAndSize(
316-
address->getAstResultType(), address->getLayoutRule(), llvm::None,
316+
source->getAstResultType(), address->getLayoutRule(), llvm::None,
317317
&stride);
318318
instruction->setAlignment(align);
319319
}

tools/clang/test/CodeGenSPIRV/vk.buffer-pointer.read.hlsl

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,18 @@ struct TestPushConstant_t
3636
float4 MainPs(void) : SV_Target0
3737
{
3838
float4 vTest = g_PushConstants.m_nBufferDeviceAddress.Get().g_vTestFloat4;
39-
return vTest;
39+
float f = vk::BufferPointer<float,4>(0xdeadbeefull).Get();
40+
return vTest+f;
4041
}
4142

4243
// CHECK: [[FUN]] = OpFunction
4344
// CHECK: [[X1:%[_0-9A-Za-z]*]] = OpAccessChain [[PPGLOBALS]] [[GPC]] [[S0]]
4445
// CHECK: [[X2:%[_0-9A-Za-z]*]] = OpLoad [[PGLOBALS]] [[X1]]
4546
// CHECK: [[X3:%[_0-9A-Za-z]*]] = OpAccessChain [[PV4FLOAT2]] [[X2]] [[S1]]
4647
// CHECK: [[X4:%[_0-9A-Za-z]*]] = OpLoad [[V4FLOAT]] [[X3]] Aligned 16
47-
// CHECK: OpStore [[OUT]] [[X4]]
48+
// CHECK: [[TEMP_PTR:%[_0-9A-Za-z]*]] = OpConvertUToPtr %_ptr_PhysicalStorageBuffer_float %ulong_3735928559
49+
// CHECK: [[LD:%[_0-9A-Za-z]*]] = OpLoad %float [[TEMP_PTR]] Aligned 4
50+
// CHECK: [[CONSTRUCT:%[_0-9A-Za-z]*]] = OpCompositeConstruct [[V4FLOAT]] [[LD]] [[LD]] [[LD]] [[LD]]
51+
// CHECK: [[ADD:%[_0-9A-Za-z]*]] = OpFAdd [[V4FLOAT]] [[X4]] [[CONSTRUCT]]
52+
// CHECK: OpStore [[OUT]] [[ADD]]
4853
// CHECK: OpFunctionEnd

tools/clang/test/CodeGenSPIRV/vk.buffer-pointer.write.hlsl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ float4 MainPs(void) : SV_Target0
4040
{
4141
float4 vTest = float4(1.0,0.0,0.0,0.0);
4242
g_PushConstants.m_nBufferDeviceAddress.Get().g_vTestFloat4 = vTest;
43+
vk::BufferPointer<float,4>(0xdeadbeefull).Get() = 4.5f;
4344
return vTest;
4445
}
4546

@@ -48,5 +49,7 @@ float4 MainPs(void) : SV_Target0
4849
// CHECK: [[X2:%[_0-9A-Za-z]*]] = OpLoad [[PGLOBALS]] [[X1]]
4950
// CHECK: [[X3:%[_0-9A-Za-z]*]] = OpAccessChain [[PV4FLOAT2]] [[X2]] [[S1]]
5051
// CHECK: OpStore [[X3]] [[CV4FLOAT]] Aligned 16
52+
// CHECK: [[TEMP_PTR:%[_0-9A-Za-z]*]] = OpConvertUToPtr %_ptr_PhysicalStorageBuffer_float %ulong_3735928559
53+
// CHECK: OpStore [[TEMP_PTR]] %float_4_5 Aligned 4
5154
// CHECK: OpStore [[OUT]] [[CV4FLOAT]]
5255
// CHECK: OpFunctionEnd

0 commit comments

Comments
 (0)