summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-reflection-api.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-reflection-api.cpp')
-rw-r--r--source/slang/slang-reflection-api.cpp38
1 files changed, 33 insertions, 5 deletions
diff --git a/source/slang/slang-reflection-api.cpp b/source/slang/slang-reflection-api.cpp
index 2031b4a0f..6f022cc90 100644
--- a/source/slang/slang-reflection-api.cpp
+++ b/source/slang/slang-reflection-api.cpp
@@ -1326,6 +1326,7 @@ namespace Slang
Index bindingRangeIndex = m_extendedInfo->m_bindingRanges.getCount();
SlangBindingType bindingType = SLANG_BINDING_TYPE_CONSTANT_BUFFER;
Index spaceOffset = -1;
+ bool usesIndirectAllocation = false;
LayoutResourceKind kind = LayoutResourceKind::None;
// TODO: It is unclear if this should be looking at the resource
@@ -1333,12 +1334,25 @@ namespace Slang
//
for(auto& resInfo : parameterGroupTypeLayout->resourceInfos)
{
+ if( spaceOffset == -1 )
+ {
+ spaceOffset = _calcSpaceOffset(path, kind);
+ }
+
kind = resInfo.kind;
switch(kind)
{
default:
continue;
+ case LayoutResourceKind::ConstantBuffer:
+ case LayoutResourceKind::PushConstantBuffer:
+ case LayoutResourceKind::DescriptorTableSlot:
+ break;
+
+ // Certain cases indicate a parameter block that
+ // actually involves indirection.
+ //
// Note: the only case where a parameter group should
// reflect as consuming `Uniform` storage is on CPU/CUDA,
// where that will be the only resource it contains.
@@ -1346,18 +1360,19 @@ namespace Slang
// TODO: If we ever support targets that don't have
// constant buffers at all, this logic would be questionable.
//
- case LayoutResourceKind::ConstantBuffer:
- case LayoutResourceKind::PushConstantBuffer:
case LayoutResourceKind::RegisterSpace:
- case LayoutResourceKind::DescriptorTableSlot:
case LayoutResourceKind::Uniform:
+ usesIndirectAllocation = true;
break;
}
bindingType = _calcBindingType(typeLayout, kind);
- spaceOffset = _calcSpaceOffset(path, kind);
break;
}
+ if(spaceOffset == -1)
+ {
+ spaceOffset = 0;
+ }
TypeLayout::ExtendedInfo::BindingRangeInfo bindingRange;
bindingRange.leafTypeLayout = typeLayout;
@@ -1419,7 +1434,7 @@ namespace Slang
// because the physical storage for `C.a` is provided by the
// memory allocation for `C` itself.
- if( spaceOffset != -1 )
+ if( !usesIndirectAllocation )
{
// The logic here assumes that when a parameter group consumes
// resources that must "leak" into the outer scope (including
@@ -1848,6 +1863,19 @@ SLANG_API SlangInt spReflectionTypeLayout_getBindingRangeFirstDescriptorRangeInd
return bindingRange.firstDescriptorRangeIndex;
}
+SLANG_API SlangInt spReflectionTypeLayout_getBindingRangeDescriptorRangeCount(SlangReflectionTypeLayout* inTypeLayout, SlangInt index)
+{
+ auto typeLayout = convert(inTypeLayout);
+ if(!typeLayout) return 0;
+
+ auto extTypeLayout = Slang::getExtendedTypeLayout(typeLayout);
+ if(index < 0) return 0;
+ if(index >= extTypeLayout->m_bindingRanges.getCount()) return 0;
+ auto& bindingRange = extTypeLayout->m_bindingRanges[index];
+
+ return bindingRange.descriptorRangeCount;
+}
+
SLANG_API SlangInt spReflectionTypeLayout_getDescriptorSetCount(SlangReflectionTypeLayout* inTypeLayout)
{
auto typeLayout = convert(inTypeLayout);