From d52376a65f37fcbbb67428b917fd3819436b6dfb Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 2 May 2023 20:29:38 -0700 Subject: Various dxc/fxc compatibility fixes. (#2863) * Various dxc/fxc compatibility fixes. * Cleanup. * Fix test cases. * Fix comments. --------- Co-authored-by: Yong He --- source/slang/slang-type-layout.cpp | 50 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'source/slang/slang-type-layout.cpp') diff --git a/source/slang/slang-type-layout.cpp b/source/slang/slang-type-layout.cpp index 0f1341afd..79236fc48 100644 --- a/source/slang/slang-type-layout.cpp +++ b/source/slang/slang-type-layout.cpp @@ -3183,6 +3183,35 @@ RefPtr StructTypeLayoutBuilder::addField( return fieldLayout; } +RefPtr StructTypeLayoutBuilder::addExplicitUniformField(DeclRef field, TypeLayoutResult fieldResult) +{ + auto packoffsetModifier = field.getDecl()->findModifier(); + if (!packoffsetModifier) + return nullptr; + + RefPtr fieldLayout = new VarLayout(); + fieldLayout->varDecl = field; + fieldLayout->typeLayout = fieldResult.layout; + m_typeLayout->fields.add(fieldLayout); + if (field) + { + m_typeLayout->mapVarToLayout.add(field.getDecl(), fieldLayout); + } + UInt uniformOffset = packoffsetModifier->uniformOffset; + if (fieldResult.layout->FindResourceInfo(LayoutResourceKind::Uniform)) + { + fieldLayout->AddResourceInfo(LayoutResourceKind::Uniform)->index = uniformOffset; + } + UniformLayoutInfo fieldInfo = fieldResult.info.getUniformLayout(); + auto uniformInfo = m_info; + m_rules->AddStructField(&uniformInfo, fieldInfo); + m_info.alignment = uniformInfo.alignment; + m_info.size.raw = Math::Max( + m_info.size.getFiniteValue(), + (size_t)(uniformOffset + fieldResult.layout->FindResourceInfo(LayoutResourceKind::Uniform)->count.getFiniteValue())); + return fieldLayout; +} + RefPtr StructTypeLayoutBuilder::addField( DeclRef field, RefPtr fieldTypeLayout) @@ -3684,8 +3713,29 @@ static TypeLayoutResult _createTypeLayout( typeLayoutBuilder.beginLayout(type, rules); auto typeLayout = typeLayoutBuilder.getTypeLayout(); + + // First, add all fields with explicit offsets. + for (auto field : getFields(structDeclRef, MemberFilterStyle::Instance)) + { + // If the field has an explicit offset, then we will + // use that to place it. + // + if (auto packOffsetModifier = field.getDecl()->findModifier()) + { + TypeLayoutResult fieldResult = _createTypeLayout( + context, + getType(context.astBuilder, field), + field.getDecl()); + typeLayoutBuilder.addExplicitUniformField(field, fieldResult); + continue; + } + + } for (auto field : getFields(structDeclRef, MemberFilterStyle::Instance)) { + if (auto packOffsetModifier = field.getDecl()->findModifier()) + continue; + // The fields of a `struct` type may include existential (interface) // types (including as nested sub-fields), and any types present // in those fields will need to be specialized based on the -- cgit v1.2.3