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
10.2 KiB352 linesraw
1//TEST:SIMPLE(filecheck=MTL):-target metal -entry computeMain -stage compute -DMETAL
2//TEST:SIMPLE(filecheck=LIB):-target metallib -entry computeMain -stage compute -DMETAL
3//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-slang -compute -dx12 -profile cs_6_0 -shaderobj -output-using-type
4//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-vk -compute -shaderobj -output-using-type
5//TEST(compute, metal):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-metal -compute -shaderobj -output-using-type
6
7//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute -shaderobj -output-using-type
8//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj -output-using-type
9
10
11//TEST_INPUT:ubuffer(data=[0 1 2 3], stride=4):name=uintBuffer
12RWStructuredBuffer<uint> uintBuffer;
13//TEST_INPUT:ubuffer(data=[0 1 2 3], stride=4):name=intBuffer
14RWStructuredBuffer<int> intBuffer;
15
16groupshared uint shareMemUI[4];
17groupshared int shareMemI[4];
18
19//TEST_INPUT: ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
20RWStructuredBuffer<float> outputBuffer;
21
22[numthreads(4, 1, 1)]
23void computeMain(uint groupIndex : SV_GroupIndex)
24{
25    if (groupIndex == 0)
26    {
27        for (int i = 0; i < 4; ++i)
28        {
29            shareMemUI[i] = 0U;
30            shareMemI[i] = 0;
31        }
32    }
33    AllMemoryBarrierWithGroupSync();
34    
35    int idx = groupIndex;
36    float val = 0.0f;
37
38    // InterlockedAdd
39    //MTL: atomic_uint threadgroup*{{.*}}shareMemUI
40    //LIB: call {{.*}}.atomic.local.add.u.i32
41    InterlockedAdd(shareMemUI[idx], uint(1));
42    val += shareMemUI[idx];
43
44    //MTL: atomic_int threadgroup*{{.*}}shareMemI
45    //LIB: call {{.*}}.atomic.local.add.s.i32
46    InterlockedAdd(shareMemI[idx],  2);
47    val += shareMemI[idx];
48
49    //MTL: atomic_uint device*{{.*}}uintBuffer
50    //LIB: call {{.*}}.atomic.global.add.u.i32
51    InterlockedAdd(uintBuffer[idx], 1);
52    val += uintBuffer[idx];
53
54    //MTL: atomic_int device*{{.*}}intBuffer
55    //LIB: call {{.*}}.atomic.global.add.s.i32
56    InterlockedAdd(intBuffer[idx], 2);
57    val += intBuffer[idx];
58
59    //LIB: call {{.*}}.atomic.local.add.s.i32
60    InterlockedAdd(shareMemI[idx], -1);
61    val += shareMemI[idx];
62
63    //LIB: call {{.*}}.atomic.global.add.s.i32
64    InterlockedAdd(intBuffer[idx], -1);
65    val += intBuffer[idx];
66
67    // InterlockedAdd - original_value
68    uint origui = 0;
69    //LIB: call {{.*}}.atomic.local.add.u.i32
70    InterlockedAdd(shareMemUI[idx], 1, origui);
71    val += shareMemUI[idx];
72    val += origui;
73
74    int origi = 0;
75    //LIB: call {{.*}}.atomic.local.add.s.i32
76    InterlockedAdd(shareMemI[idx], 2, origi);
77    val += shareMemI[idx];
78    val += origi;
79
80    //LIB: call {{.*}}.atomic.global.add.u.i32
81    InterlockedAdd(uintBuffer[idx], 1, origui);
82    val += uintBuffer[idx];
83    val += origui;
84
85    //LIB: call {{.*}}.atomic.global.add.s.i32
86    InterlockedAdd(intBuffer[idx], 2, origi);
87    val += intBuffer[idx];
88    val += origi;
89
90    //LIB: call {{.*}}.atomic.local.add.s.i32
91    InterlockedAdd(shareMemI[idx], -1, origi);
92    val += shareMemI[idx];
93    val += origi;
94
95    //LIB: call {{.*}}.atomic.global.add.s.i32
96    InterlockedAdd(intBuffer[idx], -1, origi);
97    val += intBuffer[idx];
98    val += origi;
99
100    // InterlockedAnd
101    //LIB: call {{.*}}.atomic.local.and.u.i32
102    InterlockedAnd(shareMemUI[idx], 255);
103    val += shareMemUI[idx];
104
105    //LIB: call {{.*}}.atomic.local.and.s.i32
106    InterlockedAnd(shareMemI[idx], 255);
107    val += shareMemI[idx];
108
109    //LIB: call {{.*}}.atomic.global.and.u.i32
110    InterlockedAnd(uintBuffer[idx], 255);
111    val += uintBuffer[idx];
112
113    //LIB: call {{.*}}.atomic.global.and.s.i32
114    InterlockedAnd(intBuffer[idx], 255);
115    val += intBuffer[idx];
116
117    // InterlockedAnd - original_value
118    //LIB: call {{.*}}.atomic.local.and.u.i32
119    InterlockedAnd(shareMemUI[idx], 255, origui);
120    val += shareMemUI[idx];
121    val += origui;
122
123    //LIB: call {{.*}}.atomic.local.and.s.i32
124    InterlockedAnd(shareMemI[idx], 255, origi);
125    val += shareMemI[idx];
126    val += origi;
127
128    //LIB: call {{.*}}.atomic.global.and.u.i32
129    InterlockedAnd(uintBuffer[idx], 255, origui);
130    val += uintBuffer[idx];
131    val += origui;
132
133    //LIB: call {{.*}}.atomic.global.and.s.i32
134    InterlockedAnd(intBuffer[idx], 255, origi);
135    val += intBuffer[idx];
136    val += origi;
137
138    // InterlockedCompareExchange
139    //LIB: call {{.*}}.atomic.local.cmpxchg.weak.i32
140    InterlockedCompareExchange(shareMemUI[idx], 1, 0, origui);
141    val += shareMemUI[idx];
142    val += origui;
143
144    //LIB: call {{.*}}.atomic.local.cmpxchg.weak.i32
145    InterlockedCompareExchange(shareMemI[idx], 1, 0, origi);
146    val += shareMemI[idx];
147    val += origi;
148
149    //LIB: call {{.*}}.atomic.global.cmpxchg.weak.i32
150    InterlockedCompareExchange(uintBuffer[idx], 1, 0, origui);
151    val += uintBuffer[idx];
152    val += origui;
153
154    //LIB: call {{.*}}.atomic.global.cmpxchg.weak.i32
155    InterlockedCompareExchange(intBuffer[idx], 1, 0, origi);
156    val += intBuffer[idx];
157    val += origi;
158
159    // InterlockedCompareStore is not supported by Metal
160#if !defined(METAL)
161    InterlockedCompareStore(shareMemUI[idx], 255, 0);
162    val += shareMemUI[idx];
163
164    InterlockedCompareStore(shareMemI[idx], 255, 0);
165    val += shareMemI[idx];
166
167    InterlockedCompareStore(uintBuffer[idx], 255, 0);
168    val += uintBuffer[idx];
169
170    InterlockedCompareStore(intBuffer[idx], 255, 0);
171    val += intBuffer[idx];
172#endif
173
174    // InterlockedExchange
175    //LIB: call {{.*}}.atomic.local.xchg.i32
176    InterlockedExchange(shareMemUI[idx], 1, origui);
177    val += shareMemUI[idx];
178    val += origui;
179
180    //LIB: call {{.*}}.atomic.local.xchg.i32
181    InterlockedExchange(shareMemI[idx], 1, origi);
182    val += shareMemI[idx];
183    val += origi;
184
185    //LIB: call {{.*}}.atomic.global.xchg.i32
186    InterlockedExchange(uintBuffer[idx], 1, origui);
187    val += uintBuffer[idx];
188    val += origui;
189
190    //LIB: call {{.*}}.atomic.global.xchg.i32
191    InterlockedExchange(intBuffer[idx], 1, origi);
192    val += intBuffer[idx];
193    val += origi;
194
195    // InterlockedMax
196    //LIB: call {{.*}}.atomic.local.max.u.i32
197    InterlockedMax(shareMemUI[idx], 0);
198    val += shareMemUI[idx];
199
200    //LIB: call {{.*}}.atomic.local.max.s.i32
201    InterlockedMax(shareMemI[idx], 0);
202    val += shareMemI[idx];
203
204    //LIB: call {{.*}}.atomic.global.max.u.i32
205    InterlockedMax(uintBuffer[idx], 0);
206    val += uintBuffer[idx];
207
208    //LIB: call {{.*}}.atomic.global.max.s.i32
209    InterlockedMax(intBuffer[idx], 0);
210    val += intBuffer[idx];
211
212    // InterlockedMax - original_value
213    //LIB: call {{.*}}.atomic.local.max.u.i32
214    InterlockedMax(shareMemUI[idx], 0, origui);
215    val += shareMemUI[idx];
216    val += origui;
217
218    //LIB: call {{.*}}.atomic.local.max.s.i32
219    InterlockedMax(shareMemI[idx], 0, origi);
220    val += shareMemI[idx];
221    val += origi;
222
223    //LIB: call {{.*}}.atomic.global.max.u.i32
224    InterlockedMax(uintBuffer[idx], 0, origui);
225    val += uintBuffer[idx];
226    val += origui;
227
228    //LIB: call {{.*}}.atomic.global.max.s.i32
229    InterlockedMax(intBuffer[idx], 0, origi);
230    val += intBuffer[idx];
231    val += origi;
232
233    // InterlockedMin
234    //LIB: call {{.*}}.atomic.local.min.u.i32
235    InterlockedMin(shareMemUI[idx], 0);
236    val += shareMemUI[idx];
237
238    //LIB: call {{.*}}.atomic.local.min.s.i32
239    InterlockedMin(shareMemI[idx], 0);
240    val += shareMemI[idx];
241
242    //LIB: call {{.*}}.atomic.global.min.u.i32
243    InterlockedMin(uintBuffer[idx], 0);
244    val += uintBuffer[idx];
245
246    //LIB: call {{.*}}.atomic.global.min.s.i32
247    InterlockedMin(intBuffer[idx], 0);
248    val += intBuffer[idx];
249
250    // InterlockedMin - original_value
251    //LIB: call {{.*}}.atomic.local.min.u.i32
252    InterlockedMin(shareMemUI[idx], 0, origui);
253    val += shareMemUI[idx];
254    val += origui;
255
256    //LIB: call {{.*}}.atomic.local.min.s.i32
257    InterlockedMin(shareMemI[idx], 0, origi);
258    val += shareMemI[idx];
259    val += origi;
260
261    //LIB: call {{.*}}.atomic.global.min.u.i32
262    InterlockedMin(uintBuffer[idx], 0, origui);
263    val += uintBuffer[idx];
264    val += origui;
265
266    //LIB: call {{.*}}.atomic.global.min.s.i32
267    InterlockedMin(intBuffer[idx], 0, origi);
268    val += intBuffer[idx];
269    val += origi;
270
271    // InterlockedOr
272    //LIB: call {{.*}}.atomic.local.or.u.i32
273    InterlockedOr(shareMemUI[idx], 2);
274    val += shareMemUI[idx];
275
276    //LIB: call {{.*}}.atomic.local.or.s.i32
277    InterlockedOr(shareMemI[idx], 4);
278    val += shareMemI[idx];
279
280    //LIB: call {{.*}}.atomic.global.or.u.i32
281    InterlockedOr(uintBuffer[idx], 6);
282    val += uintBuffer[idx];
283
284    //LIB: call {{.*}}.atomic.global.or.s.i32
285    InterlockedOr(intBuffer[idx], 8);
286    val += intBuffer[idx];
287
288    // InterlockedOr - original_value
289    //LIB: call {{.*}}.atomic.local.or.u.i32
290    InterlockedOr(shareMemUI[idx], 2, origui);
291    val += shareMemUI[idx];
292    val += origui;
293
294    //LIB: call {{.*}}.atomic.local.or.s.i32
295    InterlockedOr(shareMemI[idx], 4, origi);
296    val += shareMemI[idx];
297    val += origi;
298
299    //LIB: call {{.*}}.atomic.global.or.u.i32
300    InterlockedOr(uintBuffer[idx], 6, origui);
301    val += uintBuffer[idx];
302    val += origui;
303
304    //LIB: call {{.*}}.atomic.global.or.s.i32
305    InterlockedOr(intBuffer[idx], 8, origi);
306    val += intBuffer[idx];
307    val += origi;
308
309    // InterlockedXor
310    //LIB: call {{.*}}.atomic.local.xor.u.i32
311    InterlockedXor(shareMemUI[idx], 2);
312    val += shareMemUI[idx];
313
314    //LIB: call {{.*}}.atomic.local.xor.s.i32
315    InterlockedXor(shareMemI[idx], 4);
316    val += shareMemI[idx];
317
318    //LIB: call {{.*}}.atomic.global.xor.u.i32
319    InterlockedXor(uintBuffer[idx], 6);
320    val += uintBuffer[idx];
321
322    //LIB: call {{.*}}.atomic.global.xor.s.i32
323    InterlockedXor(intBuffer[idx], 8);
324    val += intBuffer[idx];
325
326    // InterlockedXor - original_value
327    //LIB: call {{.*}}.atomic.local.xor.u.i32
328    InterlockedXor(shareMemUI[idx], 2, origui);
329    val += shareMemUI[idx];
330    val += origui;
331
332    //LIB: call {{.*}}.atomic.local.xor.s.i32
333    InterlockedXor(shareMemI[idx], 4, origi);
334    val += shareMemI[idx];
335    val += origi;
336
337    //LIB: call {{.*}}.atomic.global.xor.u.i32
338    InterlockedXor(uintBuffer[idx], 6, origui);
339    val += uintBuffer[idx];
340    val += origui;
341
342    //LIB: call {{.*}}.atomic.global.xor.s.i32
343    InterlockedXor(intBuffer[idx], 8, origi);
344    val += intBuffer[idx];
345    val += origi;
346
347    // BUF:      184
348    // BUF-NEXT: 207
349    // BUF-NEXT: 230
350    // BUF-NEXT: 253
351    outputBuffer[idx] = val;
352}