summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/slang/slang-ir-layout.cpp56
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;