summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-emit-wgsl.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-11-06 11:21:53 -0800
committerGitHub <noreply@github.com>2024-11-06 11:21:53 -0800
commit2533125cb7c673b313195e1d8bc6066b253d95ae (patch)
tree480193df48d9c5895e976ba929163ed47f82176c /source/slang/slang-emit-wgsl.cpp
parentb86703432629bbfd75a902671d15e40c591065a7 (diff)
Fix WGSL parameter block binding. (#5500)
* Fix WGSL parameter block binding. * Re-enable tests. * Update failure list. * Fix entrypoint parameters. * Update tests. * Enable stat-var test.
Diffstat (limited to 'source/slang/slang-emit-wgsl.cpp')
-rw-r--r--source/slang/slang-emit-wgsl.cpp39
1 files changed, 31 insertions, 8 deletions
diff --git a/source/slang/slang-emit-wgsl.cpp b/source/slang/slang-emit-wgsl.cpp
index 256697bc7..ca51f7e15 100644
--- a/source/slang/slang-emit-wgsl.cpp
+++ b/source/slang/slang-emit-wgsl.cpp
@@ -87,9 +87,23 @@ void WGSLSourceEmitter::emitParameterGroupImpl(
auto varLayout = getVarLayout(varDecl);
SLANG_RELEASE_ASSERT(varLayout);
- for (auto attr : varLayout->getOffsetAttrs())
+ EmitVarChain blockChain(varLayout);
+
+ EmitVarChain containerChain = blockChain;
+ EmitVarChain elementChain = blockChain;
+
+ auto typeLayout = varLayout->getTypeLayout()->unwrapArray();
+ if (auto parameterGroupTypeLayout = as<IRParameterGroupTypeLayout>(typeLayout))
{
+ containerChain =
+ EmitVarChain(parameterGroupTypeLayout->getContainerVarLayout(), &blockChain);
+ elementChain = EmitVarChain(parameterGroupTypeLayout->getElementVarLayout(), &blockChain);
+
+ typeLayout = parameterGroupTypeLayout->getElementVarLayout()->getTypeLayout();
+ }
+ for (auto attr : containerChain.varLayout->getOffsetAttrs())
+ {
const LayoutResourceKind kind = attr->getResourceKind();
switch (kind)
{
@@ -120,12 +134,17 @@ void WGSLSourceEmitter::emitParameterGroupImpl(
case LayoutResourceKind::UnorderedAccess:
case LayoutResourceKind::SamplerState:
case LayoutResourceKind::DescriptorTableSlot:
- m_writer->emit("@binding(");
- m_writer->emit(attr->getOffset());
- m_writer->emit(") ");
- m_writer->emit("@group(");
- m_writer->emit(attr->getSpace());
- m_writer->emit(") ");
+ {
+ m_writer->emit("@binding(");
+ m_writer->emit(attr->getOffset());
+ m_writer->emit(") ");
+ m_writer->emit("@group(");
+ auto space = getBindingSpaceForKinds(
+ &containerChain,
+ LayoutResourceKind::DescriptorTableSlot);
+ m_writer->emit(space);
+ m_writer->emit(") ");
+ }
break;
}
}
@@ -607,8 +626,12 @@ void WGSLSourceEmitter::emitLayoutQualifiersImpl(IRVarLayout* layout)
m_writer->emit("@binding(");
m_writer->emit(attr->getOffset());
m_writer->emit(") ");
+
+ EmitVarChain chain = {};
+ chain.varLayout = layout;
+ auto space = getBindingSpaceForKinds(&chain, kind);
m_writer->emit("@group(");
- m_writer->emit(attr->getSpace());
+ m_writer->emit(space);
m_writer->emit(") ");
return;