diff options
| author | Yong He <yonghe@outlook.com> | 2025-01-03 14:10:42 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-03 14:10:42 -0800 |
| commit | 5df3a74af9beb1e31fd1ed7975b4d9949b923126 (patch) | |
| tree | 0c358b6689be8235a9844939d5951e9b50f492aa /source | |
| parent | d48cd130aacbab34bb98d51bb237ad38ff37348c (diff) | |
Fix parameter location reflection for pure data paramblocks. (#5956)
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-ir-metadata.cpp | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/source/slang/slang-ir-metadata.cpp b/source/slang/slang-ir-metadata.cpp index 7348c06fd..d88afdb64 100644 --- a/source/slang/slang-ir-metadata.cpp +++ b/source/slang/slang-ir-metadata.cpp @@ -53,6 +53,11 @@ void collectMetadataFromInst(IRInst* param, ArtifactPostEmitMetadata& outMetadat if (!varLayout) return; + UInt spaceOffset = 0; + if (auto spaceAttr = varLayout->findOffsetAttr(LayoutResourceKind::RegisterSpace)) + { + spaceOffset = spaceAttr->getOffset(); + } for (auto sizeAttr : varLayout->getTypeLayout()->getSizeAttrs()) { auto kind = sizeAttr->getResourceKind(); @@ -65,11 +70,39 @@ void collectMetadataFromInst(IRInst* param, ArtifactPostEmitMetadata& outMetadat if (auto offsetAttr = varLayout->findOffsetAttr(kind)) { // Get the binding information from this attribute and insert it into the list - auto spaceIndex = offsetAttr->getSpace(); - if (auto spaceAttr = varLayout->findOffsetAttr(LayoutResourceKind::RegisterSpace)) - { - spaceIndex += spaceAttr->getOffset(); - } + auto spaceIndex = spaceOffset + offsetAttr->getSpace(); + auto registerIndex = offsetAttr->getOffset(); + auto size = sizeAttr->getSize(); + auto count = size.isFinite() ? size.getFiniteValue() : 0; + _insertBinding(outMetadata.m_usedBindings, kind, spaceIndex, registerIndex, count); + } + } + + // If the global parameter is a parameter block, make sure to collect bindings for its + // default constant buffer, if there is one. + // The default constant buffer binding will be represented in the container var layout. + // + auto paramGroupTypeLayout = as<IRParameterGroupTypeLayout>(varLayout->getTypeLayout()); + if (!paramGroupTypeLayout) + return; + auto containerVarLayout = paramGroupTypeLayout->getContainerVarLayout(); + if (!containerVarLayout) + return; + auto containerSpaceOffset = + varLayout->findOffsetAttr(LayoutResourceKind::SubElementRegisterSpace); + if (!containerSpaceOffset) + return; + spaceOffset += containerSpaceOffset->getOffset(); + for (auto sizeAttr : containerVarLayout->getTypeLayout()->getSizeAttrs()) + { + auto kind = sizeAttr->getResourceKind(); + + if (!ShaderBindingRange::isUsageTracked(kind)) + continue; + + if (auto offsetAttr = containerVarLayout->findOffsetAttr(kind)) + { + auto spaceIndex = spaceOffset + offsetAttr->getSpace(); auto registerIndex = offsetAttr->getOffset(); auto size = sizeAttr->getSize(); auto count = size.isFinite() ? size.getFiniteValue() : 0; |
