diff options
| author | Yong He <yonghe@outlook.com> | 2024-11-06 11:21:53 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-11-06 11:21:53 -0800 |
| commit | 2533125cb7c673b313195e1d8bc6066b253d95ae (patch) | |
| tree | 480193df48d9c5895e976ba929163ed47f82176c /source/slang/slang-emit-wgsl.cpp | |
| parent | b86703432629bbfd75a902671d15e40c591065a7 (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.cpp | 39 |
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; |
