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
8.7 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: RWTexture1D(format=R32Uint, size=15, content=one):name uintTexture1D
9RWTexture1D<uint> uintTexture1D;
10//TEST_INPUT: RWTexture1D(format=R32Sint, size=15, content=one):name intTexture1D
11RWTexture1D<int> intTexture1D;
12
13//TEST_INPUT: RWTexture1D(format=R32Uint, size=15, content=one, arrayLength=2):name uintTexture1DArray
14RWTexture1DArray<uint> uintTexture1DArray;
15//TEST_INPUT: RWTexture1D(format=R32Sint, size=15, content=one, arrayLength=2):name intTexture1DArray
16RWTexture1DArray<int> intTexture1DArray;
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    // Texture1D
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(uintTexture1D[i++], valUInt);
66    InterlockedAnd(uintTexture1D[i++], valUInt);
67    InterlockedMax(uintTexture1D[i++], valUInt);
68    InterlockedMin(uintTexture1D[i++], valUInt);
69    InterlockedOr(uintTexture1D[i++], valUInt);
70    InterlockedXor(uintTexture1D[i++], valUInt);
71    InterlockedAdd(uintTexture1D[i++], valUInt, originalValueUInt);
72    outBuffer[o++] = originalValueUInt;
73    InterlockedAnd(uintTexture1D[i++], valUInt, originalValueUInt);
74    outBuffer[o++] = originalValueUInt;
75    InterlockedMax(uintTexture1D[i++], valUInt, originalValueUInt);
76    outBuffer[o++] = originalValueUInt;
77    InterlockedMin(uintTexture1D[i++], valUInt, originalValueUInt);
78    outBuffer[o++] = originalValueUInt;
79    InterlockedOr(uintTexture1D[i++], valUInt, originalValueUInt);
80    outBuffer[o++] = originalValueUInt;
81    InterlockedXor(uintTexture1D[i++], valUInt, originalValueUInt);
82    outBuffer[o++] = originalValueUInt;
83    InterlockedExchange(uintTexture1D[i++], valUInt, originalValueUInt);
84    outBuffer[o++] = originalValueUInt;
85    InterlockedCompareExchange(uintTexture1D[i++], valUInt, compareValueUInt, originalValueUInt);
86    outBuffer[o++] = originalValueUInt;
87    InterlockedCompareStore(uintTexture1D[i++], valUInt, compareValueUInt);
88
89    i = 0;
90    InterlockedAdd(intTexture1D[i++], valInt);
91    InterlockedAnd(intTexture1D[i++], valInt);
92    InterlockedMax(intTexture1D[i++], valInt);
93    InterlockedMin(intTexture1D[i++], valInt);
94    InterlockedOr(intTexture1D[i++], valInt);
95    InterlockedXor(intTexture1D[i++], valInt);
96    InterlockedAdd(intTexture1D[i++], valInt, originalValueInt);
97    outBuffer[o++] = originalValueInt;
98    InterlockedAnd(intTexture1D[i++], valInt, originalValueInt);
99    outBuffer[o++] = originalValueInt;
100    InterlockedMax(intTexture1D[i++], valInt, originalValueInt);
101    outBuffer[o++] = originalValueInt;
102    InterlockedMin(intTexture1D[i++], valInt, originalValueInt);
103    outBuffer[o++] = originalValueInt;
104    InterlockedOr(intTexture1D[i++], valInt, originalValueInt);
105    outBuffer[o++] = originalValueInt;
106    InterlockedXor(intTexture1D[i++], valInt, originalValueInt);
107    outBuffer[o++] = originalValueInt;
108    InterlockedExchange(intTexture1D[i++], valInt, originalValueInt);
109    outBuffer[o++] = originalValueInt;
110    InterlockedCompareExchange(intTexture1D[i++], valInt, compareValueInt, originalValueInt);
111    outBuffer[o++] = originalValueInt;
112    InterlockedCompareStore(intTexture1D[i++], valInt, compareValueUInt);
113
114    // Texture1DArray
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(uintTexture1DArray[uint2(i++, 0)], valUInt);
148    InterlockedAnd(uintTexture1DArray[uint2(i++, 0)], valUInt);
149    InterlockedMax(uintTexture1DArray[uint2(i++, 0)], valUInt);
150    InterlockedMin(uintTexture1DArray[uint2(i++, 0)], valUInt);
151    InterlockedOr(uintTexture1DArray[uint2(i++, 0)], valUInt);
152    InterlockedXor(uintTexture1DArray[uint2(i++, 0)], valUInt);
153    InterlockedAdd(uintTexture1DArray[uint2(i++, 0)], valUInt, originalValueUInt);
154    outBuffer[o++] = originalValueUInt;
155    InterlockedAnd(uintTexture1DArray[uint2(i++, 0)], valUInt, originalValueUInt);
156    outBuffer[o++] = originalValueUInt;
157    InterlockedMax(uintTexture1DArray[uint2(i++, 0)], valUInt, originalValueUInt);
158    outBuffer[o++] = originalValueUInt;
159    InterlockedMin(uintTexture1DArray[uint2(i++, 0)], valUInt, originalValueUInt);
160    outBuffer[o++] = originalValueUInt;
161    InterlockedOr(uintTexture1DArray[uint2(i++, 0)], valUInt, originalValueUInt);
162    outBuffer[o++] = originalValueUInt;
163    InterlockedXor(uintTexture1DArray[uint2(i++, 0)], valUInt, originalValueUInt);
164    outBuffer[o++] = originalValueUInt;
165    InterlockedExchange(uintTexture1DArray[uint2(i++, 0)], valUInt, originalValueUInt);
166    outBuffer[o++] = originalValueUInt;
167    InterlockedCompareExchange(uintTexture1DArray[uint2(i++, 0)], valUInt, compareValueUInt, originalValueUInt);
168    outBuffer[o++] = originalValueUInt;
169    InterlockedCompareStore(uintTexture1DArray[uint2(i++, 0)], valUInt, compareValueUInt);
170
171    i = 0;
172    InterlockedAdd(intTexture1DArray[uint2(i++, 0)], valInt);
173    InterlockedAnd(intTexture1DArray[uint2(i++, 0)], valInt);
174    InterlockedMax(intTexture1DArray[uint2(i++, 0)], valInt);
175    InterlockedMin(intTexture1DArray[uint2(i++, 0)], valInt);
176    InterlockedOr(intTexture1DArray[uint2(i++, 0)], valInt);
177    InterlockedXor(intTexture1DArray[uint2(i++, 0)], valInt);
178    InterlockedAdd(intTexture1DArray[uint2(i++, 0)], valInt, originalValueInt);
179    outBuffer[o++] = originalValueInt;
180    InterlockedAnd(intTexture1DArray[uint2(i++, 0)], valInt, originalValueInt);
181    outBuffer[o++] = originalValueInt;
182    InterlockedMax(intTexture1DArray[uint2(i++, 0)], valInt, originalValueInt);
183    outBuffer[o++] = originalValueInt;
184    InterlockedMin(intTexture1DArray[uint2(i++, 0)], valInt, originalValueInt);
185    outBuffer[o++] = originalValueInt;
186    InterlockedOr(intTexture1DArray[uint2(i++, 0)], valInt, originalValueInt);
187    outBuffer[o++] = originalValueInt;
188    InterlockedXor(intTexture1DArray[uint2(i++, 0)], valInt, originalValueInt);
189    outBuffer[o++] = originalValueInt;
190    InterlockedExchange(intTexture1DArray[uint2(i++, 0)], valInt, originalValueInt);
191    outBuffer[o++] = originalValueInt;
192    InterlockedCompareExchange(intTexture1DArray[uint2(i++, 0)], valInt, compareValueInt, originalValueInt);
193    outBuffer[o++] = originalValueInt;
194    InterlockedCompareStore(intTexture1DArray[uint2(i++, 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] = uintTexture1D[i];
200        outBuffer[o + test_count*1 + i] = intTexture1D[i];
201        outBuffer[o + test_count*2 + i] = uintTexture1DArray[uint2(i, 0)];
202        outBuffer[o + test_count*3 + i] = intTexture1DArray[uint2(i, 0)];
203    }
204}
205
206[numthreads(1, 1, 1)]
207void computeMain()
208{
209    test();
210}