diff --git a/external/slang-rhi b/external/slang-rhi index db40464b1a..ff82eb6066 160000 --- a/external/slang-rhi +++ b/external/slang-rhi @@ -1 +1 @@ -Subproject commit db40464b1a84c671824472acbff83402959f9db6 +Subproject commit ff82eb606616aa2d2a3003a4901424eef5665822 diff --git a/source/slang/slang-emit-wgsl.cpp b/source/slang/slang-emit-wgsl.cpp index 256697bc7c..ca51f7e151 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 e36e54531d..62caecf726 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 diff --git a/tests/autodiff/global-param-hoisting.slang b/tests/autodiff/global-param-hoisting.slang index 48f5d44b03..54d2759748 100644 --- a/tests/autodiff/global-param-hoisting.slang +++ b/tests/autodiff/global-param-hoisting.slang @@ -8,7 +8,6 @@ //TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type //TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute -output-using-type -shaderobj //TEST(compute):COMPARE_COMPUTE:-slang -compute -mtl -output-using-type -render-features argument-buffer-tier-2 -//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu //TEST_INPUT:ubuffer(data=[0 0 0 0 0], stride=4):out,name=outputBuffer RWStructuredBuffer outputBuffer; diff --git a/tests/bindings/nested-parameter-block-2.slang b/tests/bindings/nested-parameter-block-2.slang index 6f783d883b..790e3d060a 100644 --- a/tests/bindings/nested-parameter-block-2.slang +++ b/tests/bindings/nested-parameter-block-2.slang @@ -2,7 +2,6 @@ //TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -d3d12 -use-dxil -shaderobj -output-using-type //TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -vk -shaderobj -output-using-type //TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -metal -shaderobj -output-using-type -render-features argument-buffer-tier-2 -//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu // nested-parameter-block-2.slang struct CB diff --git a/tests/bugs/static-var.slang b/tests/bugs/static-var.slang index 7960774e0c..004567466f 100644 --- a/tests/bugs/static-var.slang +++ b/tests/bugs/static-var.slang @@ -1,6 +1,5 @@ // gh-775-ext.slang //TEST(compute):COMPARE_COMPUTE: -shaderobj -//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu int test(int inVal) { diff --git a/tests/compute/cbuffer-legalize.slang b/tests/compute/cbuffer-legalize.slang index b77d9fdbfa..d0c0a87774 100644 --- a/tests/compute/cbuffer-legalize.slang +++ b/tests/compute/cbuffer-legalize.slang @@ -1,6 +1,5 @@ //TEST(compute):COMPARE_COMPUTE:-cpu -shaderobj //TEST(compute):COMPARE_COMPUTE:-shaderobj -//DISABLE_TEST(compute):COMPARE_COMPUTE:-wgpu //TEST_INPUT: uniform(data=[1 2 3 4]):name=C.p.c //TEST_INPUT: Texture2D(size=4, content = one):name=C.p.t diff --git a/tests/compute/kernel-context-threading.slang b/tests/compute/kernel-context-threading.slang index 8951d38bef..5cfb171a30 100644 --- a/tests/compute/kernel-context-threading.slang +++ b/tests/compute/kernel-context-threading.slang @@ -10,7 +10,6 @@ //TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -output-using-type -xslang -matrix-layout-row-major -shaderobj //TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -output-using-type -dx12 -xslang -matrix-layout-row-major -shaderobj //TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type -xslang -matrix-layout-row-major -shaderobj -//DISABLE_TEST(compute):COMPARE_COMPUTE:-wgpu //TEST_INPUT:cbuffer(data=[1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 10.0 20.0 30.0 1.0]):name matrixBuffer ConstantBuffer matrixBuffer; diff --git a/tests/compute/parameter-block.slang b/tests/compute/parameter-block.slang index 7a67868ef5..1806d95a88 100644 --- a/tests/compute/parameter-block.slang +++ b/tests/compute/parameter-block.slang @@ -3,7 +3,7 @@ //TEST(compute):COMPARE_COMPUTE:-vk -shaderobj //TEST(compute):COMPARE_COMPUTE:-shaderobj //TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl -render-features argument-buffer-tier-2 -//DISABLE_TEST(compute):COMPARE_COMPUTE:-wgpu +//TEST(compute):COMPARE_COMPUTE:-wgpu // Ensure that Slang `ParameterBlock` type is lowered // to HLSL in the fashion that we expect. diff --git a/tests/expected-failure-github.txt b/tests/expected-failure-github.txt index f2ddf35a0d..8fa260227e 100644 --- a/tests/expected-failure-github.txt +++ b/tests/expected-failure-github.txt @@ -5,21 +5,17 @@ tests/language-feature/saturated-cooperation/fuse-product.slang (vk) tests/language-feature/saturated-cooperation/fuse.slang (vk) tests/bugs/byte-address-buffer-interlocked-add-f32.slang (vk) tests/serialization/obfuscated-serialized-module-test.slang.2 syn (mtl) -tests/autodiff-dstdlib/dstdlib-abs.slang.2 syn (wgpu) -tests/autodiff/bug-1.slang.1 syn (wgpu) tests/autodiff/custom-intrinsic.slang.2 syn (wgpu) tests/autodiff/diff-ptr-type-call.slang.2 syn (wgpu) tests/autodiff/diff-ptr-type-loop.slang.2 syn (wgpu) tests/autodiff/diff-ptr-type-smoke.slang.2 syn (wgpu) tests/autodiff/existential-1.slang.2 syn (wgpu) tests/autodiff/existential-2.slang.2 syn (wgpu) -tests/autodiff/global-param-hoisting.slang.4 syn (wgpu) tests/autodiff/material/diff-bwd-falcor-material-system.slang.2 syn (wgpu) tests/autodiff/material2/diff-bwd-falcor-material-system.slang.2 syn (wgpu) tests/autodiff/matrix-arithmetic-fwd.slang.2 syn (wgpu) tests/autodiff/no-diff-strip.slang.3 syn (wgpu) tests/autodiff/reverse-loop-checkpoint-test.slang.3 syn (wgpu) -tests/bindings/nested-parameter-block-2.slang.4 syn (wgpu) tests/bindings/nested-parameter-block-3.slang.4 syn (wgpu) tests/bugs/atomic-coerce.slang.3 syn (wgpu) tests/bugs/buffer-swizzle-store.slang.3 syn (wgpu) @@ -37,7 +33,6 @@ tests/bugs/obfuscate-specialization-naming.slang.2 syn (wgpu) tests/bugs/op-assignment-unify-mat.slang.4 syn (wgpu) tests/bugs/shadowed-lookup.slang.1 syn (wgpu) tests/bugs/specialize-function-array-args.slang.2 syn (wgpu) -tests/bugs/static-var.slang.1 syn (wgpu) tests/bugs/texture2d-gather.hlsl.2 syn (wgpu) tests/bugs/user-attribute-lookup.slang.2 syn (wgpu) tests/compute/atomics (wgpu) @@ -45,15 +40,12 @@ tests/compute/atomics-buffer (wgpu) tests/compute/atomics-groupshared (wgpu) tests/compute/buffer-type-splitting (wgpu) tests/compute/byte-address-buffer (wgpu) -tests/compute/cbuffer-legalize.slang.2 syn (wgpu) tests/compute/compile-time-loop.slang.2 syn (wgpu) tests/compute/constexpr.slang.2 syn (wgpu) tests/compute/discard-stmt.slang.2 syn (wgpu) tests/compute/func-param-legalize.slang.1 syn (wgpu) -tests/compute/global-init.slang.2 syn (wgpu) tests/compute/interface-shader-param-in-struct.slang.4 syn (wgpu) tests/compute/interface-shader-param.slang.5 syn (wgpu) -tests/compute/kernel-context-threading.slang.6 syn (wgpu) tests/compute/loop-unroll.slang.7 syn (wgpu) tests/compute/parameter-block (wgpu) tests/compute/texture-get-dimensions (wgpu) @@ -61,6 +53,10 @@ tests/compute/texture-sampling (wgpu) tests/compute/texture-simple (wgpu) tests/compute/texture-simpler (wgpu) tests/compute/transcendental-double (wgpu) +tests/compute/constant-buffer-memory-packing.slang.6 syn (wgpu) +tests/compute/func-cbuffer-param.slang.4 syn (wgpu) +tests/compute/matrix-layout.hlsl.3 syn (wgpu) +tests/hlsl/packoffset.slang.5 syn (wgpu) tests/hlsl-intrinsic/byte-address-buffer/byte-address-struct.slang.5 syn (wgpu) tests/hlsl-intrinsic/classify-double.slang.6 syn (wgpu) tests/hlsl-intrinsic/classify-float.slang.5 syn (wgpu) @@ -74,14 +70,10 @@ tests/language-feature/constants/static-const-in-generic-interface.slang.1 syn ( tests/language-feature/enums/nested-enum.slang.1 syn (wgpu) tests/language-feature/enums/strongly-typed-id.slang.1 syn (wgpu) tests/language-feature/generics/irwarray.slang.2 syn (wgpu) -tests/language-feature/generics/parameter-block-unify.slang.3 syn (wgpu) tests/language-feature/generics/tuple.slang.1 syn (wgpu) tests/language-feature/generics/variadic-0.slang.4 syn (wgpu) tests/language-feature/generics/variadic-void.slang.3 syn (wgpu) tests/language-feature/higher-order-functions/simple.slang.4 syn (wgpu) -tests/language-feature/inheritance/struct-inheritance.slang.1 syn (wgpu) -tests/language-feature/shader-params/entry-point-uniform-params-implicit.slang.3 syn (wgpu) -tests/language-feature/shader-params/entry-point-uniform-params.slang.4 syn (wgpu) tests/language-feature/shader-params/interface-shader-param-ordinary.slang.4 syn (wgpu) tests/language-feature/swizzles/matrix-swizzle-write-array.slang.3 syn (wgpu) tests/language-feature/swizzles/matrix-swizzle-write-single.slang.3 syn (wgpu) diff --git a/tests/language-feature/generics/parameter-block-unify.slang b/tests/language-feature/generics/parameter-block-unify.slang index abe2c2030e..b549f555b2 100644 --- a/tests/language-feature/generics/parameter-block-unify.slang +++ b/tests/language-feature/generics/parameter-block-unify.slang @@ -1,7 +1,6 @@ //TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-slang -compute -shaderobj -output-using-type //TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -output-using-type //TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-mtl -compute -shaderobj -output-using-type -render-features argument-buffer-tier-2 -//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu struct TestStruct { diff --git a/tests/language-feature/inheritance/struct-inheritance.slang b/tests/language-feature/inheritance/struct-inheritance.slang index cc427eea96..e50b1268b7 100644 --- a/tests/language-feature/inheritance/struct-inheritance.slang +++ b/tests/language-feature/inheritance/struct-inheritance.slang @@ -1,7 +1,6 @@ // struct-inheritance.slang //TEST(compute):COMPARE_COMPUTE: -shaderobj -//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu // Test that we can define a `struct` type // that inherits from another `struct`. diff --git a/tests/language-feature/shader-params/entry-point-uniform-params-implicit.slang b/tests/language-feature/shader-params/entry-point-uniform-params-implicit.slang index b5983b5f7d..5f8ac7edd6 100644 --- a/tests/language-feature/shader-params/entry-point-uniform-params-implicit.slang +++ b/tests/language-feature/shader-params/entry-point-uniform-params-implicit.slang @@ -5,7 +5,6 @@ //TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj -xslang -Wno-38040 //TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -vk -shaderobj -xslang -Wno-38040 //TEST:SIMPLE(filecheck=WARNING): -target spirv -//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu struct Data { diff --git a/tests/language-feature/shader-params/entry-point-uniform-params.slang b/tests/language-feature/shader-params/entry-point-uniform-params.slang index bcad13e66f..082626b037 100644 --- a/tests/language-feature/shader-params/entry-point-uniform-params.slang +++ b/tests/language-feature/shader-params/entry-point-uniform-params.slang @@ -1,11 +1,9 @@ // entry-point-uniform-params.slang - +//TEST(compute):COMPARE_COMPUTE:-wgpu -shaderobj //TEST(compute):COMPARE_COMPUTE: -shaderobj //TEST(compute):COMPARE_COMPUTE:-cuda -shaderobj //TEST(compute):COMPARE_COMPUTE:-cpu -shaderobj //TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl -//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu - // Test that a shader can be written that // only uses entry point `uniform` parameters, // without any global parameters.