summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-emit-spirv.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-emit-spirv.cpp')
-rw-r--r--source/slang/slang-emit-spirv.cpp21
1 files changed, 18 insertions, 3 deletions
diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp
index 5dfa1c76c..ba238985b 100644
--- a/source/slang/slang-emit-spirv.cpp
+++ b/source/slang/slang-emit-spirv.cpp
@@ -2069,10 +2069,25 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
inst->getOp() == kIROp_ArrayType
? emitOpTypeArray(inst, elementType, irArrayType->getElementCount())
: emitOpTypeRuntimeArray(inst, elementType);
- auto strideInst = irArrayType->getArrayStride();
- if (strideInst && shouldEmitArrayStride(irArrayType->getElementType()))
+ if (shouldEmitArrayStride(irArrayType->getElementType()))
{
- int stride = (int)getIntVal(strideInst);
+ auto stride = 0;
+ if (auto strideInst = irArrayType->getArrayStride())
+ {
+ stride = (int)getIntVal(strideInst);
+ }
+ else
+ {
+ // Stride may not have been calculated for basic element types. Calculate it
+ // here.
+ IRSizeAndAlignment sizeAndAlignment;
+ getNaturalSizeAndAlignment(
+ m_targetProgram->getOptionSet(),
+ elementType,
+ &sizeAndAlignment);
+ stride = (int)sizeAndAlignment.getStride();
+ }
+
emitOpDecorateArrayStride(
getSection(SpvLogicalSectionID::Annotations),
nullptr,