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 | |
| parent | d48cd130aacbab34bb98d51bb237ad38ff37348c (diff) | |
Fix parameter location reflection for pure data paramblocks. (#5956)
| -rw-r--r-- | source/slang/slang-ir-metadata.cpp | 43 | ||||
| -rw-r--r-- | tools/slang-unit-test/unit-test-parameter-usage-reflection.cpp | 15 |
2 files changed, 52 insertions, 6 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; diff --git a/tools/slang-unit-test/unit-test-parameter-usage-reflection.cpp b/tools/slang-unit-test/unit-test-parameter-usage-reflection.cpp index e4a89a277..05acfc9c2 100644 --- a/tools/slang-unit-test/unit-test-parameter-usage-reflection.cpp +++ b/tools/slang-unit-test/unit-test-parameter-usage-reflection.cpp @@ -22,11 +22,18 @@ SLANG_UNIT_TEST(isParameterLocationUsedReflection) Texture2D tex2; Texture2D tex3; }; + struct Material + { + float2 uvScale; + float2 uvBias; + } ParameterBlock<Params> gParams; + ConstantBuffer<Material> gcMaterial; + ParameterBlock<Material> gMaterial; [shader("fragment")] float4 fragMain(float4 pos:SV_Position, float unused:COLOR0, float4 used:COLOR1) : SV_Target { - return g_tex.Load(int3(0, 0, 0)) + gParams.tex3.Load(int3(0)) + used; + return g_tex.Load(int3(0, 0, 0)) + gParams.tex3.Load(int3(0)) + used + gMaterial.uvScale.x + gcMaterial.uvBias.x; } )"; @@ -79,6 +86,9 @@ SLANG_UNIT_TEST(isParameterLocationUsedReflection) SLANG_CHECK(isUsed); metadata->isParameterLocationUsed(SLANG_PARAMETER_CATEGORY_DESCRIPTOR_TABLE_SLOT, 0, 1, isUsed); + SLANG_CHECK(isUsed); + + metadata->isParameterLocationUsed(SLANG_PARAMETER_CATEGORY_DESCRIPTOR_TABLE_SLOT, 0, 2, isUsed); SLANG_CHECK(!isUsed); metadata->isParameterLocationUsed(SLANG_PARAMETER_CATEGORY_DESCRIPTOR_TABLE_SLOT, 1, 0, isUsed); @@ -87,6 +97,9 @@ SLANG_UNIT_TEST(isParameterLocationUsedReflection) metadata->isParameterLocationUsed(SLANG_PARAMETER_CATEGORY_DESCRIPTOR_TABLE_SLOT, 1, 1, isUsed); SLANG_CHECK(isUsed); + metadata->isParameterLocationUsed(SLANG_PARAMETER_CATEGORY_DESCRIPTOR_TABLE_SLOT, 2, 0, isUsed); + SLANG_CHECK(isUsed); + metadata->isParameterLocationUsed(SLANG_PARAMETER_CATEGORY_VARYING_INPUT, 0, 0, isUsed); SLANG_CHECK(!isUsed); |
