From 5df3a74af9beb1e31fd1ed7975b4d9949b923126 Mon Sep 17 00:00:00 2001 From: Yong He Date: Fri, 3 Jan 2025 14:10:42 -0800 Subject: Fix parameter location reflection for pure data paramblocks. (#5956) --- source/slang/slang-ir-metadata.cpp | 43 +++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) (limited to 'source') 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(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; -- cgit v1.2.3