summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-ir-metadata.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2025-01-03 14:10:42 -0800
committerGitHub <noreply@github.com>2025-01-03 14:10:42 -0800
commit5df3a74af9beb1e31fd1ed7975b4d9949b923126 (patch)
tree0c358b6689be8235a9844939d5951e9b50f492aa /source/slang/slang-ir-metadata.cpp
parentd48cd130aacbab34bb98d51bb237ad38ff37348c (diff)
Fix parameter location reflection for pure data paramblocks. (#5956)
Diffstat (limited to 'source/slang/slang-ir-metadata.cpp')
-rw-r--r--source/slang/slang-ir-metadata.cpp43
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;