yum-mirror/slang

Making it easier to work with shaders

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

Simon Kallweitupdate slang-rhi (#6587)ae1a5e408

master
16.0 KiB410 linesraw
1//TEST:SIMPLE(filecheck=CHECK_GLSL):  -allow-glsl -stage compute -entry computeMain -target glsl
2//TEST:SIMPLE(filecheck=CHECK_SPV):  -allow-glsl -stage compute -entry computeMain -target spirv -emit-spirv-directly
3//TEST(compute, vulkan):COMPARE_COMPUTE(filecheck-buffer=BUF):-vk -compute -entry computeMain -allow-glsl
4//TEST(compute, vulkan):COMPARE_COMPUTE(filecheck-buffer=BUF):-vk -compute -entry computeMain -allow-glsl -emit-spirv-directly
5
6//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer
7buffer MyBlockName2
8{
9    uint data[1];
10} outputBuffer;
11
12layout(local_size_x = 1) in;
13
14//TEST_INPUT: set image_1d = RWTexture1D(format=R32Uint, size=4, content=one, mipMaps = 1)
15uniform layout(binding=0,r32ui) uimage1D image_1d;
16//TEST_INPUT: set image_buffer = RWTextureBuffer(format=R32Uint, stride=8, data=[1 1 1 1])
17uniform layout(binding=1,r32ui) uimageBuffer image_buffer;
18//TEST_INPUT: set image_1dArray = RWTexture1D(format=R32Uint, size=4, content=one, mipMaps = 1, arrayLength=2)
19uniform layout(binding=2,r32ui) uimage1DArray image_1dArray;
20//TEST_INPUT: set image_2d = RWTexture2D(format=R32Uint, size=4, content=one, mipMaps = 1)
21uniform layout(binding=3,r32ui) uimage2D image_2d;
22//TEST_INPUT: set image_2dRect = RWTexture2D(format=R32Uint, size=4, content=one, mipMaps = 1)
23uniform layout(binding=4,r32ui) uimage2DRect image_2dRect;
24//TEST_INPUT: set image_2dMultiSample = RWTexture2D(format=R32Uint, size=4, content=one, mipMaps = 1, sampleCount = two)
25uniform layout(binding=5,r32ui) uimage2DMS image_2dMultiSample;
26//TEST_INPUT: set image_2dArray = RWTexture2D(format=R32Uint, size=4, content=one, mipMaps = 1, arrayLength=2)
27uniform layout(binding=6,r32ui) uimage2DArray image_2dArray;
28//TEST_INPUT: set image_3d = RWTexture3D(format=R32Uint, size=4, content=one, mipMaps = 1)
29uniform layout(binding=7,r32ui) uimage3D image_3d;
30//TEST_INPUT: set image_cube = RWTextureCube(format=R32Uint, size=4, content=one, mipMaps = 1)
31uniform layout(binding=8,r32ui) uimageCube image_cube;
32//TEST_INPUT: set image_cubeArray = RWTextureCube(format=R32Uint, size=4, content=one, mipMaps = 1, arrayLength=2)
33uniform layout(binding=9,r32ui) uimageCubeArray image_cubeArray;
34//TEST_INPUT: set image_2dMultiSampleArray = RWTexture2D(format=R32Uint, size=4, content=one, mipMaps = 1, arrayLength=2, sampleCount = two)
35uniform layout(binding=10,r32ui) uimage2DMSArray image_2dMultiSampleArray;
36
37bool checkAllImageSize()
38{
39    return true
40        && imageSize(image_1d) == int(4)
41        && imageSize(image_buffer) == int(4)
42        && imageSize(image_1dArray) == ivec2(4, 2)
43        && imageSize(image_2d) == ivec2(4)
44        && imageSize(image_2dArray) == ivec3(4, 4, 2)
45        && imageSize(image_2dRect) == ivec2(4)
46        && imageSize(image_2dMultiSample) == ivec2(4)
47        && imageSize(image_3d) == ivec3(4)
48        && imageSize(image_cube) == ivec2(4)
49        && imageSize(image_cubeArray) == ivec3(4, 4, 2)
50        && imageSize(image_2dMultiSampleArray) == ivec3(4, 4, 2)
51        ;
52}
53bool checkAllImageLoad()
54{
55    return true
56        && imageLoad(image_1d, 0).x == 1
57        && imageLoad(image_buffer, 0).x == 1
58        && imageLoad(image_1dArray, ivec2(0)).x == 1
59        && imageLoad(image_2d, ivec2(0)).x == 1
60        && imageLoad(image_2dRect, ivec2(0)).x == 1
61        && imageLoad(image_2dMultiSample, ivec2(0), 1).x == 1
62        && imageLoad(image_2dArray, ivec3(0)).x == 1
63        && imageLoad(image_3d, ivec3(0)).x == 1
64        && imageLoad(image_cube, ivec3(0)).x == 1
65        && imageLoad(image_cubeArray, ivec3(0)).x == 1
66        && imageLoad(image_cubeArray, ivec3(0)).x == 1
67        && imageLoad(image_2dMultiSampleArray, ivec3(0), 1).x == 1
68        ;
69}
70bool resetAllImageValues()
71{
72    imageStore(image_1d, 0, uvec4(1));
73    imageStore(image_buffer, 0, uvec4(1));
74    imageStore(image_1dArray, ivec2(0), uvec4(1));
75    imageStore(image_2d, ivec2(0), uvec4(1));
76    imageStore(image_2dRect, ivec2(0), uvec4(1));
77    imageStore(image_2dMultiSample, ivec2(0), 1, uvec4(1));
78    imageStore(image_2dArray, ivec3(0), uvec4(1));
79    imageStore(image_3d, ivec3(0), uvec4(1));
80    imageStore(image_cube, ivec3(0), uvec4(1));
81    imageStore(image_cubeArray, ivec3(0), uvec4(1));
82    imageStore(image_2dMultiSampleArray, ivec3(0), 1, uvec4(1));
83    return true;
84}
85uint load_image_1d()
86{
87    return imageLoad(image_1d, 0).x;
88}
89uint load_image_buffer()
90{
91    return imageLoad(image_buffer, 0).x;
92}
93uint load_image_1dArray()
94{
95    return imageLoad(image_1dArray, ivec2(0)).x;
96}
97uint load_image_2d()
98{
99    return imageLoad(image_2d, ivec2(0)).x;
100}
101uint load_image_2dRect()
102{
103    return imageLoad(image_2dRect, ivec2(0)).x;
104}
105uint load_image_2dMultiSample()
106{
107    return imageLoad(image_2dMultiSample, ivec2(0), 1).x;
108}
109uint load_image_2dArray()
110{
111    return imageLoad(image_2dArray, ivec3(0)).x;
112}
113uint load_image_3d()
114{
115    return imageLoad(image_3d, ivec3(0)).x;
116}
117uint load_image_cube()
118{
119    return imageLoad(image_cube, ivec3(0)).x;
120}
121uint load_image_cubeArray()
122{
123    return imageLoad(image_cubeArray, ivec3(0)).x;
124}
125uint load_image_2dMultiSampleArray()
126{
127    return imageLoad(image_2dMultiSampleArray, ivec3(0), 1).x;
128}
129// requires ImageLoad test to pass
130bool checkAllImageStore()
131{
132    bool loadCheck = true;
133    imageStore(image_1d, 0, uvec4(0));
134    loadCheck = loadCheck && load_image_1d() == 0;
135    imageStore(image_buffer, 0, uvec4(0));
136    loadCheck = loadCheck && load_image_buffer() == 0;
137    imageStore(image_1dArray, ivec2(0), uvec4(0));
138    loadCheck = loadCheck && load_image_1dArray() == 0;
139    imageStore(image_2d, ivec2(0), uvec4(0));
140    loadCheck = loadCheck && load_image_2d() == 0;
141    imageStore(image_2dRect, ivec2(0), uvec4(0));
142    loadCheck = loadCheck && load_image_2dRect() == 0;
143    imageStore(image_2dMultiSample, ivec2(0), 1, uvec4(0));
144    loadCheck = loadCheck && load_image_2dMultiSample() == 0;
145    imageStore(image_2dArray, ivec3(0), uvec4(0));
146    loadCheck = loadCheck && load_image_2dArray() == 0;
147    imageStore(image_3d, ivec3(0), uvec4(0));
148    loadCheck = loadCheck && load_image_3d() == 0;
149    imageStore(image_cube, ivec3(0), uvec4(0));
150    loadCheck = loadCheck && load_image_cube() == 0;
151    imageStore(image_cubeArray, ivec3(0), uvec4(0));
152    loadCheck = loadCheck && load_image_cubeArray() == 0;
153    imageStore(image_2dMultiSampleArray, ivec3(0), 1, uvec4(0));
154    loadCheck = loadCheck && load_image_2dMultiSampleArray() == 0;
155    resetAllImageValues();
156    return loadCheck;
157}
158bool checkAllImageSamples()
159{
160    resetAllImageValues();
161    return true
162        && imageSamples(image_2dMultiSample) == 2
163        && imageSamples(image_2dMultiSampleArray) == 2
164        ;
165}
166bool checkAllImageAtomicAdd()
167{
168    resetAllImageValues();
169    return true
170        && imageAtomicAdd(image_1d, 0, 0) == 1
171        && load_image_1d() == 1
172        && imageAtomicAdd(image_buffer, 0, 2) == 1
173        && load_image_buffer() == 3
174        && imageAtomicAdd(image_1dArray, ivec2(0), 0) == 1
175        && load_image_1dArray() == 1
176        && imageAtomicAdd(image_2d, ivec2(0), 2) == 1
177        && load_image_2d() == 3
178        && imageAtomicAdd(image_2dRect, ivec2(0), 2) == 1
179        && load_image_2dRect() == 3
180        && imageAtomicAdd(image_2dMultiSample, ivec2(0), 1, 2) == 1
181        && load_image_2dMultiSample() == 3
182        && imageAtomicAdd(image_2dArray, ivec3(0), 0) == 1
183        && load_image_2dArray() == 1
184        && imageAtomicAdd(image_3d, ivec3(0), 2) == 1
185        && load_image_3d() == 3
186        && imageAtomicAdd(image_cube, ivec3(0), 2) == 1
187        && load_image_cube() == 3
188        && imageAtomicAdd(image_cubeArray, ivec3(0), 2) == 1
189        && load_image_cubeArray() == 3
190        && imageAtomicAdd(image_2dMultiSampleArray, ivec3(0), 1, 2) == 1
191        && load_image_2dMultiSampleArray() == 3
192        ;
193}
194bool checkAllImageAtomicExchange()
195{
196    resetAllImageValues();
197    return true
198        && imageAtomicExchange(image_1d, 0, 0) == 1
199        && load_image_1d() == 0
200        && imageAtomicExchange(image_buffer, 0, 2) == 1
201        && load_image_buffer() == 2
202        && imageAtomicExchange(image_1dArray, ivec2(0), 0) == 1
203        && load_image_1dArray() == 0
204        && imageAtomicExchange(image_2d, ivec2(0), 2) == 1
205        && load_image_2d() == 2
206        && imageAtomicExchange(image_2dRect, ivec2(0), 2) == 1
207        && load_image_2dRect() == 2
208        && imageAtomicExchange(image_2dMultiSample, ivec2(0), 1, 2) == 1
209        && load_image_2dMultiSample() == 2
210        && imageAtomicExchange(image_2dArray, ivec3(0), 0) == 1
211        && load_image_2dArray() == 0
212        && imageAtomicExchange(image_3d, ivec3(0), 2) == 1
213        && load_image_3d() == 2
214        && imageAtomicExchange(image_cube, ivec3(0), 2) == 1
215        && load_image_cube() == 2
216        && imageAtomicExchange(image_cubeArray, ivec3(0), 2) == 1
217        && load_image_cubeArray() == 2
218        && imageAtomicExchange(image_2dMultiSampleArray, ivec3(0), 1, 2) == 1
219        && load_image_2dMultiSampleArray() == 2
220        ;
221}
222bool checkAllImageAtomicMin()
223{
224    resetAllImageValues();
225    return true
226        && imageAtomicMin(image_1d, 0, 0) == 1
227        && load_image_1d() == 0
228        && imageAtomicMin(image_buffer, 0, 2) == 1
229        && load_image_buffer() == 1
230        && imageAtomicMin(image_1dArray, ivec2(0), 0) == 1
231        && load_image_1dArray() == 0
232        && imageAtomicMin(image_2d, ivec2(0), 2) == 1
233        && load_image_2d() == 1
234        && imageAtomicMin(image_2dRect, ivec2(0), 2) == 1
235        && load_image_2dRect() == 1
236        && imageAtomicMin(image_2dMultiSample, ivec2(0), 1, 2) == 1
237        && load_image_2dMultiSample() == 1
238        && imageAtomicMin(image_2dArray, ivec3(0), 0) == 1
239        && load_image_2dArray() == 0
240        && imageAtomicMin(image_3d, ivec3(0), 2) == 1
241        && load_image_3d() == 1
242        && imageAtomicMin(image_cube, ivec3(0), 2) == 1
243        && load_image_cube() == 1
244        && imageAtomicMin(image_cubeArray, ivec3(0), 2) == 1
245        && load_image_cubeArray() == 1
246        && imageAtomicMin(image_2dMultiSampleArray, ivec3(0), 1, 2) == 1
247        && load_image_2dMultiSampleArray() == 1
248        ;
249}
250bool checkAllImageAtomicMax()
251{
252    resetAllImageValues();
253    return true
254        && imageAtomicMax(image_1d, 0, 0) == 1
255        && load_image_1d() == 1
256        && imageAtomicMax(image_buffer, 0, 2) == 1
257        && load_image_buffer() == 2
258        && imageAtomicMax(image_1dArray, ivec2(0), 0) == 1
259        && load_image_1dArray() == 1
260        && imageAtomicMax(image_2d, ivec2(0), 2) == 1
261        && load_image_2d() == 2
262        && imageAtomicMax(image_2dRect, ivec2(0), 2) == 1
263        && load_image_2dRect() == 2
264        && imageAtomicMax(image_2dMultiSample, ivec2(0), 1, 2) == 1
265        && load_image_2dMultiSample() == 2
266        && imageAtomicMax(image_2dArray, ivec3(0), 0) == 1
267        && load_image_2dArray() == 1
268        && imageAtomicMax(image_3d, ivec3(0), 2) == 1
269        && load_image_3d() == 2
270        && imageAtomicMax(image_cube, ivec3(0), 2) == 1
271        && load_image_cube() == 2
272        && imageAtomicMax(image_cubeArray, ivec3(0), 2) == 1
273        && load_image_cubeArray() == 2
274        && imageAtomicMax(image_2dMultiSampleArray, ivec3(0), 1, 2) == 1
275        && load_image_2dMultiSampleArray() == 2
276        ;
277}
278bool checkAllImageAtomicAnd()
279{
280    resetAllImageValues();
281    return true
282        && imageAtomicAnd(image_1d, 0, 1) == 1
283        && load_image_1d() == 1
284        && imageAtomicAnd(image_buffer, 0, 2) == 1
285        && load_image_buffer() == 0
286        && imageAtomicAnd(image_1dArray, ivec2(0), 1) == 1
287        && load_image_1dArray() == 1
288        && imageAtomicAnd(image_2d, ivec2(0), 2) == 1
289        && load_image_2d() == 0
290        && imageAtomicAnd(image_2dRect, ivec2(0), 2) == 1
291        && load_image_2dRect() == 0
292        && imageAtomicAnd(image_2dMultiSample, ivec2(0), 1, 2) == 1
293        && load_image_2dMultiSample() == 0
294        && imageAtomicAnd(image_2dArray, ivec3(0), 1) == 1
295        && load_image_2dArray() == 1
296        && imageAtomicAnd(image_3d, ivec3(0), 2) == 1
297        && load_image_3d() == 0
298        && imageAtomicAnd(image_cube, ivec3(0), 2) == 1
299        && load_image_cube() == 0
300        && imageAtomicAnd(image_cubeArray, ivec3(0), 2) == 1
301        && load_image_cubeArray() == 0
302        && imageAtomicAnd(image_2dMultiSampleArray, ivec3(0), 1, 2) == 1
303        && load_image_2dMultiSampleArray() == 0
304        ;
305}
306bool checkAllImageAtomicOr()
307{
308    resetAllImageValues();
309    return true
310        && imageAtomicOr(image_1d, 0, 1) == 1
311        && load_image_1d() == 1
312        && imageAtomicOr(image_buffer, 0, 2) == 1
313        && load_image_buffer() == 3
314        && imageAtomicOr(image_1dArray, ivec2(0), 1) == 1
315        && load_image_1dArray() == 1
316        && imageAtomicOr(image_2d, ivec2(0), 2) == 1
317        && load_image_2d() == 3
318        && imageAtomicOr(image_2dRect, ivec2(0), 2) == 1
319        && load_image_2dRect() == 3
320        && imageAtomicOr(image_2dMultiSample, ivec2(0), 1, 2) == 1
321        && load_image_2dMultiSample() == 3
322        && imageAtomicOr(image_2dArray, ivec3(0), 1) == 1
323        && load_image_2dArray() == 1
324        && imageAtomicOr(image_3d, ivec3(0), 2) == 1
325        && load_image_3d() == 3
326        && imageAtomicOr(image_cube, ivec3(0), 2) == 1
327        && load_image_cube() == 3
328        && imageAtomicOr(image_cubeArray, ivec3(0), 2) == 1
329        && load_image_cubeArray() == 3
330        && imageAtomicOr(image_2dMultiSampleArray, ivec3(0), 1, 2) == 1
331        && load_image_2dMultiSampleArray() == 3
332        ;
333}
334bool checkAllImageAtomicXor()
335{
336    resetAllImageValues();
337    return true
338        && imageAtomicXor(image_1d, 0, 1) == 1
339        && load_image_1d() == 0
340        && imageAtomicXor(image_buffer, 0, 2) == 1
341        && load_image_buffer() == 3
342        && imageAtomicXor(image_1dArray, ivec2(0), 1) == 1
343        && load_image_1dArray() == 0
344        && imageAtomicXor(image_2d, ivec2(0), 2) == 1
345        && load_image_2d() == 3
346        && imageAtomicXor(image_2dRect, ivec2(0), 2) == 1
347        && load_image_2dRect() == 3
348        && imageAtomicXor(image_2dMultiSample, ivec2(0), 1, 2) == 1
349        && load_image_2dMultiSample() == 3
350        && imageAtomicXor(image_2dArray, ivec3(0), 1) == 1
351        && load_image_2dArray() == 0
352        && imageAtomicXor(image_3d, ivec3(0), 2) == 1
353        && load_image_3d() == 3
354        && imageAtomicXor(image_cube, ivec3(0), 2) == 1
355        && load_image_cube() == 3
356        && imageAtomicXor(image_cubeArray, ivec3(0), 2) == 1
357        && load_image_cubeArray() == 3
358        && imageAtomicXor(image_2dMultiSampleArray, ivec3(0), 1, 2) == 1
359        && load_image_2dMultiSampleArray() == 3
360        ;
361}
362bool checkAllImageAtomicCompSwap()
363{
364    resetAllImageValues();
365    return true
366        && imageAtomicCompSwap(image_1d, 0, 0, 2) == 1
367        && load_image_1d() == 1
368        && imageAtomicCompSwap(image_buffer, 0, 1, 2) == 1
369        && load_image_buffer() == 2
370        && imageAtomicCompSwap(image_1dArray, ivec2(0), 0, 2) == 1
371        && load_image_1dArray() == 1
372        && imageAtomicCompSwap(image_2d, ivec2(0), 1, 2) == 1
373        && load_image_2d() == 2
374        && imageAtomicCompSwap(image_2dRect, ivec2(0), 1, 2) == 1
375        && load_image_2dRect() == 2
376        && imageAtomicCompSwap(image_2dMultiSample, ivec2(0), 1, 1, 2) == 1
377        && load_image_2dMultiSample() == 2
378        && imageAtomicCompSwap(image_2dArray, ivec3(0), 0, 2) == 1
379        && load_image_2dArray() == 1
380        && imageAtomicCompSwap(image_3d, ivec3(0), 1, 2) == 1
381        && load_image_3d() == 2
382        && imageAtomicCompSwap(image_cube, ivec3(0), 1, 2) == 1
383        && load_image_cube() == 2
384        && imageAtomicCompSwap(image_cubeArray, ivec3(0), 1, 2) == 1
385        && load_image_cubeArray() == 2
386        && imageAtomicCompSwap(image_2dMultiSampleArray, ivec3(0), 1, 1, 2) == 1
387        && load_image_2dMultiSampleArray() == 2
388        ;
389}
390
391// CHECK_GLSL: void main(
392// CHECK_SPV: OpEntryPoint
393void computeMain()
394{
395    outputBuffer.data[0] = true
396        && checkAllImageSize()
397        && checkAllImageLoad()
398        && checkAllImageStore()
399        && checkAllImageSamples()
400        && checkAllImageAtomicAdd()
401        && checkAllImageAtomicExchange()
402        && checkAllImageAtomicMin()
403        && checkAllImageAtomicMax()
404        && checkAllImageAtomicAnd()
405        && checkAllImageAtomicOr()
406        && checkAllImageAtomicXor()
407        && checkAllImageAtomicCompSwap()
408        ;
409    // BUF: 1
410}