yum-mirror/slang

Making it easier to work with shaders

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

James Helferty (NVIDIA)Enable metal tests (#8446)8086adc90

master
9.1 KiB210 linesraw
1//TEST:SIMPLE(filecheck=METAL): -target metal -stage compute -entry computeMain
2//TEST:SIMPLE(filecheck=METALLIB): -target metallib -stage compute -entry computeMain
3//TEST(compute, metal):COMPARE_COMPUTE_EX:-metal -compute -output-using-type
4//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type
5
6//METALLIB: @computeMain
7
8//TEST_INPUT: RWTexture2D(format=R32Uint, size=15, content=one):name uintTexture2D
9RWTexture2D<uint> uintTexture2D;
10//TEST_INPUT: RWTexture2D(format=R32Sint, size=15, content=one):name intTexture2D
11RWTexture2D<int> intTexture2D;
12
13//TEST_INPUT: RWTexture2D(format=R32Uint, size=15, content=one, arrayLength=2):name uintTexture2DArray
14RWTexture2DArray<uint> uintTexture2DArray;
15//TEST_INPUT: RWTexture2D(format=R32Sint, size=15, content=one, arrayLength=2):name intTexture2DArray
16RWTexture2DArray<int> intTexture2DArray;
17
18//TEST_INPUT: ubuffer(data=[0], stride=1, count=368):out,name outBuffer
19RWStructuredBuffer<int> outBuffer;
20
21void test()
22{
23    int valInt = 3;
24    int originalValueInt = 999;
25    int compareValueInt = 1;
26
27    uint valUInt = 3;
28    uint originalValueUInt = 999;
29    int compareValueUInt = 1;
30
31    // Texture2D
32// METAL: .atomic_fetch_add
33// METAL: .atomic_fetch_and
34// METAL: .atomic_fetch_max
35// METAL: .atomic_fetch_min
36// METAL: .atomic_fetch_or
37// METAL: .atomic_fetch_xor
38// METAL: .atomic_fetch_add
39// METAL: .atomic_fetch_and
40// METAL: .atomic_fetch_max
41// METAL: .atomic_fetch_min
42// METAL: .atomic_fetch_or
43// METAL: .atomic_fetch_xor
44// METAL: .atomic_exchange
45// METAL: .atomic_compare_exchange_weak
46// METAL: .atomic_compare_exchange_weak
47
48// METAL: .atomic_fetch_add
49// METAL: .atomic_fetch_and
50// METAL: .atomic_fetch_max
51// METAL: .atomic_fetch_min
52// METAL: .atomic_fetch_or
53// METAL: .atomic_fetch_xor
54// METAL: .atomic_fetch_add
55// METAL: .atomic_fetch_and
56// METAL: .atomic_fetch_max
57// METAL: .atomic_fetch_min
58// METAL: .atomic_fetch_or
59// METAL: .atomic_fetch_xor
60// METAL: .atomic_exchange
61// METAL: .atomic_compare_exchange_weak
62// METAL: .atomic_compare_exchange_weak
63    int o = 0;
64    int i = 0;
65    InterlockedAdd(uintTexture2D[uint2(i++, 0)], valUInt);
66    InterlockedAnd(uintTexture2D[uint2(i++, 0)], valUInt);
67    InterlockedMax(uintTexture2D[uint2(i++, 0)], valUInt);
68    InterlockedMin(uintTexture2D[uint2(i++, 0)], valUInt);
69    InterlockedOr(uintTexture2D[uint2(i++, 0)], valUInt);
70    InterlockedXor(uintTexture2D[uint2(i++, 0)], valUInt);
71    InterlockedAdd(uintTexture2D[uint2(i++, 0)], valUInt, originalValueUInt);
72    outBuffer[o++] = originalValueUInt;
73    InterlockedAnd(uintTexture2D[uint2(i++, 0)], valUInt, originalValueUInt);
74    outBuffer[o++] = originalValueUInt;
75    InterlockedMax(uintTexture2D[uint2(i++, 0)], valUInt, originalValueUInt);
76    outBuffer[o++] = originalValueUInt;
77    InterlockedMin(uintTexture2D[uint2(i++, 0)], valUInt, originalValueUInt);
78    outBuffer[o++] = originalValueUInt;
79    InterlockedOr(uintTexture2D[uint2(i++, 0)], valUInt, originalValueUInt);
80    outBuffer[o++] = originalValueUInt;
81    InterlockedXor(uintTexture2D[uint2(i++, 0)], valUInt, originalValueUInt);
82    outBuffer[o++] = originalValueUInt;
83    InterlockedExchange(uintTexture2D[uint2(i++, 0)], valUInt, originalValueUInt);
84    outBuffer[o++] = originalValueUInt;
85    InterlockedCompareExchange(uintTexture2D[uint2(i++, 0)], valUInt, compareValueUInt, originalValueUInt);
86    outBuffer[o++] = originalValueUInt;
87    InterlockedCompareStore(uintTexture2D[uint2(i++, 0)], valUInt, compareValueUInt);
88
89    i = 0;
90    InterlockedAdd(intTexture2D[uint2(i++, 0)], valInt);
91    InterlockedAnd(intTexture2D[uint2(i++, 0)], valInt);
92    InterlockedMax(intTexture2D[uint2(i++, 0)], valInt);
93    InterlockedMin(intTexture2D[uint2(i++, 0)], valInt);
94    InterlockedOr(intTexture2D[uint2(i++, 0)], valInt);
95    InterlockedXor(intTexture2D[uint2(i++, 0)], valInt);
96    InterlockedAdd(intTexture2D[uint2(i++, 0)], valInt, originalValueInt);
97    outBuffer[o++] = originalValueInt;
98    InterlockedAnd(intTexture2D[uint2(i++, 0)], valInt, originalValueInt);
99    outBuffer[o++] = originalValueInt;
100    InterlockedMax(intTexture2D[uint2(i++, 0)], valInt, originalValueInt);
101    outBuffer[o++] = originalValueInt;
102    InterlockedMin(intTexture2D[uint2(i++, 0)], valInt, originalValueInt);
103    outBuffer[o++] = originalValueInt;
104    InterlockedOr(intTexture2D[uint2(i++, 0)], valInt, originalValueInt);
105    outBuffer[o++] = originalValueInt;
106    InterlockedXor(intTexture2D[uint2(i++, 0)], valInt, originalValueInt);
107    outBuffer[o++] = originalValueInt;
108    InterlockedExchange(intTexture2D[uint2(i++, 0)], valInt, originalValueInt);
109    outBuffer[o++] = originalValueInt;
110    InterlockedCompareExchange(intTexture2D[uint2(i++, 0)], valInt, compareValueInt, originalValueInt);
111    outBuffer[o++] = originalValueInt;
112    InterlockedCompareStore(intTexture2D[uint2(i++, 0)], valInt, compareValueUInt);
113
114    // Texture2DArray
115// METAL: .atomic_fetch_add
116// METAL: .atomic_fetch_and
117// METAL: .atomic_fetch_max
118// METAL: .atomic_fetch_min
119// METAL: .atomic_fetch_or
120// METAL: .atomic_fetch_xor
121// METAL: .atomic_fetch_add
122// METAL: .atomic_fetch_and
123// METAL: .atomic_fetch_max
124// METAL: .atomic_fetch_min
125// METAL: .atomic_fetch_or
126// METAL: .atomic_fetch_xor
127// METAL: .atomic_exchange
128// METAL: .atomic_compare_exchange_weak
129// METAL: .atomic_compare_exchange_weak
130
131// METAL: .atomic_fetch_add
132// METAL: .atomic_fetch_and
133// METAL: .atomic_fetch_max
134// METAL: .atomic_fetch_min
135// METAL: .atomic_fetch_or
136// METAL: .atomic_fetch_xor
137// METAL: .atomic_fetch_add
138// METAL: .atomic_fetch_and
139// METAL: .atomic_fetch_max
140// METAL: .atomic_fetch_min
141// METAL: .atomic_fetch_or
142// METAL: .atomic_fetch_xor
143// METAL: .atomic_exchange
144// METAL: .atomic_compare_exchange_weak
145// METAL: .atomic_compare_exchange_weak
146    i = 0;
147    InterlockedAdd(uintTexture2DArray[uint3(i++, 0, 0)], valUInt);
148    InterlockedAnd(uintTexture2DArray[uint3(i++, 0, 0)], valUInt);
149    InterlockedMax(uintTexture2DArray[uint3(i++, 0, 0)], valUInt);
150    InterlockedMin(uintTexture2DArray[uint3(i++, 0, 0)], valUInt);
151    InterlockedOr(uintTexture2DArray[uint3(i++, 0, 0)], valUInt);
152    InterlockedXor(uintTexture2DArray[uint3(i++, 0, 0)], valUInt);
153    InterlockedAdd(uintTexture2DArray[uint3(i++, 0, 0)], valUInt, originalValueUInt);
154    outBuffer[o++] = originalValueUInt;
155    InterlockedAnd(uintTexture2DArray[uint3(i++, 0, 0)], valUInt, originalValueUInt);
156    outBuffer[o++] = originalValueUInt;
157    InterlockedMax(uintTexture2DArray[uint3(i++, 0, 0)], valUInt, originalValueUInt);
158    outBuffer[o++] = originalValueUInt;
159    InterlockedMin(uintTexture2DArray[uint3(i++, 0, 0)], valUInt, originalValueUInt);
160    outBuffer[o++] = originalValueUInt;
161    InterlockedOr(uintTexture2DArray[uint3(i++, 0, 0)], valUInt, originalValueUInt);
162    outBuffer[o++] = originalValueUInt;
163    InterlockedXor(uintTexture2DArray[uint3(i++, 0, 0)], valUInt, originalValueUInt);
164    outBuffer[o++] = originalValueUInt;
165    InterlockedExchange(uintTexture2DArray[uint3(i++, 0, 0)], valUInt, originalValueUInt);
166    outBuffer[o++] = originalValueUInt;
167    InterlockedCompareExchange(uintTexture2DArray[uint3(i++, 0, 0)], valUInt, compareValueUInt, originalValueUInt);
168    outBuffer[o++] = originalValueUInt;
169    InterlockedCompareStore(uintTexture2DArray[uint3(i++, 0, 0)], valUInt, compareValueUInt);
170
171    i = 0;
172    InterlockedAdd(intTexture2DArray[uint3(i++, 0, 0)], valInt);
173    InterlockedAnd(intTexture2DArray[uint3(i++, 0, 0)], valInt);
174    InterlockedMax(intTexture2DArray[uint3(i++, 0, 0)], valInt);
175    InterlockedMin(intTexture2DArray[uint3(i++, 0, 0)], valInt);
176    InterlockedOr(intTexture2DArray[uint3(i++, 0, 0)], valInt);
177    InterlockedXor(intTexture2DArray[uint3(i++, 0, 0)], valInt);
178    InterlockedAdd(intTexture2DArray[uint3(i++, 0, 0)], valInt, originalValueInt);
179    outBuffer[o++] = originalValueInt;
180    InterlockedAnd(intTexture2DArray[uint3(i++, 0, 0)], valInt, originalValueInt);
181    outBuffer[o++] = originalValueInt;
182    InterlockedMax(intTexture2DArray[uint3(i++, 0, 0)], valInt, originalValueInt);
183    outBuffer[o++] = originalValueInt;
184    InterlockedMin(intTexture2DArray[uint3(i++, 0, 0)], valInt, originalValueInt);
185    outBuffer[o++] = originalValueInt;
186    InterlockedOr(intTexture2DArray[uint3(i++, 0, 0)], valInt, originalValueInt);
187    outBuffer[o++] = originalValueInt;
188    InterlockedXor(intTexture2DArray[uint3(i++, 0, 0)], valInt, originalValueInt);
189    outBuffer[o++] = originalValueInt;
190    InterlockedExchange(intTexture2DArray[uint3(i++, 0, 0)], valInt, originalValueInt);
191    outBuffer[o++] = originalValueInt;
192    InterlockedCompareExchange(intTexture2DArray[uint3(i++, 0, 0)], valInt, compareValueInt, originalValueInt);
193    outBuffer[o++] = originalValueInt;
194    InterlockedCompareStore(intTexture2DArray[uint3(i++, 0, 0)], valUInt, compareValueUInt);
195
196    // Copy to output
197    int test_count = i;
198    for (i=0; i<test_count; i++) {
199        outBuffer[o + test_count*0 + i] = uintTexture2D[uint2(i, 0)];
200        outBuffer[o + test_count*1 + i] = intTexture2D[uint2(i, 0)];
201        outBuffer[o + test_count*2 + i] = uintTexture2DArray[uint3(i, 0, 0)];
202        outBuffer[o + test_count*3 + i] = intTexture2DArray[uint3(i, 0, 0)];
203    }
204}
205
206[numthreads(1, 1, 1)]
207void computeMain()
208{
209    test();
210}