yum-mirror/slang

Making it easier to work with shaders

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

Julius IkkalaMinimal optional constraints (#7422)7349dc5cf

master
2.2 KiB95 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//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer
6RWStructuredBuffer<int> outputBuffer;
7
8interface IReleaseable
9{
10    [mutating]
11    void release();
12}
13
14struct Container<K, V>
15    where optional K : IReleaseable
16    where optional V : IReleaseable
17{
18    K k[2];
19    V v[2];
20
21    [mutating]
22    void erase(int index)
23    {
24        if (K is IReleaseable)
25            k[index].release();
26        if (V is IReleaseable)
27            v[index].release();
28    }
29}
30
31struct HeavyEntry: IReleaseable
32{
33    int index;
34    int value;
35
36    [mutating]
37    void release()
38    {
39        outputBuffer[index] = value;
40    }
41};
42
43struct LightEntry
44{
45    int value;
46};
47
48[numthreads(1, 1, 1)]
49void computeMain(int3 dispatchThreadID: SV_DispatchThreadID)
50{
51    { // Neither is IReleaseable
52        var c = Container<LightEntry, LightEntry>();
53        c.k[0] = LightEntry(1);
54        c.k[1] = LightEntry(2);
55        c.v[0] = LightEntry(3);
56        c.v[1] = LightEntry(4);
57        c.erase(0);
58        c.erase(1);
59    }
60    { // K is IReleaseable
61        var c = Container<HeavyEntry, LightEntry>();
62        c.k[0] = HeavyEntry(0,1);
63        c.k[1] = HeavyEntry(1,2);
64        c.v[0] = LightEntry(3);
65        c.v[1] = LightEntry(4);
66        // CHECK: 1
67        c.erase(0);
68        // CHECK-NEXT: 2
69        c.erase(1);
70    }
71    { // V is IReleaseable
72        var c = Container<LightEntry, HeavyEntry>();
73        c.k[0] = LightEntry(1);
74        c.k[1] = LightEntry(2);
75        c.v[0] = HeavyEntry(2,3);
76        c.v[1] = HeavyEntry(3,4);
77        // CHECK-NEXT: 3
78        c.erase(0);
79        // CHECK-NEXT: 4
80        c.erase(1);
81    }
82    { // K and V are IReleaseable
83        var c = Container<HeavyEntry, HeavyEntry>();
84        c.k[0] = HeavyEntry(4,5);
85        c.k[1] = HeavyEntry(6,7);
86        c.v[0] = HeavyEntry(5,6);
87        c.v[1] = HeavyEntry(7,8);
88        // CHECK-NEXT: 5
89        // CHECK-NEXT: 6
90        c.erase(0);
91        // CHECK-NEXT: 7
92        // CHECK-NEXT: 8
93        c.erase(1);
94    }
95}