From 23c65b873f8002b74d60f61cacb3614da60e078d Mon Sep 17 00:00:00 2001 From: Yong He Date: Mon, 5 Feb 2024 22:36:02 -0800 Subject: Add per-buffer data layout control. (#3551) * Add per-buffer data layout control. Fixes #3534. * Fixes. * Robustness. * Update test. * Fix. --- .../slang/slang-ir-lower-buffer-element-type.cpp | 30 ++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'source/slang/slang-ir-lower-buffer-element-type.cpp') 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 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 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(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(); -- cgit v1.2.3