diff options
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-ir-layout.cpp | 56 |
1 files changed, 37 insertions, 19 deletions
diff --git a/source/slang/slang-ir-layout.cpp b/source/slang/slang-ir-layout.cpp index 0003d279a..6ea1093f5 100644 --- a/source/slang/slang-ir-layout.cpp +++ b/source/slang/slang-ir-layout.cpp @@ -49,6 +49,30 @@ namespace Slang { +static Result _calcNaturalArraySizeAndAlignment(IRType* elementType, IRInst* elementCountInst, IRSizeAndAlignment* outSizeAndAlignment) +{ + auto elementCountLit = as<IRIntLit>(elementCountInst); + if(!elementCountLit) + return SLANG_FAIL; + auto elementCount = elementCountLit->getValue(); + + if( elementCount == 0 ) + { + *outSizeAndAlignment = IRSizeAndAlignment(0, 1); + return SLANG_OK; + } + + IRSizeAndAlignment elementTypeLayout; + SLANG_RETURN_ON_FAIL(getNaturalSizeAndAlignment(elementType, &elementTypeLayout)); + + auto elementStride = elementTypeLayout.getStride(); + + *outSizeAndAlignment = IRSizeAndAlignment( + elementStride * (elementCount - 1) + elementTypeLayout.size, + elementTypeLayout.alignment); + return SLANG_OK; +} + static Result _calcNaturalSizeAndAlignment(IRType* type, IRSizeAndAlignment* outSizeAndAlignment) { switch( type->op ) @@ -141,27 +165,21 @@ static Result _calcNaturalSizeAndAlignment(IRType* type, IRSizeAndAlignment* out { auto arrayType = cast<IRArrayType>(type); - auto elementCountLit = as<IRIntLit>(arrayType->getElementCount()); - if(!elementCountLit) - return SLANG_FAIL; - auto elementCount = elementCountLit->getValue(); - - if( elementCount == 0 ) - { - *outSizeAndAlignment = IRSizeAndAlignment(0, 1); - return SLANG_OK; - } - - auto elementType = arrayType->getElementType(); - IRSizeAndAlignment elementTypeLayout; - SLANG_RETURN_ON_FAIL(getNaturalSizeAndAlignment(elementType, &elementTypeLayout)); + return _calcNaturalArraySizeAndAlignment( + arrayType->getElementType(), + arrayType->getElementCount(), + outSizeAndAlignment); + } + break; - auto elementStride = elementTypeLayout.getStride(); + case kIROp_VectorType: + { + auto vecType = cast<IRVectorType>(type); - *outSizeAndAlignment = IRSizeAndAlignment( - elementStride * (elementCount - 1) + elementTypeLayout.size, - elementTypeLayout.alignment); - return SLANG_OK; + return _calcNaturalArraySizeAndAlignment( + vecType->getElementType(), + vecType->getElementCount(), + outSizeAndAlignment); } break; |
