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
11.9 KiB303 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// shader_atomic_float2 is currently a very new extension; most hardware lacks
7// this extension and will fail this test if attempting to use atomic_float2
8// operations.
9// #define TEST_when_shader_atomic_float2_is_available
10
11//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer
12buffer MyBlockName2
13{
14    uint data[1];
15} outputBuffer;
16
17layout(local_size_x = 1) in;
18
19//TEST_INPUT: set image_1d = RWTexture1D(format=R32Float, size=4, content=one, mipMaps = 1)
20uniform layout(binding=0,r32f) image1D image_1d;
21//TEST_INPUT: set image_buffer = RWTextureBuffer(format=R32Float, stride=4, data=[1.0f 1.0f 1.0f 1.0f])
22uniform layout(binding=1,r32f) imageBuffer image_buffer;
23//TEST_INPUT: set image_1dArray = RWTexture1D(format=R32Float, size=4, content=one, mipMaps = 1, arrayLength=2)
24uniform layout(binding=2,r32f) image1DArray image_1dArray;
25//TEST_INPUT: set image_2d = RWTexture2D(format=R32Float, size=4, content=one, mipMaps = 1)
26uniform layout(binding=3,r32f) image2D image_2d;
27//TEST_INPUT: set image_2dRect = RWTexture2D(format=R32Float, size=4, content=one, mipMaps = 1)
28uniform layout(binding=4,r32f) image2DRect image_2dRect;
29//TEST_INPUT: set image_2dMultiSample = RWTexture2D(format=R32Float, size=4, content=one, mipMaps = 1, sampleCount = two)
30uniform layout(binding=5,r32f) image2DMS image_2dMultiSample;
31//TEST_INPUT: set image_2dArray = RWTexture2D(format=R32Float, size=4, content=one, mipMaps = 1, arrayLength=2)
32uniform layout(binding=6,r32f) image2DArray image_2dArray;
33//TEST_INPUT: set image_3d = RWTexture3D(format=R32Float, size=4, content=one, mipMaps = 1)
34uniform layout(binding=7,r32f) image3D image_3d;
35//TEST_INPUT: set image_cube = RWTextureCube(format=R32Float, size=4, content=one, mipMaps = 1)
36uniform layout(binding=8,r32f) imageCube image_cube;
37//TEST_INPUT: set image_cubeArray = RWTextureCube(format=R32Float, size=4, content=one, mipMaps = 1, arrayLength=2)
38uniform layout(binding=9,r32f) imageCubeArray image_cubeArray;
39//TEST_INPUT: set image_2dMultiSampleArray = RWTexture2D(format=R32Float, size=4, content=one, mipMaps = 1, arrayLength=2, sampleCount = two)
40uniform layout(binding=10,r32f) image2DMSArray image_2dMultiSampleArray;
41
42bool checkAllImageSize()
43{
44    return true
45        && imageSize(image_1d) == int(4)
46        && imageSize(image_buffer) == int(4)
47        && imageSize(image_1dArray) == ivec2(4, 2)
48        && imageSize(image_2d) == ivec2(4)
49        && imageSize(image_2dArray) == ivec3(4, 4, 2)
50        && imageSize(image_2dRect) == ivec2(4)
51        && imageSize(image_2dMultiSample) == ivec2(4)
52        && imageSize(image_3d) == ivec3(4)
53        && imageSize(image_cube) == ivec2(4)
54        && imageSize(image_cubeArray) == ivec3(4, 4, 2)
55        && imageSize(image_2dMultiSampleArray) == ivec3(4, 4, 2)
56        ;
57}
58bool checkAllImageLoad()
59{
60    return true
61        && imageLoad(image_1d, 0).x == 1
62        && imageLoad(image_buffer, 0).x == 1
63        && imageLoad(image_1dArray, ivec2(0)).x == 1
64        && imageLoad(image_2d, ivec2(0)).x == 1
65        && imageLoad(image_2dRect, ivec2(0)).x == 1
66        && imageLoad(image_2dMultiSample, ivec2(0), 1).x == 1
67        && imageLoad(image_2dArray, ivec3(0)).x == 1
68        && imageLoad(image_3d, ivec3(0)).x == 1
69        && imageLoad(image_cube, ivec3(0)).x == 1
70        && imageLoad(image_cubeArray, ivec3(0)).x == 1
71        && imageLoad(image_cubeArray, ivec3(0)).x == 1
72        && imageLoad(image_2dMultiSampleArray, ivec3(0), 1).x == 1
73        ;
74}
75bool resetAllImageValues()
76{
77    imageStore(image_1d, 0, vec4(1));
78    imageStore(image_buffer, 0, vec4(1));
79    imageStore(image_1dArray, ivec2(0), vec4(1));
80    imageStore(image_2d, ivec2(0), vec4(1));
81    imageStore(image_2dRect, ivec2(0), vec4(1));
82    imageStore(image_2dMultiSample, ivec2(0), 1,  vec4(1));
83    imageStore(image_2dArray, ivec3(0), vec4(1));
84    imageStore(image_3d, ivec3(0), vec4(1));
85    imageStore(image_cube, ivec3(0), vec4(1));
86    imageStore(image_cubeArray, ivec3(0), vec4(1));
87    imageStore(image_2dMultiSampleArray, ivec3(0), 1, vec4(1));
88    return true;
89}
90float load_image_1d()
91{
92    return imageLoad(image_1d, 0).x;
93}
94float load_image_buffer()
95{
96    return imageLoad(image_buffer, 0).x;
97}
98float load_image_1dArray()
99{
100    return imageLoad(image_1dArray, ivec2(0)).x;
101}
102float load_image_2d()
103{
104    return imageLoad(image_2d, ivec2(0)).x;
105}
106float load_image_2dRect()
107{
108    return imageLoad(image_2dRect, ivec2(0)).x;
109}
110float load_image_2dMultiSample()
111{
112    return imageLoad(image_2dMultiSample, ivec2(0), 1).x;
113}
114float load_image_2dArray()
115{
116    return imageLoad(image_2dArray, ivec3(0)).x;
117}
118float load_image_3d()
119{
120    return imageLoad(image_3d, ivec3(0)).x;
121}
122float load_image_cube()
123{
124    return imageLoad(image_cube, ivec3(0)).x;
125}
126float load_image_cubeArray()
127{
128    return imageLoad(image_cubeArray, ivec3(0)).x;
129}
130float load_image_2dMultiSampleArray()
131{
132    return imageLoad(image_2dMultiSampleArray, ivec3(0), 1).x;
133}
134// requires ImageLoad test to pass
135bool checkAllImageStore()
136{
137    bool loadCheck = true;
138    imageStore(image_1d, 0, vec4(0));
139    loadCheck = loadCheck && load_image_1d() == 0;
140    imageStore(image_buffer, 0, vec4(0));
141    loadCheck = loadCheck && load_image_buffer() == 0;
142    imageStore(image_1dArray, ivec2(0), vec4(0));
143    loadCheck = loadCheck && load_image_1dArray() == 0;
144    imageStore(image_2d, ivec2(0), vec4(0));
145    loadCheck = loadCheck && load_image_2d() == 0;
146    imageStore(image_2dRect, ivec2(0), vec4(0));
147    loadCheck = loadCheck && load_image_2dRect() == 0;
148    imageStore(image_2dMultiSample, ivec2(0), 1,  vec4(0));
149    loadCheck = loadCheck && load_image_2dMultiSample() == 0;
150    imageStore(image_2dArray, ivec3(0), vec4(0));
151    loadCheck = loadCheck && load_image_2dArray() == 0;
152    imageStore(image_3d, ivec3(0), vec4(0));
153    loadCheck = loadCheck && load_image_3d() == 0;
154    imageStore(image_cube, ivec3(0), vec4(0));
155    loadCheck = loadCheck && load_image_cube() == 0;
156    imageStore(image_cubeArray, ivec3(0), vec4(0));
157    loadCheck = loadCheck && load_image_cubeArray() == 0;
158    imageStore(image_2dMultiSampleArray, ivec3(0), 1, vec4(0));
159    loadCheck = loadCheck && load_image_2dMultiSampleArray() == 0;
160    resetAllImageValues();
161    return loadCheck;
162}
163bool checkAllImageSamples()
164{
165    resetAllImageValues();
166    return true
167        && imageSamples(image_2dMultiSample) == 2
168        && imageSamples(image_2dMultiSampleArray) == 2
169        ;
170}
171bool checkAllImageAtomicAdd()
172{
173    resetAllImageValues();
174    return true
175        && imageAtomicAdd(image_1d, 0, 0.0f) == 1
176        && load_image_1d() == 1
177        && imageAtomicAdd(image_buffer, 0, 2.0f) == 1
178        && load_image_buffer() == 3
179        && imageAtomicAdd(image_1dArray, ivec2(0), 0.0f) == 1
180        && load_image_1dArray() == 1
181        && imageAtomicAdd(image_2d, ivec2(0), 2.0f) == 1
182        && load_image_2d() == 3
183        && imageAtomicAdd(image_2dRect, ivec2(0), 2.0f) == 1
184        && load_image_2dRect() == 3
185        && imageAtomicAdd(image_2dMultiSample, ivec2(0), 1, 2.0f) == 1
186        && load_image_2dMultiSample() == 3
187        && imageAtomicAdd(image_2dArray, ivec3(0), 0.0f) == 1
188        && load_image_2dArray() == 1
189        && imageAtomicAdd(image_3d, ivec3(0), 2.0f) == 1
190        && load_image_3d() == 3
191        && imageAtomicAdd(image_cube, ivec3(0), 2.0f) == 1
192        && load_image_cube() == 3
193        && imageAtomicAdd(image_cubeArray, ivec3(0), 2.0f) == 1
194        && load_image_cubeArray() == 3
195        && imageAtomicAdd(image_2dMultiSampleArray, ivec3(0), 1, 2) == 1
196        && load_image_2dMultiSampleArray() == 3
197        ;
198}
199bool checkAllImageAtomicExchange()
200{
201    resetAllImageValues();
202    return true
203        && imageAtomicExchange(image_1d, 0, 0.0f) == 1
204        && load_image_1d() == 0
205        && imageAtomicExchange(image_buffer, 0, 2.0f) == 1
206        && load_image_buffer() == 2
207        && imageAtomicExchange(image_1dArray, ivec2(0), 0.0f) == 1
208        && load_image_1dArray() == 0
209        && imageAtomicExchange(image_2d, ivec2(0), 2.0f) == 1
210        && load_image_2d() == 2
211        && imageAtomicExchange(image_2dRect, ivec2(0), 2.0f) == 1
212        && load_image_2dRect() == 2
213        && imageAtomicExchange(image_2dMultiSample, ivec2(0), 1, 2.0f) == 1
214        && load_image_2dMultiSample() == 2
215        && imageAtomicExchange(image_2dArray, ivec3(0), 0.0f) == 1
216        && load_image_2dArray() == 0
217        && imageAtomicExchange(image_3d, ivec3(0), 2.0f) == 1
218        && load_image_3d() == 2
219        && imageAtomicExchange(image_cube, ivec3(0), 2.0f) == 1
220        && load_image_cube() == 2
221        && imageAtomicExchange(image_cubeArray, ivec3(0), 2.0f) == 1
222        && load_image_cubeArray() == 2
223        && imageAtomicExchange(image_2dMultiSampleArray, ivec3(0), 1, 2.0f) == 1
224        && load_image_2dMultiSampleArray() == 2
225        ;
226}
227#ifdef TEST_when_shader_atomic_float2_is_available
228bool checkAllImageAtomicMin()
229{
230    resetAllImageValues();
231    return true
232        && imageAtomicMin(image_1d, 0, 0.0f) == 1
233        && load_image_1d() == 0
234        && imageAtomicMin(image_buffer, 0, 2.0f) == 1
235        && load_image_buffer() == 1
236        && imageAtomicMin(image_1dArray, ivec2(0), 0.0f) == 1
237        && load_image_1dArray() == 0
238        && imageAtomicMin(image_2d, ivec2(0), 2.0f) == 1
239        && load_image_2d() == 1
240        && imageAtomicMin(image_2dRect, ivec2(0), 2.0f) == 1
241        && load_image_2dRect() == 1
242        && imageAtomicMin(image_2dMultiSample, ivec2(0), 1, 2.0f) == 1
243        && load_image_2dMultiSample() == 1
244        && imageAtomicMin(image_2dArray, ivec3(0), 0.0f) == 1
245        && load_image_2dArray() == 0
246        && imageAtomicMin(image_3d, ivec3(0), 2.0f) == 1
247        && load_image_3d() == 1
248        && imageAtomicMin(image_cube, ivec3(0), 2.0f) == 1
249        && load_image_cube() == 1
250        && imageAtomicMin(image_cubeArray, ivec3(0), 2.0f) == 1
251        && load_image_cubeArray() == 1
252        && imageAtomicMin(image_2dMultiSampleArray, ivec3(0), 1, 2.0f) == 1
253        && load_image_2dMultiSampleArray() == 1
254        ;
255}
256bool checkAllImageAtomicMax()
257{
258    resetAllImageValues();
259    return true
260        && imageAtomicMax(image_1d, 0, 0) == 1
261        && load_image_1d() == 1
262        && imageAtomicMax(image_buffer, 0, 2) == 1
263        && load_image_buffer() == 2
264        && imageAtomicMax(image_1dArray, ivec2(0), 0.0f) == 1
265        && load_image_1dArray() == 1
266        && imageAtomicMax(image_2d, ivec2(0), 2.0f) == 1
267        && load_image_2d() == 2
268        && imageAtomicMax(image_2dRect, ivec2(0), 2.0f) == 1
269        && load_image_2dRect() == 2
270        && imageAtomicMax(image_2dMultiSample, ivec2(0), 1, 2.0f) == 1
271        && load_image_2dMultiSample() == 2
272        && imageAtomicMax(image_2dArray, ivec3(0), 0.0f) == 1
273        && load_image_2dArray() == 1
274        && imageAtomicMax(image_3d, ivec3(0), 2.0f) == 1
275        && load_image_3d() == 2
276        && imageAtomicMax(image_cube, ivec3(0), 2.0f) == 1
277        && load_image_cube() == 2
278        && imageAtomicMax(image_cubeArray, ivec3(0), 2.0f) == 1
279        && load_image_cubeArray() == 2
280        && imageAtomicMax(image_2dMultiSampleArray, ivec3(0), 1, 2.0f) == 1
281        && load_image_2dMultiSampleArray() == 2
282        ;
283}
284#endif // #ifdef TEST_when_shader_atomic_float2_is_available
285
286// CHECK_GLSL: void main(
287// CHECK_SPV: OpEntryPoint
288void computeMain()
289{
290    outputBuffer.data[0] = true
291        && checkAllImageSize()
292        && checkAllImageLoad()
293        && checkAllImageStore()
294        && checkAllImageSamples()
295        && checkAllImageAtomicAdd()
296        && checkAllImageAtomicExchange()
297#ifdef TEST_when_shader_atomic_float2_is_available
298        && checkAllImageAtomicMin()
299        && checkAllImageAtomicMax()
300#endif // #ifdef TEST_when_shader_atomic_float2_is_available
301        ;
302    // BUF: 1
303}