diff options
| author | Julius Ikkala <julius.ikkala@gmail.com> | 2025-04-07 06:08:29 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-06 20:08:29 -0700 |
| commit | 1b82501dd0c74347cda4a2c7fe5a84fd610bb485 (patch) | |
| tree | f283a491e0545aa6b890a988ac9fb14f192b4663 /tests | |
| parent | 680fb0b4e9cbb65d46677183a3f68630be1f6179 (diff) | |
Add defer statement (#6619)
Diffstat (limited to 'tests')
20 files changed, 436 insertions, 0 deletions
diff --git a/tests/language-feature/defer/autodiff.slang b/tests/language-feature/defer/autodiff.slang new file mode 100644 index 000000000..e7dd871fa --- /dev/null +++ b/tests/language-feature/defer/autodiff.slang @@ -0,0 +1,56 @@ +//TEST(compute):COMPARE_COMPUTE: -shaderobj -output-using-type +//TEST(compute):COMPARE_COMPUTE: -vk -shaderobj -output-using-type +//TEST(compute):COMPARE_COMPUTE:-cpu -shaderobj -output-using-type + +//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer<float> outputBuffer; + +[Differentiable] +float testFunc(float a) +{ + float x = a / (abs(a) + 0.5f); + { + defer x = sqrt(x); + + x = x * 0.5f + 0.5f; + + if (a < 0) + { + x += 1.0f; + // NOTE suprising but correct behaviour here: 'defer' occurs after + // the return statement's value has been computed, so mutating 'x' + // no longer affects anything. + return x; + } + + x += 0.5f; + } + return x; +} + +[numthreads(1, 1, 1)] +void computeMain(int3 dispatchThreadID: SV_DispatchThreadID) +{ + outputBuffer[0] = testFunc(0); + outputBuffer[1] = testFunc(0.5); + outputBuffer[2] = testFunc(-0.5); + + DifferentialPair<float> d1 = diffPair(0.0); + bwd_diff(testFunc)(d1, 1.0); + DifferentialPair<float> d2 = diffPair(0.5); + bwd_diff(testFunc)(d2, 1.0); + DifferentialPair<float> d3 = diffPair(-0.5); + bwd_diff(testFunc)(d3, 1.0); + + outputBuffer[3] = d1.d; + outputBuffer[4] = d2.d; + outputBuffer[5] = d3.d; + + d1 = diffPair(0.0, 1.0); + d2 = diffPair(0.5, 1.0); + d3 = diffPair(-0.5, 1.0); + + outputBuffer[6] = fwd_diff(testFunc)(d1).d; + outputBuffer[7] = fwd_diff(testFunc)(d2).d; + outputBuffer[8] = fwd_diff(testFunc)(d3).d; +} diff --git a/tests/language-feature/defer/autodiff.slang.expected.txt b/tests/language-feature/defer/autodiff.slang.expected.txt new file mode 100644 index 000000000..471a03b7c --- /dev/null +++ b/tests/language-feature/defer/autodiff.slang.expected.txt @@ -0,0 +1,10 @@ +type: float +1.000000 +1.118034 +1.250000 +0.500000 +0.111803 +0.250000 +0.500000 +0.111803 +0.250000 diff --git a/tests/language-feature/defer/complex-block.slang b/tests/language-feature/defer/complex-block.slang new file mode 100644 index 000000000..c2d232035 --- /dev/null +++ b/tests/language-feature/defer/complex-block.slang @@ -0,0 +1,36 @@ +//TEST(compute):COMPARE_COMPUTE: -shaderobj +//TEST(compute):COMPARE_COMPUTE: -vk -shaderobj +//TEST(compute):COMPARE_COMPUTE:-cpu -shaderobj + +//TEST_INPUT:ubuffer(data=[0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer<int> outputBuffer; + +[numthreads(1, 1, 1)] +void computeMain(int3 dispatchThreadID: SV_DispatchThreadID) +{ + int i = 0; + int j = 0; + defer { + if (j == 2) + { + outputBuffer[i++] = j; + } + else + { + outputBuffer[i++] = 2048; + } + } + defer { + if (j == 1) + { + outputBuffer[i++] = j; + } + else + { + outputBuffer[i++] = 1024; + } + j++; + } + outputBuffer[i++] = j; + j++; +} diff --git a/tests/language-feature/defer/complex-block.slang.expected.txt b/tests/language-feature/defer/complex-block.slang.expected.txt new file mode 100644 index 000000000..4539bbf2d --- /dev/null +++ b/tests/language-feature/defer/complex-block.slang.expected.txt @@ -0,0 +1,3 @@ +0 +1 +2 diff --git a/tests/language-feature/defer/deferred-loop.slang b/tests/language-feature/defer/deferred-loop.slang new file mode 100644 index 000000000..0108dbbc1 --- /dev/null +++ b/tests/language-feature/defer/deferred-loop.slang @@ -0,0 +1,33 @@ +//TEST(compute):COMPARE_COMPUTE: -shaderobj +//TEST(compute):COMPARE_COMPUTE: -vk -shaderobj +//TEST(compute):COMPARE_COMPUTE:-cpu -shaderobj + +//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer<int> outputBuffer; + +[numthreads(1, 1, 1)] +void computeMain(int3 dispatchThreadID: SV_DispatchThreadID) +{ + int i = 0; + int j = 0; + defer { + defer outputBuffer[i++] = j*3+3; + outputBuffer[i++] = 1; + for (int k = 0; k < 6; ++k) + { + defer outputBuffer[i++] = k*3+2; + + if(k == j-4) + continue; + + outputBuffer[i++] = k*3; + + if(k == j) + break; + + outputBuffer[i++] = k*3+1; + } + } + outputBuffer[i++] = j; + j += 4; +} diff --git a/tests/language-feature/defer/deferred-loop.slang.expected.txt b/tests/language-feature/defer/deferred-loop.slang.expected.txt new file mode 100644 index 000000000..6b625c8b4 --- /dev/null +++ b/tests/language-feature/defer/deferred-loop.slang.expected.txt @@ -0,0 +1,15 @@ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +E +F diff --git a/tests/language-feature/defer/generics.slang b/tests/language-feature/defer/generics.slang new file mode 100644 index 000000000..7ecd7de31 --- /dev/null +++ b/tests/language-feature/defer/generics.slang @@ -0,0 +1,48 @@ +//TEST(compute):COMPARE_COMPUTE: -shaderobj +//TEST(compute):COMPARE_COMPUTE: -vk -shaderobj +//TEST(compute):COMPARE_COMPUTE:-cpu -shaderobj + +//TEST_INPUT:ubuffer(data=[0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer<int> outputBuffer; + +interface IDroppable +{ + void drop(inout int i); +}; + +interface IDiscombobulatable +{ + void discombobulate(inout int i, int param); +} + +void genericFunc<T>(int param) + where T : IDroppable, IDiscombobulatable +{ + T t; + int i = 0; + defer t.drop(i); + + int p = param; + defer t.discombobulate(i, p); + t.discombobulate(i, p); + p += 1; +} + +struct TestType : IDroppable, IDiscombobulatable +{ + void drop(inout int i) + { + outputBuffer[i++] = 0xFF; + } + + void discombobulate(inout int i, int param) + { + outputBuffer[i++] = param; + } +} + +[numthreads(1, 1, 1)] +void computeMain(int3 dispatchThreadID: SV_DispatchThreadID) +{ + genericFunc<TestType>(2); +} diff --git a/tests/language-feature/defer/generics.slang.expected.txt b/tests/language-feature/defer/generics.slang.expected.txt new file mode 100644 index 000000000..4a7a64d00 --- /dev/null +++ b/tests/language-feature/defer/generics.slang.expected.txt @@ -0,0 +1,3 @@ +2 +3 +FF diff --git a/tests/language-feature/defer/loop.slang b/tests/language-feature/defer/loop.slang new file mode 100644 index 000000000..b51955a14 --- /dev/null +++ b/tests/language-feature/defer/loop.slang @@ -0,0 +1,30 @@ +//TEST(compute):COMPARE_COMPUTE: -shaderobj +//TEST(compute):COMPARE_COMPUTE: -vk -shaderobj +//TEST(compute):COMPARE_COMPUTE:-cpu -shaderobj + +//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer<int> outputBuffer; + +[numthreads(1, 1, 1)] +void computeMain(int3 dispatchThreadID: SV_DispatchThreadID) +{ + int i = 0; + defer outputBuffer[i++] = 128; + for (int j = 0; j < 4; j++) + { + defer outputBuffer[i++] = j*2+1; + outputBuffer[i++] = j*2; + } + + for (int j = 0; j < 5; j++) + { + if (j == 1) + continue; + defer outputBuffer[i++] = j*2+1; + if (j == 2) + continue; + outputBuffer[i++] = j*2; + if (j == 3) + break; + } +} diff --git a/tests/language-feature/defer/loop.slang.expected.txt b/tests/language-feature/defer/loop.slang.expected.txt new file mode 100644 index 000000000..cc7323432 --- /dev/null +++ b/tests/language-feature/defer/loop.slang.expected.txt @@ -0,0 +1,14 @@ +0 +1 +2 +3 +4 +5 +6 +7 +0 +1 +5 +6 +7 +80 diff --git a/tests/language-feature/defer/multiple-return.slang b/tests/language-feature/defer/multiple-return.slang new file mode 100644 index 000000000..a364c288e --- /dev/null +++ b/tests/language-feature/defer/multiple-return.slang @@ -0,0 +1,35 @@ +//TEST(compute):COMPARE_COMPUTE: -shaderobj +//TEST(compute):COMPARE_COMPUTE: -vk -shaderobj +//DISABLE_TEST(compute):COMPARE_COMPUTE:-cpu -shaderobj +// ^ Due to DeviceMemoryBarrier() missing. + +//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer<int> outputBuffer; + +void testFunc(int index1, int index2, int condition) +{ + outputBuffer[index1] = 128; + defer outputBuffer[index1] = 0; + + outputBuffer[index2] = 3; + DeviceMemoryBarrier(); + + if (condition == 0) + { + outputBuffer[index2] = 1; + return; + } + + if (condition == 1) + { + outputBuffer[index2] = 2; + return; + } +} + +[numthreads(1, 1, 1)] +void computeMain(int3 dispatchThreadID: SV_DispatchThreadID) +{ + for (int i = 0; i < 3; ++i) + testFunc(2*i, 2*i+1, i); +} diff --git a/tests/language-feature/defer/multiple-return.slang.expected.txt b/tests/language-feature/defer/multiple-return.slang.expected.txt new file mode 100644 index 000000000..5b06fc619 --- /dev/null +++ b/tests/language-feature/defer/multiple-return.slang.expected.txt @@ -0,0 +1,6 @@ +0 +1 +0 +2 +0 +3 diff --git a/tests/language-feature/defer/nested.slang b/tests/language-feature/defer/nested.slang new file mode 100644 index 000000000..6de518209 --- /dev/null +++ b/tests/language-feature/defer/nested.slang @@ -0,0 +1,18 @@ +//TEST(compute):COMPARE_COMPUTE: -shaderobj +//TEST(compute):COMPARE_COMPUTE: -vk -shaderobj +//TEST(compute):COMPARE_COMPUTE:-cpu -shaderobj + +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer<int> outputBuffer; + +[numthreads(1, 1, 1)] +void computeMain(int3 dispatchThreadID: SV_DispatchThreadID) +{ + int i = 0; + defer { + defer outputBuffer[i++] = 3; + defer outputBuffer[i++] = 2; + outputBuffer[i++] = 1; + } + outputBuffer[i++] = 0; +} diff --git a/tests/language-feature/defer/nested.slang.expected.txt b/tests/language-feature/defer/nested.slang.expected.txt new file mode 100644 index 000000000..bc856dafa --- /dev/null +++ b/tests/language-feature/defer/nested.slang.expected.txt @@ -0,0 +1,4 @@ +0 +1 +2 +3 diff --git a/tests/language-feature/defer/no-block.slang b/tests/language-feature/defer/no-block.slang new file mode 100644 index 000000000..e78c91112 --- /dev/null +++ b/tests/language-feature/defer/no-block.slang @@ -0,0 +1,28 @@ +//TEST(compute):COMPARE_COMPUTE: -shaderobj +//TEST(compute):COMPARE_COMPUTE: -vk -shaderobj +//TEST(compute):COMPARE_COMPUTE:-cpu -shaderobj + +//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer<int> outputBuffer; + +[numthreads(1, 1, 1)] +void computeMain(int3 dispatchThreadID: SV_DispatchThreadID) +{ + int i = 0; + defer defer outputBuffer[i++] = 0xFF; + + outputBuffer[i++] = 0; + + for (int j = 0; j < 4; j++) + defer outputBuffer[i++] = j; + + if (i == 5) + defer outputBuffer[i++] = 0x80; + + while (i < 7) + defer outputBuffer[i++] = 0x81; + + do defer outputBuffer[i++] = 0x82; while (false); + + outputBuffer[i++] = 5; +} diff --git a/tests/language-feature/defer/no-block.slang.expected.txt b/tests/language-feature/defer/no-block.slang.expected.txt new file mode 100644 index 000000000..ad8c0f654 --- /dev/null +++ b/tests/language-feature/defer/no-block.slang.expected.txt @@ -0,0 +1,10 @@ +0 +0 +1 +2 +3 +80 +81 +82 +5 +FF diff --git a/tests/language-feature/defer/scoped.slang b/tests/language-feature/defer/scoped.slang new file mode 100644 index 000000000..447c02357 --- /dev/null +++ b/tests/language-feature/defer/scoped.slang @@ -0,0 +1,33 @@ +//TEST(compute):COMPARE_COMPUTE: -shaderobj +//TEST(compute):COMPARE_COMPUTE: -vk -shaderobj +//TEST(compute):COMPARE_COMPUTE:-cpu -shaderobj + +//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer<int> outputBuffer; + +[numthreads(1, 1, 1)] +void computeMain(int3 dispatchThreadID: SV_DispatchThreadID) +{ + int i = 0; + defer outputBuffer[i++] = 7; + + { + defer outputBuffer[i++] = 0; + } + + outputBuffer[i++] = 1; + + { + defer outputBuffer[i++] = 2; + } + + for (int j = 0; j < 4; ++j) + { + { + defer outputBuffer[i++] = j+3; + if (j == 2) + continue; + } + outputBuffer[i++] = j+0x13; + } +} diff --git a/tests/language-feature/defer/scoped.slang.expected.txt b/tests/language-feature/defer/scoped.slang.expected.txt new file mode 100644 index 000000000..8d280bd37 --- /dev/null +++ b/tests/language-feature/defer/scoped.slang.expected.txt @@ -0,0 +1,11 @@ +0 +1 +2 +3 +13 +4 +14 +5 +6 +16 +7 diff --git a/tests/language-feature/defer/switch.slang b/tests/language-feature/defer/switch.slang new file mode 100644 index 000000000..704e6e884 --- /dev/null +++ b/tests/language-feature/defer/switch.slang @@ -0,0 +1,34 @@ +//TEST(compute):COMPARE_COMPUTE: -shaderobj +//TEST(compute):COMPARE_COMPUTE: -vk -shaderobj +//TEST(compute):COMPARE_COMPUTE:-cpu -shaderobj + +//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer<int> outputBuffer; + +void testFunc(int i, int param) +{ + defer outputBuffer[i++] = param*3+2; + switch(param) + { + case 0: + defer outputBuffer[i++] = 1; + outputBuffer[i++] = 0; + break; + case 1: + defer outputBuffer[i++] = 4; + outputBuffer[i++] = 3; + break; + default: + defer outputBuffer[i++] = 7; + outputBuffer[i++] = 6; + break; + }; +} + +[numthreads(1, 1, 1)] +void computeMain(int3 dispatchThreadID: SV_DispatchThreadID) +{ + testFunc(0, 0); + testFunc(3, 1); + testFunc(6, 2); +} diff --git a/tests/language-feature/defer/switch.slang.expected.txt b/tests/language-feature/defer/switch.slang.expected.txt new file mode 100644 index 000000000..1000f9005 --- /dev/null +++ b/tests/language-feature/defer/switch.slang.expected.txt @@ -0,0 +1,9 @@ +0 +1 +2 +3 +4 +5 +6 +7 +8 |
