summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/slang-ir-metadata.cpp43
-rw-r--r--tools/slang-unit-test/unit-test-parameter-usage-reflection.cpp15
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);