yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Julius IkkalaImplement throw & catch statements (#6916)57c3f9382

master
1.6 KiB91 linesraw
1//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj
2//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -vk -shaderobj
3//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -cpu -shaderobj
4
5// CHECK: 2
6// CHECK-NEXT: 0
7// CHECK-NEXT: 11
8// CHECK-NEXT: 12
9// CHECK-NEXT: 6
10// CHECK-NEXT: 1
11
12//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0], stride=4):out,name=outputBuffer
13RWStructuredBuffer<int> outputBuffer;
14
15enum MyError1
16{
17    Fail
18};
19
20enum MyError2
21{
22    Fail1,
23    Fail2 = 0x12
24};
25
26void throwingFunc() throws MyError1
27{
28    throw MyError1.Fail;
29}
30
31int maybeBadFunc1(int n) throws MyError1
32{
33    if (n == 1) throw MyError1.Fail;
34    return n;
35}
36
37int maybeBadFunc2(int n) throws MyError2
38{
39    if (n == 2) throw MyError2.Fail2;
40    return n;
41}
42
43int multiCatchFunc(int n)
44{
45    do
46    {
47        let a = try maybeBadFunc1(n);
48        let b = try maybeBadFunc2(n);
49        return a+b;
50    }
51    catch(err: MyError1)
52    {
53        return 0x11;
54    }
55    catch(err: MyError2)
56    {
57        return reinterpret<int>(err);
58    }
59}
60
61int containedThrow()
62{
63    do
64    {
65        throw MyError1.Fail;
66    }
67    catch(err: MyError1)
68    {
69        return 1;
70    }
71}
72
73[numthreads(1, 1, 1)]
74void computeMain(int3 dispatchThreadID: SV_DispatchThreadID)
75{
76    do
77    {
78        try throwingFunc();
79        outputBuffer[0] = 1;
80    }
81    catch(err: MyError1)
82    {
83        outputBuffer[0] = 2;
84    }
85
86    outputBuffer[1] = multiCatchFunc(0);
87    outputBuffer[2] = multiCatchFunc(1);
88    outputBuffer[3] = multiCatchFunc(2);
89    outputBuffer[4] = multiCatchFunc(3);
90    outputBuffer[5] = containedThrow();
91}