From 6406523511037987d8b8ab881aea41389afd57eb Mon Sep 17 00:00:00 2001 From: Yong He Date: Thu, 12 Aug 2021 13:14:15 -0700 Subject: Further implementation of SPIRV direct emit. (#1920) * Further implementation of SPIRV direct emit. This change implements: - Struct, Vector, Matrix and Unsized Array types. - Basic arithmetic opcodes, vector construct, swizzle etc. - getElementPtr, getElement, fieldAddress, extractField. - SPIRV target intrinsics with SPIRV asm code in stdlib. - RWStructuredBuffer and StructuredBuffer. - Pointer storage class propagation. - Control flow. * Fix. --- tests/spirv/direct-spirv-compute-simple.slang | 23 +++++++++++ .../direct-spirv-compute-simple.slang.expected.txt | 4 ++ tests/spirv/direct-spirv-control-flow-2.slang | 47 ++++++++++++++++++++++ .../direct-spirv-control-flow-2.slang.expected.txt | 5 +++ tests/spirv/direct-spirv-control-flow.slang | 30 ++++++++++++++ .../direct-spirv-control-flow.slang.expected.txt | 4 ++ 6 files changed, 113 insertions(+) create mode 100644 tests/spirv/direct-spirv-compute-simple.slang create mode 100644 tests/spirv/direct-spirv-compute-simple.slang.expected.txt create mode 100644 tests/spirv/direct-spirv-control-flow-2.slang create mode 100644 tests/spirv/direct-spirv-control-flow-2.slang.expected.txt create mode 100644 tests/spirv/direct-spirv-control-flow.slang create mode 100644 tests/spirv/direct-spirv-control-flow.slang.expected.txt (limited to 'tests') diff --git a/tests/spirv/direct-spirv-compute-simple.slang b/tests/spirv/direct-spirv-compute-simple.slang new file mode 100644 index 000000000..39b9074ed --- /dev/null +++ b/tests/spirv/direct-spirv-compute-simple.slang @@ -0,0 +1,23 @@ +// direct-spirv-compute-simple.slang + +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -xslang -emit-spirv-directly + +// Test runinng a shader generated from direct SPIR-V emit. + +//TEST_INPUT:set resultBuffer = out ubuffer(data=[0 0 0 0], stride=4) +RWStructuredBuffer resultBuffer; + +[numthreads(4,1,1)] +void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) +{ + uint threadId = dispatchThreadID.x; + uint result = threadId + 1; + result = result - 1; + result = result * 2; + result = result / 2; + result = result % 3; + result = (result ^ 7); + result = (result & 7); + result = (result | 8); + resultBuffer[threadId] = result; +} diff --git a/tests/spirv/direct-spirv-compute-simple.slang.expected.txt b/tests/spirv/direct-spirv-compute-simple.slang.expected.txt new file mode 100644 index 000000000..4fc6bca7a --- /dev/null +++ b/tests/spirv/direct-spirv-compute-simple.slang.expected.txt @@ -0,0 +1,4 @@ +F +E +D +F \ No newline at end of file diff --git a/tests/spirv/direct-spirv-control-flow-2.slang b/tests/spirv/direct-spirv-control-flow-2.slang new file mode 100644 index 000000000..cc908100e --- /dev/null +++ b/tests/spirv/direct-spirv-control-flow-2.slang @@ -0,0 +1,47 @@ +// direct-spirv-control-flow-2.slang + +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type -xslang -emit-spirv-directly + +// Test direct SPIR-V emit on control flows. + +//TEST_INPUT:set resultBuffer = out ubuffer(data=[0 0 0 0], stride=4) +RWStructuredBuffer resultBuffer; + +uint test(uint p) +{ + int result = 0; + for (int i = 0; i < 5; i++) + { + result += i*2; + } + switch (p) + { + case 0: + result = result - 1; + break; + case 1: + result = result + 1; + break; + default: + result = result * 2; + break; + } + if (p > 2) + { + switch (p) + { + case 3: + result++; + break; + } + } + return result; +} + +[numthreads(4,1,1)] +void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) +{ + uint threadId = dispatchThreadID.x; + uint result = test(threadId); + resultBuffer[threadId] = result; +} diff --git a/tests/spirv/direct-spirv-control-flow-2.slang.expected.txt b/tests/spirv/direct-spirv-control-flow-2.slang.expected.txt new file mode 100644 index 000000000..36929d66f --- /dev/null +++ b/tests/spirv/direct-spirv-control-flow-2.slang.expected.txt @@ -0,0 +1,5 @@ +type: uint32_t +19 +21 +40 +41 diff --git a/tests/spirv/direct-spirv-control-flow.slang b/tests/spirv/direct-spirv-control-flow.slang new file mode 100644 index 000000000..9efddeb12 --- /dev/null +++ b/tests/spirv/direct-spirv-control-flow.slang @@ -0,0 +1,30 @@ +// direct-spirv-control-flow.slang + +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -xslang -emit-spirv-directly + +// Test direct SPIRV emit on control fl. + +//TEST_INPUT:set resultBuffer = out ubuffer(data=[0 0 0 0], stride=4) +RWStructuredBuffer resultBuffer; + +uint test(uint p) +{ + int result = 0; + if (p == 0) + { + result = 5; + } + else + { + result = 6; + } + return result; +} + +[numthreads(4,1,1)] +void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) +{ + uint threadId = dispatchThreadID.x; + uint result = test(threadId); + resultBuffer[threadId] = result; +} diff --git a/tests/spirv/direct-spirv-control-flow.slang.expected.txt b/tests/spirv/direct-spirv-control-flow.slang.expected.txt new file mode 100644 index 000000000..c0bcc1c4a --- /dev/null +++ b/tests/spirv/direct-spirv-control-flow.slang.expected.txt @@ -0,0 +1,4 @@ +5 +6 +6 +6 -- cgit v1.2.3