diff options
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(); |
