summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-type-layout.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-05-02 20:29:38 -0700
committerGitHub <noreply@github.com>2023-05-02 20:29:38 -0700
commitd52376a65f37fcbbb67428b917fd3819436b6dfb (patch)
treeda25b3c9a00bd003b1970b4a6c4eb38eccf62aa1 /source/slang/slang-type-layout.cpp
parent55291b0bf6d729fcbaf75a01926da7da8975b8e9 (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.cpp50
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