Skip to content

Commit 2533125

Browse files
authoredNov 6, 2024
Fix WGSL parameter block binding. (shader-slang#5500)
* Fix WGSL parameter block binding. * Re-enable tests. * Update failure list. * Fix entrypoint parameters. * Update tests. * Enable stat-var test.

14 files changed

+39
-34
lines changed
 

‎source/slang/slang-emit-wgsl.cpp

+31-8
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,23 @@ void WGSLSourceEmitter::emitParameterGroupImpl(
8787
auto varLayout = getVarLayout(varDecl);
8888
SLANG_RELEASE_ASSERT(varLayout);
8989

90-
for (auto attr : varLayout->getOffsetAttrs())
90+
EmitVarChain blockChain(varLayout);
91+
92+
EmitVarChain containerChain = blockChain;
93+
EmitVarChain elementChain = blockChain;
94+
95+
auto typeLayout = varLayout->getTypeLayout()->unwrapArray();
96+
if (auto parameterGroupTypeLayout = as<IRParameterGroupTypeLayout>(typeLayout))
9197
{
98+
containerChain =
99+
EmitVarChain(parameterGroupTypeLayout->getContainerVarLayout(), &blockChain);
100+
elementChain = EmitVarChain(parameterGroupTypeLayout->getElementVarLayout(), &blockChain);
101+
102+
typeLayout = parameterGroupTypeLayout->getElementVarLayout()->getTypeLayout();
103+
}
92104

105+
for (auto attr : containerChain.varLayout->getOffsetAttrs())
106+
{
93107
const LayoutResourceKind kind = attr->getResourceKind();
94108
switch (kind)
95109
{
@@ -120,12 +134,17 @@ void WGSLSourceEmitter::emitParameterGroupImpl(
120134
case LayoutResourceKind::UnorderedAccess:
121135
case LayoutResourceKind::SamplerState:
122136
case LayoutResourceKind::DescriptorTableSlot:
123-
m_writer->emit("@binding(");
124-
m_writer->emit(attr->getOffset());
125-
m_writer->emit(") ");
126-
m_writer->emit("@group(");
127-
m_writer->emit(attr->getSpace());
128-
m_writer->emit(") ");
137+
{
138+
m_writer->emit("@binding(");
139+
m_writer->emit(attr->getOffset());
140+
m_writer->emit(") ");
141+
m_writer->emit("@group(");
142+
auto space = getBindingSpaceForKinds(
143+
&containerChain,
144+
LayoutResourceKind::DescriptorTableSlot);
145+
m_writer->emit(space);
146+
m_writer->emit(") ");
147+
}
129148
break;
130149
}
131150
}
@@ -607,8 +626,12 @@ void WGSLSourceEmitter::emitLayoutQualifiersImpl(IRVarLayout* layout)
607626
m_writer->emit("@binding(");
608627
m_writer->emit(attr->getOffset());
609628
m_writer->emit(") ");
629+
630+
EmitVarChain chain = {};
631+
chain.varLayout = layout;
632+
auto space = getBindingSpaceForKinds(&chain, kind);
610633
m_writer->emit("@group(");
611-
m_writer->emit(attr->getSpace());
634+
m_writer->emit(space);
612635
m_writer->emit(") ");
613636

614637
return;

‎source/slang/slang-type-layout.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -2546,7 +2546,7 @@ static bool shouldAllocateRegisterSpaceForParameterBlock(TypeLayoutContext const
25462546
// If we know that we are targetting Vulkan, then
25472547
// the only way to effectively use parameter blocks
25482548
// is by using descriptor sets.
2549-
if (isVulkanTarget(targetReq))
2549+
if (isVulkanTarget(targetReq) || isWGPUTarget(targetReq))
25502550
return true;
25512551

25522552
// If none of the above passed, then it seems like we

‎tests/autodiff/global-param-hoisting.slang

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type
99
//TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute -output-using-type -shaderobj
1010
//TEST(compute):COMPARE_COMPUTE:-slang -compute -mtl -output-using-type -render-features argument-buffer-tier-2
11-
//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu
1211

1312
//TEST_INPUT:ubuffer(data=[0 0 0 0 0], stride=4):out,name=outputBuffer
1413
RWStructuredBuffer<float> outputBuffer;

‎tests/bindings/nested-parameter-block-2.slang

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -d3d12 -use-dxil -shaderobj -output-using-type
33
//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -vk -shaderobj -output-using-type
44
//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -metal -shaderobj -output-using-type -render-features argument-buffer-tier-2
5-
//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu
65
// nested-parameter-block-2.slang
76

87
struct CB

‎tests/bugs/static-var.slang

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// gh-775-ext.slang
22
//TEST(compute):COMPARE_COMPUTE: -shaderobj
3-
//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu
43

54
int test(int inVal)
65
{

‎tests/compute/cbuffer-legalize.slang

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
//TEST(compute):COMPARE_COMPUTE:-cpu -shaderobj
22
//TEST(compute):COMPARE_COMPUTE:-shaderobj
3-
//DISABLE_TEST(compute):COMPARE_COMPUTE:-wgpu
43

54
//TEST_INPUT: uniform(data=[1 2 3 4]):name=C.p.c
65
//TEST_INPUT: Texture2D(size=4, content = one):name=C.p.t

‎tests/compute/kernel-context-threading.slang

-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -output-using-type -xslang -matrix-layout-row-major -shaderobj
1111
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -output-using-type -dx12 -xslang -matrix-layout-row-major -shaderobj
1212
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type -xslang -matrix-layout-row-major -shaderobj
13-
//DISABLE_TEST(compute):COMPARE_COMPUTE:-wgpu
1413

1514
//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
1615
ConstantBuffer<float4x4> matrixBuffer;

‎tests/compute/parameter-block.slang

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
//TEST(compute):COMPARE_COMPUTE:-vk -shaderobj
44
//TEST(compute):COMPARE_COMPUTE:-shaderobj
55
//TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl -render-features argument-buffer-tier-2
6-
//DISABLE_TEST(compute):COMPARE_COMPUTE:-wgpu
6+
//TEST(compute):COMPARE_COMPUTE:-wgpu
77

88
// Ensure that Slang `ParameterBlock` type is lowered
99
// to HLSL in the fashion that we expect.

‎tests/expected-failure-github.txt

+4-12
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,17 @@ tests/language-feature/saturated-cooperation/fuse-product.slang (vk)
55
tests/language-feature/saturated-cooperation/fuse.slang (vk)
66
tests/bugs/byte-address-buffer-interlocked-add-f32.slang (vk)
77
tests/serialization/obfuscated-serialized-module-test.slang.2 syn (mtl)
8-
tests/autodiff-dstdlib/dstdlib-abs.slang.2 syn (wgpu)
9-
tests/autodiff/bug-1.slang.1 syn (wgpu)
108
tests/autodiff/custom-intrinsic.slang.2 syn (wgpu)
119
tests/autodiff/diff-ptr-type-call.slang.2 syn (wgpu)
1210
tests/autodiff/diff-ptr-type-loop.slang.2 syn (wgpu)
1311
tests/autodiff/diff-ptr-type-smoke.slang.2 syn (wgpu)
1412
tests/autodiff/existential-1.slang.2 syn (wgpu)
1513
tests/autodiff/existential-2.slang.2 syn (wgpu)
16-
tests/autodiff/global-param-hoisting.slang.4 syn (wgpu)
1714
tests/autodiff/material/diff-bwd-falcor-material-system.slang.2 syn (wgpu)
1815
tests/autodiff/material2/diff-bwd-falcor-material-system.slang.2 syn (wgpu)
1916
tests/autodiff/matrix-arithmetic-fwd.slang.2 syn (wgpu)
2017
tests/autodiff/no-diff-strip.slang.3 syn (wgpu)
2118
tests/autodiff/reverse-loop-checkpoint-test.slang.3 syn (wgpu)
22-
tests/bindings/nested-parameter-block-2.slang.4 syn (wgpu)
2319
tests/bindings/nested-parameter-block-3.slang.4 syn (wgpu)
2420
tests/bugs/atomic-coerce.slang.3 syn (wgpu)
2521
tests/bugs/buffer-swizzle-store.slang.3 syn (wgpu)
@@ -37,30 +33,30 @@ tests/bugs/obfuscate-specialization-naming.slang.2 syn (wgpu)
3733
tests/bugs/op-assignment-unify-mat.slang.4 syn (wgpu)
3834
tests/bugs/shadowed-lookup.slang.1 syn (wgpu)
3935
tests/bugs/specialize-function-array-args.slang.2 syn (wgpu)
40-
tests/bugs/static-var.slang.1 syn (wgpu)
4136
tests/bugs/texture2d-gather.hlsl.2 syn (wgpu)
4237
tests/bugs/user-attribute-lookup.slang.2 syn (wgpu)
4338
tests/compute/atomics (wgpu)
4439
tests/compute/atomics-buffer (wgpu)
4540
tests/compute/atomics-groupshared (wgpu)
4641
tests/compute/buffer-type-splitting (wgpu)
4742
tests/compute/byte-address-buffer (wgpu)
48-
tests/compute/cbuffer-legalize.slang.2 syn (wgpu)
4943
tests/compute/compile-time-loop.slang.2 syn (wgpu)
5044
tests/compute/constexpr.slang.2 syn (wgpu)
5145
tests/compute/discard-stmt.slang.2 syn (wgpu)
5246
tests/compute/func-param-legalize.slang.1 syn (wgpu)
53-
tests/compute/global-init.slang.2 syn (wgpu)
5447
tests/compute/interface-shader-param-in-struct.slang.4 syn (wgpu)
5548
tests/compute/interface-shader-param.slang.5 syn (wgpu)
56-
tests/compute/kernel-context-threading.slang.6 syn (wgpu)
5749
tests/compute/loop-unroll.slang.7 syn (wgpu)
5850
tests/compute/parameter-block (wgpu)
5951
tests/compute/texture-get-dimensions (wgpu)
6052
tests/compute/texture-sampling (wgpu)
6153
tests/compute/texture-simple (wgpu)
6254
tests/compute/texture-simpler (wgpu)
6355
tests/compute/transcendental-double (wgpu)
56+
tests/compute/constant-buffer-memory-packing.slang.6 syn (wgpu)
57+
tests/compute/func-cbuffer-param.slang.4 syn (wgpu)
58+
tests/compute/matrix-layout.hlsl.3 syn (wgpu)
59+
tests/hlsl/packoffset.slang.5 syn (wgpu)
6460
tests/hlsl-intrinsic/byte-address-buffer/byte-address-struct.slang.5 syn (wgpu)
6561
tests/hlsl-intrinsic/classify-double.slang.6 syn (wgpu)
6662
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 (
7470
tests/language-feature/enums/nested-enum.slang.1 syn (wgpu)
7571
tests/language-feature/enums/strongly-typed-id.slang.1 syn (wgpu)
7672
tests/language-feature/generics/irwarray.slang.2 syn (wgpu)
77-
tests/language-feature/generics/parameter-block-unify.slang.3 syn (wgpu)
7873
tests/language-feature/generics/tuple.slang.1 syn (wgpu)
7974
tests/language-feature/generics/variadic-0.slang.4 syn (wgpu)
8075
tests/language-feature/generics/variadic-void.slang.3 syn (wgpu)
8176
tests/language-feature/higher-order-functions/simple.slang.4 syn (wgpu)
82-
tests/language-feature/inheritance/struct-inheritance.slang.1 syn (wgpu)
83-
tests/language-feature/shader-params/entry-point-uniform-params-implicit.slang.3 syn (wgpu)
84-
tests/language-feature/shader-params/entry-point-uniform-params.slang.4 syn (wgpu)
8577
tests/language-feature/shader-params/interface-shader-param-ordinary.slang.4 syn (wgpu)
8678
tests/language-feature/swizzles/matrix-swizzle-write-array.slang.3 syn (wgpu)
8779
tests/language-feature/swizzles/matrix-swizzle-write-single.slang.3 syn (wgpu)

‎tests/language-feature/generics/parameter-block-unify.slang

-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-slang -compute -shaderobj -output-using-type
22
//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -output-using-type
33
//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-mtl -compute -shaderobj -output-using-type -render-features argument-buffer-tier-2
4-
//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu
54

65
struct TestStruct<Format:__BuiltinIntegerType, let count : int>
76
{

‎tests/language-feature/inheritance/struct-inheritance.slang

-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// struct-inheritance.slang
22

33
//TEST(compute):COMPARE_COMPUTE: -shaderobj
4-
//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu
54

65
// Test that we can define a `struct` type
76
// that inherits from another `struct`.

‎tests/language-feature/shader-params/entry-point-uniform-params-implicit.slang

-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj -xslang -Wno-38040
66
//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -vk -shaderobj -xslang -Wno-38040
77
//TEST:SIMPLE(filecheck=WARNING): -target spirv
8-
//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu
98

109
struct Data
1110
{

‎tests/language-feature/shader-params/entry-point-uniform-params.slang

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
// entry-point-uniform-params.slang
2-
2+
//TEST(compute):COMPARE_COMPUTE:-wgpu -shaderobj
33
//TEST(compute):COMPARE_COMPUTE: -shaderobj
44
//TEST(compute):COMPARE_COMPUTE:-cuda -shaderobj
55
//TEST(compute):COMPARE_COMPUTE:-cpu -shaderobj
66
//TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
7-
//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu
8-
97
// Test that a shader can be written that
108
// only uses entry point `uniform` parameters,
119
// without any global parameters.

0 commit comments

Comments
 (0)
Please sign in to comment.