diff options
| author | Yong He <yonghe@outlook.com> | 2024-02-05 22:36:02 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-05 22:36:02 -0800 |
| commit | 23c65b873f8002b74d60f61cacb3614da60e078d (patch) | |
| tree | 9629ffeed059cd67e70d5a98427922697ba46543 /source/slang/slang-ir-lower-buffer-element-type.cpp | |
| parent | af035fb6da2a19ccc647515e9b1edf35777f8c89 (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.cpp | 30 |
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(); |
