diff options
Diffstat (limited to 'tests')
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 |
