summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-active-product.slang28
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-active-product.slang.expected.txt0
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-broadcast-lane-at-vk.slang30
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-broadcast-lane-at-vk.slang.expected.txt4
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-broadcast-lane-at.slang43
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-broadcast-lane-at.slang.expected.txt4
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-diverge.slang32
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-diverge.slang.expected.txt4
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-equality.slang33
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-equality.slang.expected.txt4
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-is-first-lane.slang28
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-is-first-lane.slang.expected.txt16
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-mask-prefix.slang26
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-mask-prefix.slang.expected.txt8
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-matrix.slang39
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-matrix.slang.expected.txt8
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-prefix-product.slang27
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-prefix-product.slang.expected.txt8
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-prefix-sum.slang25
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-prefix-sum.slang.expected.txt8
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-read-lane-at-vk.slang46
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-read-lane-at-vk.slang.expected.txt4
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-read-lane-at.slang56
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-read-lane-at.slang.expected.txt4
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-shuffle-vk.slang34
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-shuffle-vk.slang.expected.txt4
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-shuffle.slang44
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-shuffle.slang.expected.txt4
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-vector.slang31
-rw-r--r--tests/hlsl-intrinsic/wave-mask/wave-vector.slang.expected.txt8
30 files changed, 610 insertions, 0 deletions
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-active-product.slang b/tests/hlsl-intrinsic/wave-mask/wave-active-product.slang
new file mode 100644
index 000000000..3135586a5
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-active-product.slang
@@ -0,0 +1,28 @@
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(8, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ const int idx = int(dispatchThreadID.x);
+ const WaveMask mask0 = 0xff;
+
+ const WaveMask mask1 = WaveMaskBallot(mask0, idx < 3);
+
+ if (idx < 3)
+ {
+ // Diverge!!
+ outputBuffer[idx] = -1;
+ return;
+ }
+
+ const WaveMask mask2 = mask0 & ~mask1;
+
+ outputBuffer[idx] = WaveMaskProduct(mask2, idx);
+} \ No newline at end of file
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-active-product.slang.expected.txt b/tests/hlsl-intrinsic/wave-mask/wave-active-product.slang.expected.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-active-product.slang.expected.txt
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-broadcast-lane-at-vk.slang b/tests/hlsl-intrinsic/wave-mask/wave-broadcast-lane-at-vk.slang
new file mode 100644
index 000000000..94a44df97
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-broadcast-lane-at-vk.slang
@@ -0,0 +1,30 @@
+//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(4, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ const WaveMask mask = 0xf;
+
+ int idx = int(dispatchThreadID.x);
+
+ int value = 0;
+
+ // Scalar
+
+ value += WaveMaskBroadcastLaneAt(mask, idx, 1);
+
+ // vector
+
+ {
+ float2 v = float2(idx + 1, idx + 2);
+ float2 readValue = WaveMaskBroadcastLaneAt(mask, v, 4 & 3);
+
+ value += int(readValue[0] + readValue[1]);
+ }
+
+ outputBuffer[idx] = value;
+} \ No newline at end of file
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-broadcast-lane-at-vk.slang.expected.txt b/tests/hlsl-intrinsic/wave-mask/wave-broadcast-lane-at-vk.slang.expected.txt
new file mode 100644
index 000000000..e785149d2
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-broadcast-lane-at-vk.slang.expected.txt
@@ -0,0 +1,4 @@
+4
+4
+4
+4
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-broadcast-lane-at.slang b/tests/hlsl-intrinsic/wave-mask/wave-broadcast-lane-at.slang
new file mode 100644
index 000000000..62d29085f
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-broadcast-lane-at.slang
@@ -0,0 +1,43 @@
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0
+// Disabled on VK because glsl can't do WaveReadLaneAt on matrix.
+//DISABLE_TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(4, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ int idx = int(dispatchThreadID.x);
+
+ const WaveMask mask = 0xf;
+
+ int value = 0;
+
+ // Scalar
+
+ value += WaveMaskBroadcastLaneAt(mask, idx, 1);
+
+ // vector
+
+ {
+ float2 v = float2(idx + 1, idx + 2);
+ float2 readValue = WaveMaskBroadcastLaneAt(mask, v, 2);
+
+ value += int(readValue[0] + readValue[1]);
+ }
+
+ // matrix
+ {
+ matrix<int, 2, 2> v = matrix<int, 2, 2>(idx, idx - 1, idx * 3, idx - 2);
+
+ matrix<int, 2, 2> readValue = WaveMaskBroadcastLaneAt(mask, v, 3);
+
+ value += int(readValue[0][0] + readValue[0][1] + readValue[1][0] + readValue[1][1]);
+ }
+
+ outputBuffer[idx] = value;
+} \ No newline at end of file
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-broadcast-lane-at.slang.expected.txt b/tests/hlsl-intrinsic/wave-mask/wave-broadcast-lane-at.slang.expected.txt
new file mode 100644
index 000000000..5ce1f8639
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-broadcast-lane-at.slang.expected.txt
@@ -0,0 +1,4 @@
+17
+17
+17
+17
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-diverge.slang b/tests/hlsl-intrinsic/wave-mask/wave-diverge.slang
new file mode 100644
index 000000000..51b7d3aeb
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-diverge.slang
@@ -0,0 +1,32 @@
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(4, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ const WaveMask mask0 = 0xf;
+
+ int idx = int(dispatchThreadID.x);
+
+ int value = 0;
+
+ const WaveMask mask1 = WaveMaskBallot(mask0, idx == 2);
+
+ if (idx == 2)
+ {
+ // diverge
+ return;
+ }
+
+ const WaveMask mask2 = mask0 & ~mask1;
+
+ value = WaveMaskMin(mask2, idx + 1);
+
+ outputBuffer[idx] = value;
+} \ No newline at end of file
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-diverge.slang.expected.txt b/tests/hlsl-intrinsic/wave-mask/wave-diverge.slang.expected.txt
new file mode 100644
index 000000000..68b8a88e2
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-diverge.slang.expected.txt
@@ -0,0 +1,4 @@
+1
+1
+0
+1
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-equality.slang b/tests/hlsl-intrinsic/wave-mask/wave-equality.slang
new file mode 100644
index 000000000..13887b2c8
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-equality.slang
@@ -0,0 +1,33 @@
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -render-features cuda_sm_7_0
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(4, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ const WaveMask mask = 0xf;
+
+ int idx = int(dispatchThreadID.x);
+
+ int value = 0;
+
+ // Scalar
+
+ value |= WaveMaskAllEqual(mask, idx * 0 + 1) ? 1 : 0; // true
+ value |= WaveMaskAllEqual(mask, idx & 2) ? 2 : 0; // false
+
+ // Vector
+
+ int2 v0 = int2(idx & 0xf0, (idx & 0xf00) + 1); // (0, 1)
+ int2 v1 = int2(idx & 2, (idx & 2) + 1);
+
+ value |= WaveMaskAllEqual(mask, v0) ? 0x10 : 0; // true
+ value |= WaveMaskAllEqual(mask, v1) ? 0x20 : 0; // false
+
+ outputBuffer[idx] = value;
+} \ No newline at end of file
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-equality.slang.expected.txt b/tests/hlsl-intrinsic/wave-mask/wave-equality.slang.expected.txt
new file mode 100644
index 000000000..2bf571888
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-equality.slang.expected.txt
@@ -0,0 +1,4 @@
+11
+11
+11
+11
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-is-first-lane.slang b/tests/hlsl-intrinsic/wave-mask/wave-is-first-lane.slang
new file mode 100644
index 000000000..2b332bfb5
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-is-first-lane.slang
@@ -0,0 +1,28 @@
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-cuda -compute
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(8, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ const WaveMask mask0 = 0xff;
+
+ int idx = int(dispatchThreadID.x);
+
+ const WaveMask mask1 = WaveMaskBallot(mask0, idx < 3);
+ if (idx < 3)
+ {
+ // Diverge!!
+ outputBuffer[idx] = -1;
+ return;
+ }
+
+ const WaveMask mask2 = mask0 & ~mask1;
+
+ outputBuffer[idx] = WaveMaskIsFirstLane(mask2);
+} \ No newline at end of file
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-is-first-lane.slang.expected.txt b/tests/hlsl-intrinsic/wave-mask/wave-is-first-lane.slang.expected.txt
new file mode 100644
index 000000000..43debbc9d
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-is-first-lane.slang.expected.txt
@@ -0,0 +1,16 @@
+FFFFFFFF
+FFFFFFFF
+FFFFFFFF
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-mask-prefix.slang b/tests/hlsl-intrinsic/wave-mask/wave-mask-prefix.slang
new file mode 100644
index 000000000..a2f25d71b
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-mask-prefix.slang
@@ -0,0 +1,26 @@
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute
+// We need SM6.5 for these tests
+// Disable because version of dxc we are currently using doesn't support SM6.5
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile sm_6_5
+// Disabled because we don't have GLSL intrinsics for these it seems
+//DISABLE_TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -render-features cuda_sm_7_0
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(8, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ int idx = int(dispatchThreadID.x);
+
+ int value = 0;
+
+ WaveMask mask = 0xff;
+
+ // Scalar
+ value += WaveMaskPrefixSum(mask, 1 << idx);
+
+ outputBuffer[idx] = value;
+} \ No newline at end of file
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-mask-prefix.slang.expected.txt b/tests/hlsl-intrinsic/wave-mask/wave-mask-prefix.slang.expected.txt
new file mode 100644
index 000000000..6ec6deeea
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-mask-prefix.slang.expected.txt
@@ -0,0 +1,8 @@
+0
+1
+3
+7
+F
+1F
+3F
+7F
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-matrix.slang b/tests/hlsl-intrinsic/wave-mask/wave-matrix.slang
new file mode 100644
index 000000000..dadce4051
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-matrix.slang
@@ -0,0 +1,39 @@
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0
+//DISABLE_TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(8, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ const WaveMask mask = 0xff;
+
+ const int idx = int(dispatchThreadID.x);
+
+ // NOTE! dxc only supports bit ops on uint and associated types NOT int
+ // Also GLSL does not have built in support for int matrices. So we'll just try with float for now
+ // GLSL does not support matrix types for Wave like intrinsics
+
+ matrix<int, 2, 2> v0 = matrix<int, 2, 2>(idx + 1, idx + 2, idx + 3, idx + 4);
+ matrix<float, 2, 2> v1 = matrix<float, 2, 2>(v0) + matrix<float, 2, 2>(1, 1, 1, 1);
+
+
+ matrix<uint, 2, 2> uv0 = matrix<uint, 2, 2>(v0[0][0], v0[0][1], v0[1][0], v0[0][1]);
+
+ matrix<int, 2, 2> r0 = WaveMaskSum(mask, v0);
+ matrix<float, 2, 2> r1 = WaveMaskSum(mask, v1);
+ matrix<uint, 2, 2> r2 = WaveMaskBitXor(mask, uv0);
+ matrix<uint, 2, 2> r3 = WaveMaskBitOr(mask, uv0);
+ matrix<uint, 2, 2> r4 = WaveMaskBitAnd(mask, uv0);
+
+ matrix<uint, 2, 2> r5 = r2 + r3 + r4;
+ matrix<int, 2, 2> r6 = matrix<int, 2, 2>(r5[0][0], r5[0][1], r5[1][0], r5[1][1]);
+
+ matrix<int, 2, 2> r = r0 + matrix<int, 2, 2>(r1) + r6;
+
+ outputBuffer[idx] = r[0][0] + r[0][1] + r[1][0] + r[1][1];
+} \ No newline at end of file
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-matrix.slang.expected.txt b/tests/hlsl-intrinsic/wave-mask/wave-matrix.slang.expected.txt
new file mode 100644
index 000000000..23f9285c3
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-matrix.slang.expected.txt
@@ -0,0 +1,8 @@
+1EC
+1EC
+1EC
+1EC
+1EC
+1EC
+1EC
+1EC
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-prefix-product.slang b/tests/hlsl-intrinsic/wave-mask/wave-prefix-product.slang
new file mode 100644
index 000000000..14ac8d652
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-prefix-product.slang
@@ -0,0 +1,27 @@
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(8, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ WaveMask mask = 0xff;
+
+ int idx = int(dispatchThreadID.x);
+
+
+ float2 v1 = float2(1, idx + 1);
+
+ int r0 = WaveMaskPrefixProduct(mask, idx + 1);
+ float2 r1 = WaveMaskPrefixProduct(mask, v1);
+
+ int r2 = int(r1.x) + int(r1.y) - 1;
+
+ outputBuffer[idx] = r0 + (r2 << 16);
+
+} \ No newline at end of file
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-prefix-product.slang.expected.txt b/tests/hlsl-intrinsic/wave-mask/wave-prefix-product.slang.expected.txt
new file mode 100644
index 000000000..1b233efaf
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-prefix-product.slang.expected.txt
@@ -0,0 +1,8 @@
+10001
+10001
+20002
+60006
+180018
+780078
+2D002D0
+13B013B0
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-prefix-sum.slang b/tests/hlsl-intrinsic/wave-mask/wave-prefix-sum.slang
new file mode 100644
index 000000000..f756398b8
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-prefix-sum.slang
@@ -0,0 +1,25 @@
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(8, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ WaveMask mask = 0xff;
+
+ int idx = int(dispatchThreadID.x);
+
+ float2 v1 = float2(1, 1 << idx);
+
+ int r0 = WaveMaskPrefixSum(mask, 1 << idx);
+ float2 r1 = WaveMaskPrefixSum(mask, v1);
+
+ int r2 = int(r1.x) + int(r1.y) - idx;
+
+ outputBuffer[idx] = r0 + (r2 << 16);
+} \ No newline at end of file
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-prefix-sum.slang.expected.txt b/tests/hlsl-intrinsic/wave-mask/wave-prefix-sum.slang.expected.txt
new file mode 100644
index 000000000..4b4230415
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-prefix-sum.slang.expected.txt
@@ -0,0 +1,8 @@
+0
+10001
+30003
+70007
+F000F
+1F001F
+3F003F
+7F007F
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-read-lane-at-vk.slang b/tests/hlsl-intrinsic/wave-mask/wave-read-lane-at-vk.slang
new file mode 100644
index 000000000..e0464ae68
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-read-lane-at-vk.slang
@@ -0,0 +1,46 @@
+// This is similar to wave-lane-at.slang but tests more limited supported types for vk.
+// We have this 'simple' test, because we can't do matrix (or imat) operations on GLSL/Vk target
+
+//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+// `The input lane index must be uniform across the wave.`.
+// The same restriction applies to glsl/SPIR-V 1.5
+// So we are going to use the input buffer to achieve this.
+
+//TEST_INPUT:ubuffer(data=[1 2 3 0], stride=4):name inputBuffer
+RWStructuredBuffer<int> inputBuffer;
+
+[numthreads(4, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ WaveMask mask = 0xf;
+
+ int idx = int(dispatchThreadID.x);
+
+ int value = 0;
+
+ for (int i = 0; i < 4; ++i)
+ {
+ // Scalar
+
+ // The landId is 'dynamic' but it also uniform across the wave (as required by spec)
+ const int laneId = inputBuffer[i];
+
+ value += WaveMaskReadLaneAt(mask, idx, laneId);
+
+ // vector
+
+ {
+ float2 v = float2(idx + 1, idx + 2);
+ float2 readValue = WaveMaskReadLaneAt(mask, v, (laneId + 1) & 3);
+
+ value += int(readValue[0] + readValue[1]);
+ }
+ }
+
+ outputBuffer[idx] = value;
+} \ No newline at end of file
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-read-lane-at-vk.slang.expected.txt b/tests/hlsl-intrinsic/wave-mask/wave-read-lane-at-vk.slang.expected.txt
new file mode 100644
index 000000000..4e98888c6
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-read-lane-at-vk.slang.expected.txt
@@ -0,0 +1,4 @@
+1E
+1E
+1E
+1E
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-read-lane-at.slang b/tests/hlsl-intrinsic/wave-mask/wave-read-lane-at.slang
new file mode 100644
index 000000000..1b231fbc1
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-read-lane-at.slang
@@ -0,0 +1,56 @@
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0
+// Disabled on VK because glsl can't do WaveReadLaneAt on matrix.
+//DISABLE_TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+// Note from HLSL: `The input lane index must be uniform across the wave.`.
+// The same restriction applies to glsl/SPIR-V 1.5
+// So we are going to use the input buffer to achieve this.
+
+//TEST_INPUT:ubuffer(data=[1 2 3 0], stride=4):name inputBuffer
+RWStructuredBuffer<int> inputBuffer;
+
+[numthreads(4, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ WaveMask mask = 0xf;
+
+ int idx = int(dispatchThreadID.x);
+
+ int value = 0;
+
+ for (int i = 0; i < 4; ++i)
+ {
+ // Scalar
+
+ // The laneId is 'dynamic' but it also uniform across the wave (as required by spec)
+ const int laneId = inputBuffer[i];
+
+ value += WaveMaskReadLaneAt(mask, idx, laneId);
+
+ // vector
+
+ {
+ float2 v = float2(idx + 1, idx + 2);
+ float2 readValue = WaveMaskReadLaneAt(mask, v, (laneId + 1) & 3);
+
+ value += int(readValue[0] + readValue[1]);
+ }
+
+ // matrix
+ {
+ matrix<int, 2, 2> v = matrix<int, 2, 2>(idx, idx - 1, idx * 3, idx - 2);
+
+ matrix<int, 2, 2> readValue = WaveMaskReadLaneAt(mask, v, (laneId - 1) & 3);
+
+ value += int(readValue[0][0] + readValue[0][1] + readValue[1][0] + readValue[1][1]);
+ }
+ }
+
+ outputBuffer[idx] = value;
+} \ No newline at end of file
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-read-lane-at.slang.expected.txt b/tests/hlsl-intrinsic/wave-mask/wave-read-lane-at.slang.expected.txt
new file mode 100644
index 000000000..c6167dbae
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-read-lane-at.slang.expected.txt
@@ -0,0 +1,4 @@
+36
+36
+36
+36
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-shuffle-vk.slang b/tests/hlsl-intrinsic/wave-mask/wave-shuffle-vk.slang
new file mode 100644
index 000000000..fa9f4b3e5
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-shuffle-vk.slang
@@ -0,0 +1,34 @@
+// Disabled because main tests is wave-shuffle.slang, this just tests VK
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(4, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ const WaveMask mask = 0xf;
+
+ int idx = int(dispatchThreadID.x);
+
+ int value = 0;
+
+ // Scalar
+
+ value += WaveMaskShuffle(mask, idx, (idx + 1) & 3);
+
+ // vector
+
+ {
+ float2 v = float2(idx + 1, idx + 2);
+ float2 readValue = WaveMaskShuffle(mask, v, (idx - 1) & 3);
+
+ value += int(readValue[0] + readValue[1]);
+ }
+
+ outputBuffer[idx] = value;
+} \ No newline at end of file
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-shuffle-vk.slang.expected.txt b/tests/hlsl-intrinsic/wave-mask/wave-shuffle-vk.slang.expected.txt
new file mode 100644
index 000000000..b20444fc5
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-shuffle-vk.slang.expected.txt
@@ -0,0 +1,4 @@
+A
+5
+8
+7
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-shuffle.slang b/tests/hlsl-intrinsic/wave-mask/wave-shuffle.slang
new file mode 100644
index 000000000..a559aae8f
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-shuffle.slang
@@ -0,0 +1,44 @@
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute
+//Disabled on D3D, because in general WaveShuffle requires hardware that doesn't have the 'uniform laneId across Wave' restriction.
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0
+// Disabled because vk doesn't currently support matrix types. See wave-shuffle-vk.slang
+//DISABLE_TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(4, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ const WaveMask mask = 0xf;
+
+ int idx = int(dispatchThreadID.x);
+
+ int value = 0;
+
+ // Scalar
+
+ value += WaveMaskShuffle(mask, idx, (idx + 1) & 3);
+
+ // vector
+
+ {
+ float2 v = float2(idx + 1, idx + 2);
+ float2 readValue = WaveMaskShuffle(mask, v, (idx - 1) & 3);
+
+ value += int(readValue[0] + readValue[1]);
+ }
+
+ // matrix
+ {
+ matrix<int, 2, 2> v = matrix<int, 2, 2>(idx, idx - 1, idx * 3, idx - 2);
+
+ matrix<int, 2, 2> readValue = WaveMaskShuffle(mask, v, (idx - 1) & 3);
+
+ value += int(readValue[0][0] + readValue[0][1] + readValue[1][0] + readValue[1][1]);
+ }
+
+ outputBuffer[idx] = value;
+} \ No newline at end of file
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-shuffle.slang.expected.txt b/tests/hlsl-intrinsic/wave-mask/wave-shuffle.slang.expected.txt
new file mode 100644
index 000000000..a327b0804
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-shuffle.slang.expected.txt
@@ -0,0 +1,4 @@
+19
+2
+B
+10
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-vector.slang b/tests/hlsl-intrinsic/wave-mask/wave-vector.slang
new file mode 100644
index 000000000..083e1b5b9
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-vector.slang
@@ -0,0 +1,31 @@
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(8, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ const WaveMask mask = 0xff;
+
+ const int idx = int(dispatchThreadID.x);
+
+ int2 v0 = int2(idx + 1, idx + 2);
+ float2 v1 = float2(idx + 2, idx + 3);
+ // NOTE! dxc only supports bit ops on uint and associated types NOT int
+ uint2 uv0 = v0;
+
+ int2 r0 = WaveMaskSum(mask, v0);
+ float2 r1 = WaveMaskSum(mask, v1);
+ int2 r2 = WaveMaskBitXor(mask, uv0);
+ int2 r3 = WaveMaskBitOr(mask, uv0);
+ int2 r4 = WaveMaskBitAnd(mask, uv0);
+
+ int2 r = r0 + int2(r1) + r2 + r3 + r4;
+
+ outputBuffer[idx] = r.x + r.y;
+} \ No newline at end of file
diff --git a/tests/hlsl-intrinsic/wave-mask/wave-vector.slang.expected.txt b/tests/hlsl-intrinsic/wave-mask/wave-vector.slang.expected.txt
new file mode 100644
index 000000000..eb6984bb6
--- /dev/null
+++ b/tests/hlsl-intrinsic/wave-mask/wave-vector.slang.expected.txt
@@ -0,0 +1,8 @@
+D6
+D6
+D6
+D6
+D6
+D6
+D6
+D6