summaryrefslogtreecommitdiff
path: root/source/slang/slang-ir-lower-buffer-element-type.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-02-05 22:36:02 -0800
committerGitHub <noreply@github.com>2024-02-05 22:36:02 -0800
commit23c65b873f8002b74d60f61cacb3614da60e078d (patch)
tree9629ffeed059cd67e70d5a98427922697ba46543 /source/slang/slang-ir-lower-buffer-element-type.cpp
parentaf035fb6da2a19ccc647515e9b1edf35777f8c89 (diff)
Add per-buffer data layout control. (#3551)
* Add per-buffer data layout control. Fixes #3534. * Fixes. * Robustness. * Update test. * Fix.
Diffstat (limited to 'source/slang/slang-ir-lower-buffer-element-type.cpp')
-rw-r--r--source/slang/slang-ir-lower-buffer-element-type.cpp30
1 files changed, 28 insertions, 2 deletions
diff --git a/source/slang/slang-ir-lower-buffer-element-type.cpp b/source/slang/slang-ir-lower-buffer-element-type.cpp
index 6cd8495b4..182b101df 100644
--- a/source/slang/slang-ir-lower-buffer-element-type.cpp
+++ b/source/slang/slang-ir-lower-buffer-element-type.cpp
@@ -477,7 +477,11 @@ namespace Slang
{
IRBuilder builder(newElementType);
builder.setInsertAfter(newElementType);
- return builder.getType(originalPtrLikeType->getOp(), newElementType);
+ ShortList<IRInst*> operands;
+ for (UInt i = 0; i < originalPtrLikeType->getOperandCount(); i++)
+ operands.add(originalPtrLikeType->getOperand(i));
+ operands[0] = newElementType;
+ return builder.getType(originalPtrLikeType->getOp(), (UInt)operands.getCount(), operands.getArrayView().getBuffer());
}
SLANG_UNREACHABLE("unhandled ptr like or buffer type");
}
@@ -538,9 +542,14 @@ namespace Slang
builder.setInsertBefore(bufferType);
+ ShortList<IRInst*> typeOperands;
+ for (UInt i = 0; i < bufferType->getOperandCount(); i++)
+ typeOperands.add(bufferType->getOperand(i));
+ typeOperands[0] = loweredBufferElementTypeInfo.loweredType;
auto loweredBufferType = builder.getType(
bufferType->getOp(),
- loweredBufferElementTypeInfo.loweredType);
+ (UInt)typeOperands.getCount(),
+ typeOperands.getArrayView().getBuffer());
// We treat a value of a buffer type as a pointer, and use a work list to translate
// all loads and stores through the pointer values that needs lowering.
@@ -823,7 +832,24 @@ namespace Slang
case kIROp_HLSLAppendStructuredBufferType:
case kIROp_HLSLConsumeStructuredBufferType:
case kIROp_HLSLRasterizerOrderedStructuredBufferType:
+ {
+ auto structBufferType = as<IRHLSLStructuredBufferTypeBase>(bufferType);
+ auto layoutTypeOp = structBufferType->getDataLayout()
+ ? structBufferType->getDataLayout()->getOp()
+ : kIROp_DefaultBufferLayoutType;
+ switch (layoutTypeOp)
+ {
+ case kIROp_DefaultBufferLayoutType:
+ return IRTypeLayoutRules::getStd430();
+ case kIROp_Std140BufferLayoutType:
+ return IRTypeLayoutRules::getStd140();
+ case kIROp_Std430BufferLayoutType:
+ return IRTypeLayoutRules::getStd430();
+ case kIROp_ScalarBufferLayoutType:
+ return IRTypeLayoutRules::getNatural();
+ }
return IRTypeLayoutRules::getStd430();
+ }
case kIROp_ConstantBufferType:
case kIROp_ParameterBlockType:
return IRTypeLayoutRules::getStd140();