From 2533125cb7c673b313195e1d8bc6066b253d95ae Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 6 Nov 2024 11:21:53 -0800 Subject: 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. --- source/slang/slang-emit-wgsl.cpp | 39 ++++++++++++++++++++++++++++++-------- source/slang/slang-type-layout.cpp | 2 +- 2 files changed, 32 insertions(+), 9 deletions(-) (limited to 'source') 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(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; diff --git a/source/slang/slang-type-layout.cpp b/source/slang/slang-type-layout.cpp index e36e54531..62caecf72 100644 --- a/source/slang/slang-type-layout.cpp +++ b/source/slang/slang-type-layout.cpp @@ -2546,7 +2546,7 @@ static bool shouldAllocateRegisterSpaceForParameterBlock(TypeLayoutContext const // If we know that we are targetting Vulkan, then // the only way to effectively use parameter blocks // is by using descriptor sets. - if (isVulkanTarget(targetReq)) + if (isVulkanTarget(targetReq) || isWGPUTarget(targetReq)) return true; // If none of the above passed, then it seems like we -- cgit v1.2.3