Skip to content

Commit 4fcf67f

Browse files
authored
[spirv] Fixes microsoft#7535 (vk::BufferPointer alignment issue). (microsoft#7571)
1 parent b331216 commit 4fcf67f

File tree

7 files changed

+30
-40
lines changed

7 files changed

+30
-40
lines changed

tools/clang/lib/SPIRV/SpirvBuilder.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,10 +205,17 @@ SpirvInstruction *SpirvBuilder::createLoad(QualType resultType,
205205
instruction->setRValue(true);
206206

207207
if (pointer->getStorageClass() == spv::StorageClass::PhysicalStorageBuffer) {
208-
AlignmentSizeCalculator alignmentCalc(astContext, spirvOptions);
209-
uint32_t align, size, stride;
210-
std::tie(align, size) = alignmentCalc.getAlignmentAndSize(
211-
resultType, pointer->getLayoutRule(), llvm::None, &stride);
208+
QualType pointerType = pointer->getAstResultType();
209+
uint32_t align = 0;
210+
if (!pointerType.isNull() && hlsl::IsVKBufferPointerType(pointerType)) {
211+
align = hlsl::GetVKBufferPointerAlignment(pointerType);
212+
}
213+
if (!align) {
214+
AlignmentSizeCalculator alignmentCalc(astContext, spirvOptions);
215+
uint32_t stride;
216+
std::tie(align, std::ignore) = alignmentCalc.getAlignmentAndSize(
217+
resultType, pointer->getLayoutRule(), llvm::None, &stride);
218+
}
212219
instruction->setAlignment(align);
213220
}
214221

tools/clang/lib/SPIRV/SpirvEmitter.cpp

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11179,36 +11179,19 @@ SpirvEmitter::processIntrinsicPointerCast(const CallExpr *callExpr,
1117911179

1118011180
SpirvInstruction *SpirvEmitter::processIntrinsicGetBufferContents(
1118111181
const CXXMemberCallExpr *callExpr) {
11182-
LowerTypeVisitor lowerTypeVisitor(astContext, spvContext, spirvOptions,
11183-
spvBuilder);
11184-
Expr *obj = callExpr->getImplicitObjectArgument();
11185-
SpirvInstruction *bufferPointer = doExpr(obj);
11182+
SpirvInstruction *bufferPointer =
11183+
doExpr(callExpr->getImplicitObjectArgument());
1118611184
if (!bufferPointer)
1118711185
return nullptr;
11188-
if (bufferPointer->isRValue()) {
11189-
bufferPointer->setRValue(false);
11190-
bufferPointer->setStorageClass(spv::StorageClass::PhysicalStorageBuffer);
11191-
bufferPointer->setLayoutRule(spirvOptions.sBufferLayoutRule);
11192-
return bufferPointer;
11193-
}
11194-
11195-
unsigned align = hlsl::GetVKBufferPointerAlignment(obj->getType());
11196-
lowerTypeVisitor.visitInstruction(bufferPointer);
11197-
11198-
const SpirvPointerType *bufferPointerType =
11199-
dyn_cast<SpirvPointerType>(bufferPointer->getResultType());
11200-
SpirvLoad *retVal =
11201-
spvBuilder.createLoad(bufferPointerType->getPointeeType(), bufferPointer,
11202-
callExpr->getLocStart());
11203-
if (!align) {
11204-
QualType bufferType = hlsl::GetVKBufferPointerBufferType(obj->getType());
11205-
AlignmentSizeCalculator alignmentCalc(astContext, spirvOptions);
11206-
uint32_t stride;
11207-
std::tie(align, std::ignore) = alignmentCalc.getAlignmentAndSize(
11208-
bufferType, retVal->getLayoutRule(), llvm::None, &stride);
11209-
}
11210-
retVal->setAlignment(align);
11186+
11187+
SpirvInstruction *retVal =
11188+
bufferPointer->isRValue()
11189+
? bufferPointer
11190+
: spvBuilder.createLoad(bufferPointer->getAstResultType(),
11191+
bufferPointer, callExpr->getLocStart());
1121111192
retVal->setRValue(false);
11193+
retVal->setStorageClass(spv::StorageClass::PhysicalStorageBuffer);
11194+
retVal->setLayoutRule(spirvOptions.sBufferLayoutRule);
1121211195
return retVal;
1121311196
}
1121411197

tools/clang/test/CodeGenSPIRV/vk.buffer-pointer.alias.cs.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ void main() {
2020
foo(rwbuf[0].Get());
2121
}
2222

23-
// CHECK: [[L0:%[_0-9A-Za-z]*]] = OpLoad %{{[_0-9A-Za-z]*}} %{{[_0-9A-Za-z]*}} Aligned 8
23+
// CHECK: [[L0:%[_0-9A-Za-z]*]] = OpLoad %{{[_0-9A-Za-z]*}} %{{[_0-9A-Za-z]*}}
2424
// CHECK: [[L1:%[_0-9A-Za-z]*]] = OpLoad %{{[_0-9A-Za-z]*}} [[L0]] Aligned 8
2525
// CHECK: [[L2:%[_0-9A-Za-z]*]] = OpAccessChain %{{[_0-9A-Za-z]*}} [[L1]] %int_0
2626
// CHECK: OpStore [[L2]] %int_1 Aligned 4

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,10 @@ float4 MainPs(void) : SV_Target0
6262
// CHECK: [[X4:%[_0-9A-Za-z]*]] = OpLoad [[PGS]] [[X3]]
6363
// CHECK: OpStore [[BP1]] [[X4]]
6464
// CHECK: [[X5:%[_0-9A-Za-z]*]] = OpLoad [[V4FLOAT]] [[VTEST]]
65-
// CHECK: [[X6:%[_0-9A-Za-z]*]] = OpLoad [[PGS]] [[BP0]] Aligned 16
65+
// CHECK: [[X6:%[_0-9A-Za-z]*]] = OpLoad [[PGS]] [[BP0]]
6666
// CHECK: [[X7:%[_0-9A-Za-z]*]] = OpAccessChain [[PBV4FLOAT]] [[X6]] [[I1]]
6767
// CHECK: OpStore [[X7]] [[X5]] Aligned 16
68-
// CHECK: [[X8:%[_0-9A-Za-z]*]] = OpLoad [[PGS]] [[BP1]] Aligned 16
68+
// CHECK: [[X8:%[_0-9A-Za-z]*]] = OpLoad [[PGS]] [[BP1]]
6969
// CHECK: [[X9:%[_0-9A-Za-z]*]] = OpAccessChain [[PBV4FLOAT]] [[X8]] [[I1]]
7070
// CHECK: [[X10:%[_0-9A-Za-z]*]] = OpLoad [[V4FLOAT]] [[X9]] Aligned 16
7171
// CHECK: OpReturnValue [[X10]]

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ void main()
2929
uint u0, u1;
3030

3131
// CHECK: [[X1:%[_0-9]+]] = OpAccessChain %{{[_0-9A-Za-z]*}} [[PC]] [[I0]]
32-
// CHECK: [[X2:%[_0-9]+]] = OpLoad [[PS]] [[X1]] Aligned 4
32+
// CHECK: [[X2:%[_0-9]+]] = OpLoad [[PS]] [[X1]]
3333
// CHECK: [[X3:%[_0-9]+]] = OpAccessChain [[PU]] [[X2]] [[I0]]
3434
// CHECK: [[X4:%[_0-9]+]] = OpLoad [[UINT]] [[IN]]
3535
// CHECK: [[X5:%[_0-9]+]] = OpAtomicExchange [[UINT]] [[X3]] [[U1]] [[U0]] [[X4]]

tools/clang/test/CodeGenSPIRV/vk.buffer-pointer.from-uint.hlsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ void main() {
3737
// CHECK: [[TEST:%[_0-9A-Za-z]*]] = OpVariable [[PFPPUINT]] Function
3838
// CHECK: [[X1:%[_0-9A-Za-z]*]] = OpConvertUToPtr [[PPUINT]]
3939
// CHECK: OpStore [[TEST]] [[X1]]
40-
// CHECK: [[X2:%[_0-9A-Za-z]*]] = OpLoad [[PPUINT]] [[TEST]] Aligned 32
41-
// CHECK: [[X3:%[_0-9A-Za-z]*]] = OpLoad [[UINT]] [[X2]] Aligned 4
40+
// CHECK: [[X2:%[_0-9A-Za-z]*]] = OpLoad [[PPUINT]] [[TEST]]
41+
// CHECK: [[X3:%[_0-9A-Za-z]*]] = OpLoad [[UINT]] [[X2]] Aligned 32
4242
// CHECK: [[X4:%[_0-9A-Za-z]*]] = OpAccessChain [[PUUINT]] [[OUTPUT]] [[I0]] [[U0]]
4343
// CHECK: OpStore [[X4]] [[X3]]
4444
// CHECK: OpReturn

tools/clang/test/CodeGenSPIRV/vk.buffer-pointer.linked-list.hlsl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ float4 MainPs(void) : SV_Target0
7676
// CHECK: [[X1:%[_0-9A-Za-z]*]] = OpAccessChain [[PPBLOCK1]] [[GPC]] [[S0]]
7777
// CHECK: [[X2:%[_0-9A-Za-z]*]] = OpLoad [[PBLOCK]] [[X1]]
7878
// CHECK: OpStore [[GP]] [[X2]]
79-
// CHECK: [[X3:%[_0-9A-Za-z]*]] = OpLoad [[PBLOCK]] [[GP]] Aligned 32
79+
// CHECK: [[X3:%[_0-9A-Za-z]*]] = OpLoad [[PBLOCK]] [[GP]]
8080
// CHECK: [[X4:%[_0-9A-Za-z]*]] = OpAccessChain [[PPBLOCK2]] [[X3]] [[S1]]
81-
// CHECK: [[X5:%[_0-9A-Za-z]*]] = OpLoad [[PBLOCK]] [[X4]] Aligned 8
81+
// CHECK: [[X5:%[_0-9A-Za-z]*]] = OpLoad [[PBLOCK]] [[X4]] Aligned 32
8282
// CHECK: OpStore [[GP]] [[X5]]
8383
// CHECK: [[X6:%[_0-9A-Za-z]*]] = OpLoad [[PBLOCK]] [[GP]]
8484
// CHECK: [[X7:%[_0-9A-Za-z]*]] = OpConvertPtrToU [[ULONG]] [[X6]]
@@ -94,7 +94,7 @@ float4 MainPs(void) : SV_Target0
9494
// CHECK: [[IF_TRUE]] = OpLabel
9595
// CHECK: OpReturnValue [[CV4FLOAT]]
9696
// CHECK: [[IF_MERGE]] = OpLabel
97-
// CHECK: [[X13:%[_0-9A-Za-z]*]] = OpLoad [[PBLOCK]] [[GP]] Aligned 32
97+
// CHECK: [[X13:%[_0-9A-Za-z]*]] = OpLoad [[PBLOCK]] [[GP]]
9898
// CHECK: [[X14:%[_0-9A-Za-z]*]] = OpAccessChain [[PV4FLOAT2]] [[X13]] [[S0]]
9999
// CHECK: [[X15:%[_0-9A-Za-z]*]] = OpLoad [[V4FLOAT]] [[X14]] Aligned 16
100100
// CHECK: OpReturnValue [[X15]]

0 commit comments

Comments
 (0)