diff options
| author | Ellie Hermaszewska <ellieh@nvidia.com> | 2024-12-03 03:45:04 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-12-02 11:45:04 -0800 |
| commit | 7aaf7009e2c6055a714ba4a93ab3dd73d2d2cdb7 (patch) | |
| tree | 17fbc14b5d032951c0c5af0b444ff08dc389d77d | |
| parent | 0586e5ab478f7cfb1763d019eb014f2578106240 (diff) | |
Varying inputs and outputs for wgsl (#5669)
Closes https://github.com/shader-slang/slang/issues/5067
New tests, covering what's declared supported in the WGSL support docs
- tests/wgsl/semantic-coverage.slang
- tests/wgsl/semantic-depth.slang
- tests/wgsl/semantic-dispatch-thread-id.slang
- tests/wgsl/semantic-group-id.slang
- tests/wgsl/semantic-group-index.slang
- tests/wgsl/semantic-group-thread-id.slang
- tests/wgsl/semantic-instance-id.slang
- tests/wgsl/semantic-is-front-face.slang
- tests/wgsl/semantic-position.slang
- tests/wgsl/semantic-sample-index.slang
- tests/wgsl/semantic-vertex-id.slang
WGSL enabled existing tests:
- tests/compute/compile-time-loop.slang
- tests/compute/constexpr.slang
- tests/compute/discard-stmt.slang
- tests/metal/nested-struct-fragment-input.slang
- tests/metal/nested-struct-fragment-output.slang
- tests/metal/nested-struct-multi-entry-point-vertex.slang
- tests/metal/no-struct-vertex-output.slang
- tests/metal/sv_target-complex-1.slang
- tests/metal/sv_target-complex-2.slang
- tests/bugs/texture2d-gather.hlsl
- tests/render/cross-compile-entry-point.slang
- tests/render/nointerpolation.hlsl
- tests/render/render0.hlsl
- tests/render/cross-compile0.hlsl
- tests/render/imported-parameters.hlsl
- tests/render/unused-discard.hlsl
Can't be enabled due to missing wgsl features
- tests/compute/texture-sampling.slang
Co-authored-by: Yong He <yonghe@outlook.com>
| -rw-r--r-- | tests/compute/constexpr.slang | 1 | ||||
| -rw-r--r-- | tests/metal/nested-struct-fragment-input.slang | 11 | ||||
| -rw-r--r-- | tests/metal/nested-struct-fragment-output.slang | 20 | ||||
| -rw-r--r-- | tests/metal/nested-struct-multi-entry-point-vertex.slang | 14 | ||||
| -rw-r--r-- | tests/metal/no-struct-vertex-output.slang | 6 | ||||
| -rw-r--r-- | tests/metal/sv_target-complex-1.slang | 25 | ||||
| -rw-r--r-- | tests/metal/sv_target-complex-2.slang | 22 | ||||
| -rw-r--r-- | tests/wgsl/semantic-coverage.slang | 16 | ||||
| -rw-r--r-- | tests/wgsl/semantic-depth.slang | 16 | ||||
| -rw-r--r-- | tests/wgsl/semantic-dispatch-thread-id.slang | 9 | ||||
| -rw-r--r-- | tests/wgsl/semantic-group-id.slang | 9 | ||||
| -rw-r--r-- | tests/wgsl/semantic-group-index.slang | 9 | ||||
| -rw-r--r-- | tests/wgsl/semantic-group-thread-id.slang | 9 | ||||
| -rw-r--r-- | tests/wgsl/semantic-instance-id.slang | 9 | ||||
| -rw-r--r-- | tests/wgsl/semantic-is-front-face.slang | 9 | ||||
| -rw-r--r-- | tests/wgsl/semantic-position.slang | 16 | ||||
| -rw-r--r-- | tests/wgsl/semantic-sample-index.slang | 9 | ||||
| -rw-r--r-- | tests/wgsl/semantic-vertex-id.slang | 9 |
18 files changed, 200 insertions, 19 deletions
diff --git a/tests/compute/constexpr.slang b/tests/compute/constexpr.slang index 9c7c9d131..f1cd76841 100644 --- a/tests/compute/constexpr.slang +++ b/tests/compute/constexpr.slang @@ -2,6 +2,7 @@ //TEST(compute):COMPARE_COMPUTE_EX:-slang -gcompute -shaderobj //DISABLED://TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -gcompute -shaderobj //TEST(compute):COMPARE_COMPUTE_EX:-mtl -gcompute -shaderobj +//TEST(compute):COMPARE_COMPUTE_EX:-wgpu -gcompute -shaderobj //TEST_INPUT: Texture2D(size=4, content = one):name tex //TEST_INPUT: Sampler:name samp diff --git a/tests/metal/nested-struct-fragment-input.slang b/tests/metal/nested-struct-fragment-input.slang index 727b5b1e5..a8c94e888 100644 --- a/tests/metal/nested-struct-fragment-input.slang +++ b/tests/metal/nested-struct-fragment-input.slang @@ -1,5 +1,6 @@ //TEST:SIMPLE(filecheck=METAL): -target metal -stage fragment -entry fragmentMain //TEST:SIMPLE(filecheck=METALLIB): -target metallib -stage fragment -entry fragmentMain +//TEST:SIMPLE(filecheck=WGSL): -target wgsl -stage fragment -entry fragmentMain // METAL: COARSEVERTEX_7 // METAL: COARSEVERTEX_6 @@ -63,6 +64,16 @@ float4 fragmentMain(FragmentStageInput input) // METAL-DAG: {{.*}}->p3{{.*}}->p2{{.*}}->p1{{.*}}= // METAL-DAG: {{.*}}->p3{{.*}}->p3{{.*}}->p1{{.*}}= + // WGSL-DAG: {{.*}}._S{{.*}}= + + // WGSL-DAG: {{.*}}.p2{{.*}}._S{{.*}}= + // WGSL-DAG: {{.*}}.p2{{.*}}.p2{{.*}}._S{{.*}}= + // WGSL-DAG: {{.*}}.p2{{.*}}.p3{{.*}}._S{{.*}}= + + // WGSL-DAG: {{.*}}.p3{{.*}}._S{{.*}}= + // WGSL-DAG: {{.*}}.p3{{.*}}.p2{{.*}}._S{{.*}}= + // WGSL-DAG: {{.*}}.p3{{.*}}.p3{{.*}}._S{{.*}}= + outputBuffer[0] = input.coarseVertex.p1 + input.coarseVertex.p2.p1 + +input.coarseVertex.p3.p1; return float4(0, 0, 0, 0); } diff --git a/tests/metal/nested-struct-fragment-output.slang b/tests/metal/nested-struct-fragment-output.slang index 1d002c124..4b29f8430 100644 --- a/tests/metal/nested-struct-fragment-output.slang +++ b/tests/metal/nested-struct-fragment-output.slang @@ -1,5 +1,6 @@ //TEST:SIMPLE(filecheck=METAL): -target metal -stage fragment -entry fragmentMain //TEST:SIMPLE(filecheck=METALLIB): -target metallib -stage fragment -entry fragmentMain +//TEST:SIMPLE(filecheck=WGSL): -target wgsl -stage fragment -entry fragmentMain //METAL-DAG: color(0) //METAL-DAG: color(1) @@ -10,6 +11,15 @@ //METAL-DAG: color(6) //METAL-NOT: color(7) +//WGSL-DAG: location(0) +//WGSL-DAG: location(1) +//WGSL-DAG: location(2) +//WGSL-DAG: location(3) +//WGSL-DAG: location(4) +//WGSL-DAG: location(5) +//WGSL-DAG: location(6) +//WGSL-NOT: location(7) + //METALLIB: @fragmentMain RWStructuredBuffer<float> outputBuffer; @@ -69,6 +79,16 @@ FragmentStageOutput fragmentMain(FragmentStageInput input) // METAL-DAG: ={{.*}}.p3{{.*}}.p2{{.*}}.p1 // METAL-DAG: ={{.*}}.p3{{.*}}.p3{{.*}}.p1 + // WGSL-DAG: ={{.*}}._S{{.*}} + + // WGSL-DAG: ={{.*}}.p2{{.*}}._S{{.*}} + // WGSL-DAG: ={{.*}}.p2{{.*}}.p2{{.*}}._S{{.*}} + // WGSL-DAG: ={{.*}}.p2{{.*}}.p3{{.*}}._S{{.*}} + + // WGSL-DAG: ={{.*}}.p3{{.*}}._S{{.*}} + // WGSL-DAG: ={{.*}}.p3{{.*}}.p2{{.*}}._S{{.*}} + // WGSL-DAG: ={{.*}}.p3{{.*}}.p3{{.*}}._S{{.*}} + outputBuffer[0] = 1; return output; } diff --git a/tests/metal/nested-struct-multi-entry-point-vertex.slang b/tests/metal/nested-struct-multi-entry-point-vertex.slang index 779b66704..5d2b3b1e0 100644 --- a/tests/metal/nested-struct-multi-entry-point-vertex.slang +++ b/tests/metal/nested-struct-multi-entry-point-vertex.slang @@ -2,17 +2,29 @@ //TEST:SIMPLE(filecheck=METALLIB1): -target metallib -stage vertex -entry vertexMain1 //TEST:SIMPLE(filecheck=METAL2): -target metal -stage vertex -entry vertexMain2 //TEST:SIMPLE(filecheck=METALLIB2): -target metallib -stage vertex -entry vertexMain2 +//TEST:SIMPLE(filecheck=WGSL1): -target wgsl -stage vertex -entry vertexMain1 +//TEST:SIMPLE(filecheck=WGSL2): -target wgsl -stage vertex -entry vertexMain2 //METALLIB1: @vertexMain1 //METAL1-DAG: attribute(0) //METAL1-DAG: attribute(1) //METAL1-NOT: attribute(2) +//WGSL1-DAG: fn vertexMain1 +//WGSL1-DAG: location(0) +//WGSL1-DAG: location(1) +//WGSL1-NOT: location(2) + //METALLIB2: @vertexMain2 //METAL2-DAG: attribute(0) //METAL2-DAG: attribute(1) //METAL2-DAG: attribute(2) +//WGSL2-DAG: fn vertexMain2 +//WGSL2-DAG: location(0) +//WGSL2-DAG: location(1) +//WGSL2-DAG: location(2) + struct SharedStruct { float4 position; @@ -42,4 +54,4 @@ struct VertexStageInput2 float4 vertexMain2(VertexStageInput2 vertex) { return vertex.assembledVertex.sharedData.position; -}
\ No newline at end of file +} diff --git a/tests/metal/no-struct-vertex-output.slang b/tests/metal/no-struct-vertex-output.slang index f4988b685..ae8b9f845 100644 --- a/tests/metal/no-struct-vertex-output.slang +++ b/tests/metal/no-struct-vertex-output.slang @@ -1,12 +1,16 @@ //TEST:SIMPLE(filecheck=METAL): -target metallib -stage vertex -entry vertexMain //TEST:SIMPLE(filecheck=METALLIB): -target metallib -stage vertex -entry vertexMain +//TEST:SIMPLE(filecheck=WGSL): -target wgsl -stage vertex -entry vertexMain //METAL-DAG: position //METALLIB: @vertexMain +//WGSL-DAG: @builtin(position) +//WGSL-DAG: @vertex + // Vertex Shader float4 vertexMain() { return float4(1,1,1,1); -}
\ No newline at end of file +} diff --git a/tests/metal/sv_target-complex-1.slang b/tests/metal/sv_target-complex-1.slang index a830ff3d2..1a479f4ff 100644 --- a/tests/metal/sv_target-complex-1.slang +++ b/tests/metal/sv_target-complex-1.slang @@ -1,5 +1,6 @@ -//TEST:SIMPLE(filecheck=CHECK): -target metal -//TEST:SIMPLE(filecheck=CHECK-ASM): -target metallib +//TEST:SIMPLE(filecheck=METAL): -target metal +//TEST:SIMPLE(filecheck=METAL-ASM): -target metallib +//TEST:SIMPLE(filecheck=WGSL): -target wgsl -entry fragmentMain -stage fragment struct NestedReturn { @@ -20,15 +21,21 @@ struct Output NestedReturn2 debug2 : SV_TaRget3; } -// CHECK-ASM: define {{.*}} @fragmentMain -// CHECK: color(0) -// CHECK-DAG: color(1) -// CHECK-DAG: color(2) -// CHECK-DAG: color(3) -// CHECK-DAG: color(4) +// METAL-ASM: define {{.*}} @fragmentMain +// METAL: color(0) +// METAL-DAG: color(1) +// METAL-DAG: color(2) +// METAL-DAG: color(3) +// METAL-DAG: color(4) + +// WGSL: location(0) +// WGSL-DAG: location(1) +// WGSL-DAG: location(2) +// WGSL-DAG: location(3) +// WGSL-DAG: location(4) [shader("fragment")] Output fragmentMain() { return { float4(1), {float4(2)}, float4(3) }; -}
\ No newline at end of file +} diff --git a/tests/metal/sv_target-complex-2.slang b/tests/metal/sv_target-complex-2.slang index 9cc59cc5f..5f3d166d5 100644 --- a/tests/metal/sv_target-complex-2.slang +++ b/tests/metal/sv_target-complex-2.slang @@ -1,5 +1,6 @@ -//TEST:SIMPLE(filecheck=CHECK): -target metal -//TEST:SIMPLE(filecheck=CHECK-ASM): -target metallib +//TEST:SIMPLE(filecheck=METAL): -target metal +//TEST:SIMPLE(filecheck=METAL-ASM): -target metallib +//TEST:SIMPLE(filecheck=WGSL): -target wgsl -entry fragmentMain -stage fragment struct NestedReturn { @@ -14,14 +15,19 @@ struct Output float4 Material : SV_Target2; } -// CHECK-ASM: define {{.*}} @fragmentMain -// CHECK: color(0) -// CHECK: color(1) -// CHECK-DAG: color(3) -// CHECK-DAG: color(2) +// METAL-ASM: define {{.*}} @fragmentMain +// METAL: color(0) +// METAL: color(1) +// METAL-DAG: color(3) +// METAL-DAG: color(2) + +// WGSL-DAG: location(0) +// WGSL-DAG: location(1) +// WGSL-DAG: location(3) +// WGSL-DAG: location(2) [shader("fragment")] Output fragmentMain() { return { float4(1), {float4(2), float4(2)}, float4(3) }; -}
\ No newline at end of file +} diff --git a/tests/wgsl/semantic-coverage.slang b/tests/wgsl/semantic-coverage.slang new file mode 100644 index 000000000..722f7180c --- /dev/null +++ b/tests/wgsl/semantic-coverage.slang @@ -0,0 +1,16 @@ +//TEST:SIMPLE(filecheck=WGSL): -target wgsl -stage fragment -entry main + +//WGSL-DAG: @builtin(sample_mask) +//WGSL-DAG: @fragment + +struct Out +{ + uint coverage : SV_Coverage; +}; + +Out main() +{ + Out output; + output.coverage = 1; + return output; +} diff --git a/tests/wgsl/semantic-depth.slang b/tests/wgsl/semantic-depth.slang new file mode 100644 index 000000000..65b29600a --- /dev/null +++ b/tests/wgsl/semantic-depth.slang @@ -0,0 +1,16 @@ +//TEST:SIMPLE(filecheck=WGSL): -target wgsl -stage fragment -entry main + +//WGSL-DAG: @builtin(frag_depth) +//WGSL-DAG: @fragment + +struct Out +{ + float depth : SV_Depth; +}; + +Out main() +{ + Out output; + output.depth = 1.0; + return output; +} diff --git a/tests/wgsl/semantic-dispatch-thread-id.slang b/tests/wgsl/semantic-dispatch-thread-id.slang new file mode 100644 index 000000000..9216c02da --- /dev/null +++ b/tests/wgsl/semantic-dispatch-thread-id.slang @@ -0,0 +1,9 @@ +//TEST:SIMPLE(filecheck=WGSL): -target wgsl -stage compute -entry main + +//WGSL-DAG: @builtin(global_invocation_id) +//WGSL-DAG: @compute + +void main(uint3 dtid : SV_DispatchThreadID) +{ + // Empty compute shader +} diff --git a/tests/wgsl/semantic-group-id.slang b/tests/wgsl/semantic-group-id.slang new file mode 100644 index 000000000..d83f85d8e --- /dev/null +++ b/tests/wgsl/semantic-group-id.slang @@ -0,0 +1,9 @@ +//TEST:SIMPLE(filecheck=WGSL): -target wgsl -stage compute -entry main + +//WGSL-DAG: @builtin(workgroup_id) +//WGSL-DAG: @compute + +void main(uint3 gid : SV_GroupID) +{ + // Empty compute shader +} diff --git a/tests/wgsl/semantic-group-index.slang b/tests/wgsl/semantic-group-index.slang new file mode 100644 index 000000000..06429ff39 --- /dev/null +++ b/tests/wgsl/semantic-group-index.slang @@ -0,0 +1,9 @@ +//TEST:SIMPLE(filecheck=WGSL): -target wgsl -stage compute -entry main + +//WGSL-DAG: @builtin(local_invocation_index) +//WGSL-DAG: @compute + +void main(uint idx : SV_GroupIndex) +{ + // Empty compute shader +} diff --git a/tests/wgsl/semantic-group-thread-id.slang b/tests/wgsl/semantic-group-thread-id.slang new file mode 100644 index 000000000..7646397d0 --- /dev/null +++ b/tests/wgsl/semantic-group-thread-id.slang @@ -0,0 +1,9 @@ +//TEST:SIMPLE(filecheck=WGSL): -target wgsl -stage compute -entry main + +//WGSL-DAG: @builtin(local_invocation_id) +//WGSL-DAG: @compute + +void main(uint3 gtid : SV_GroupThreadID) +{ + // Empty compute shader +} diff --git a/tests/wgsl/semantic-instance-id.slang b/tests/wgsl/semantic-instance-id.slang new file mode 100644 index 000000000..868d9149d --- /dev/null +++ b/tests/wgsl/semantic-instance-id.slang @@ -0,0 +1,9 @@ +//TEST:SIMPLE(filecheck=WGSL): -target wgsl -stage vertex -entry main + +//WGSL-DAG: @builtin(instance_index) +//WGSL-DAG: @vertex + +float4 main(uint instanceID : SV_InstanceID) : SV_Position +{ + return float4(1,1,1,1); +} diff --git a/tests/wgsl/semantic-is-front-face.slang b/tests/wgsl/semantic-is-front-face.slang new file mode 100644 index 000000000..d79ab672b --- /dev/null +++ b/tests/wgsl/semantic-is-front-face.slang @@ -0,0 +1,9 @@ +//TEST:SIMPLE(filecheck=WGSL): -target wgsl -stage fragment -entry main + +//WGSL-DAG: @builtin(front_facing) +//WGSL-DAG: @fragment + +float4 main(bool isFront : SV_IsFrontFace) : SV_Target +{ + return float4(1,1,1,1); +} diff --git a/tests/wgsl/semantic-position.slang b/tests/wgsl/semantic-position.slang new file mode 100644 index 000000000..28c047a04 --- /dev/null +++ b/tests/wgsl/semantic-position.slang @@ -0,0 +1,16 @@ +//TEST:SIMPLE(filecheck=WGSL): -target wgsl -stage vertex -entry main + +//WGSL-DAG: @builtin(position) +//WGSL-DAG: @vertex + +struct S +{ + float4 position : SV_Position; +}; + +S main() +{ + S output; + output.position = float4(0,0,0,1); + return output; +} diff --git a/tests/wgsl/semantic-sample-index.slang b/tests/wgsl/semantic-sample-index.slang new file mode 100644 index 000000000..bd347d94f --- /dev/null +++ b/tests/wgsl/semantic-sample-index.slang @@ -0,0 +1,9 @@ +//TEST:SIMPLE(filecheck=WGSL): -target wgsl -stage fragment -entry main + +//WGSL-DAG: @builtin(sample_index) +//WGSL-DAG: @fragment + +float4 main(uint sampleIndex : SV_SampleIndex) : SV_Target +{ + return float4(1,1,1,1); +} diff --git a/tests/wgsl/semantic-vertex-id.slang b/tests/wgsl/semantic-vertex-id.slang new file mode 100644 index 000000000..4120dc098 --- /dev/null +++ b/tests/wgsl/semantic-vertex-id.slang @@ -0,0 +1,9 @@ +//TEST:SIMPLE(filecheck=WGSL): -target wgsl -stage vertex -entry main + +//WGSL-DAG: @builtin(vertex_index) +//WGSL-DAG: @vertex + +float4 main(uint vertexID : SV_VertexID) : SV_Position +{ + return float4(1,1,1,1); +} |
