diff options
| author | Yong He <yonghe@outlook.com> | 2023-05-02 20:29:38 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-05-02 20:29:38 -0700 |
| commit | d52376a65f37fcbbb67428b917fd3819436b6dfb (patch) | |
| tree | da25b3c9a00bd003b1970b4a6c4eb38eccf62aa1 /source/slang/slang-type-layout.cpp | |
| parent | 55291b0bf6d729fcbaf75a01926da7da8975b8e9 (diff) | |
Various dxc/fxc compatibility fixes. (#2863)
* Various dxc/fxc compatibility fixes.
* Cleanup.
* Fix test cases.
* Fix comments.
---------
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-type-layout.cpp')
| -rw-r--r-- | source/slang/slang-type-layout.cpp | 50 |
1 files changed, 50 insertions, 0 deletions
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<VarLayout> StructTypeLayoutBuilder::addField( return fieldLayout; } +RefPtr<VarLayout> StructTypeLayoutBuilder::addExplicitUniformField(DeclRef<VarDeclBase> field, TypeLayoutResult fieldResult) +{ + auto packoffsetModifier = field.getDecl()->findModifier<HLSLPackOffsetSemantic>(); + if (!packoffsetModifier) + return nullptr; + + RefPtr<VarLayout> 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<VarLayout> StructTypeLayoutBuilder::addField( DeclRef<VarDeclBase> field, RefPtr<TypeLayout> 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<HLSLPackOffsetSemantic>()) + { + 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<HLSLPackOffsetSemantic>()) + 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 |
