Add a batch of GraphicsFuzz coverage tests
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / data / vulkan / amber / graphicsfuzz / cov-nested-loops-switch-add-zero-matrix-elements.amber
1 #!amber
2
3 # Copyright 2022 Google LLC
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 #     http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16
17
18 # A test for a coverage-gap found by the GraphicsFuzz project.
19
20 # Short description: A fragment shader that covers specific LLVM code paths
21
22 # The test passes because the shader always writes red.
23
24 # Optimized using spirv-opt with the following arguments:
25 # '--eliminate-dead-branches'
26 # '--merge-return'
27 # '--eliminate-local-multi-store'
28 # '--inline-entry-points-exhaustive'
29 # '--eliminate-dead-branches'
30 # '--merge-return'
31 # '--redundancy-elimination'
32 # '--reduce-load-size'
33 # '--simplify-instructions'
34 # '--simplify-instructions'
35 # '--eliminate-dead-branches'
36 # '--merge-return'
37 # spirv-opt commit hash: a0370efd589be33d5d9a85cfde2f85841b3755af
38
39
40
41 SHADER vertex variant_vertex_shader PASSTHROUGH
42
43 # variant_fragment_shader is derived from the following GLSL:
44 # #version 320 es
45 # #define _int_3 _GLF_uniform_int_values[0]
46 # #define _int_5 _GLF_uniform_int_values[1]
47 # #define _int_2 _GLF_uniform_int_values[2]
48 # #define _int_1 _GLF_uniform_int_values[3]
49 # #define _int_0 _GLF_uniform_int_values[4]
50 # #define _float_1_0 _GLF_uniform_float_values[0]
51 # #define _float_19_0 _GLF_uniform_float_values[1]
52 #
53 # precision highp float;
54 # precision highp int;
55 #
56 # // Contents of _GLF_uniform_float_values: [1.0, 19.0]
57 # layout(set = 0, binding = 0) uniform buf0
58 # {
59 #     float _GLF_uniform_float_values[2];
60 # };
61 #
62 # // Contents of _GLF_uniform_int_values: [3, 5, 2, 1, 0]
63 # layout(set = 0, binding = 1) uniform buf1
64 # {
65 #     int _GLF_uniform_int_values[5];
66 # };
67 #
68 # layout(location = 0) out vec4 _GLF_color;
69 #
70 # void main()
71 # {
72 #     float arr[9] = float[9](_float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0);
73 #
74 #     for(int i = _int_1; i < _int_5; i ++)
75 #     {
76 #         for(int j = 2; j <= 4; j ++)
77 #         {
78 #             for(int k = 0; k < j; k ++)
79 #             {
80 #                 for(int l = 0; l < 2; l ++)
81 #                 {
82 #                     // Iterated 18 times for each value of i.
83 #                     switch(i)
84 #                     {
85 #                         case 0:
86 #                             arr[i] += _float_1_0;
87 #                             break;
88 #                         case 1:
89 #                             arr[i] += _float_1_0;
90 #                             break;
91 #                         // Matrices only contain zero values.
92 #                         case 2:
93 #                             arr[i] += mat2x4(0.0)[clamp(k, _int_0, _int_1)][l];
94 #                             break;
95 #                         case 3:
96 #                             arr[i] += mat3x2(0.0)[clamp(k, _int_0, _int_2)][l];
97 #                             break;
98 #                         case 4:
99 #                             arr[i] += mat3(0.0)[clamp(k, _int_0, _int_2)][l];
100 #                             break;
101 #                         // Cases below are never executed.
102 #                         case 5:
103 #                             arr[i] += mat3x4(0.0)[clamp(k, 0, _int_2)][l];
104 #                             break;
105 #                         case 6:
106 #                             arr[i] += mat4x2(0.0)[clamp(k, 0, 3)][l];
107 #                             break;
108 #                         case 7:
109 #                             arr[i] += mat4x3(0.0)[clamp(k, 0, 3)][l];
110 #                         // Fallthrough
111 #                         case 8:
112 #                             arr[i] += mat4(0.0)[clamp(k, 0, _int_3)][l];
113 #                             break;
114 #                     }
115 #                 }
116 #             }
117 #         }
118 #     }
119 #
120 #     // Always true.
121 #     if(arr[_int_0] == _float_1_0 && arr[_int_1] == _float_19_0 && arr[_int_2] == _float_1_0)
122 #     {
123 #         _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
124 #     }
125 #     else
126 #     {
127 #         _GLF_color = vec4(_int_0);
128 #     }
129 # }
130 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
131 ; SPIR-V
132 ; Version: 1.0
133 ; Generator: Khronos Glslang Reference Front End; 10
134 ; Bound: 307
135 ; Schema: 0
136                OpCapability Shader
137           %1 = OpExtInstImport "GLSL.std.450"
138                OpMemoryModel Logical GLSL450
139                OpEntryPoint Fragment %4 "main" %282
140                OpExecutionMode %4 OriginUpperLeft
141                OpSource ESSL 320
142                OpName %4 "main"
143                OpName %11 "arr"
144                OpName %14 "buf0"
145                OpMemberName %14 0 "_GLF_uniform_float_values"
146                OpName %16 ""
147                OpName %40 "i"
148                OpName %43 "buf1"
149                OpMemberName %43 0 "_GLF_uniform_int_values"
150                OpName %45 ""
151                OpName %61 "j"
152                OpName %71 "k"
153                OpName %80 "l"
154                OpName %130 "indexable"
155                OpName %151 "indexable"
156                OpName %172 "indexable"
157                OpName %189 "indexable"
158                OpName %204 "indexable"
159                OpName %219 "indexable"
160                OpName %235 "indexable"
161                OpName %282 "_GLF_color"
162                OpDecorate %13 ArrayStride 16
163                OpMemberDecorate %14 0 Offset 0
164                OpDecorate %14 Block
165                OpDecorate %16 DescriptorSet 0
166                OpDecorate %16 Binding 0
167                OpDecorate %42 ArrayStride 16
168                OpMemberDecorate %43 0 Offset 0
169                OpDecorate %43 Block
170                OpDecorate %45 DescriptorSet 0
171                OpDecorate %45 Binding 1
172                OpDecorate %282 Location 0
173           %2 = OpTypeVoid
174           %3 = OpTypeFunction %2
175           %6 = OpTypeFloat 32
176           %7 = OpTypeInt 32 0
177           %8 = OpConstant %7 9
178           %9 = OpTypeArray %6 %8
179          %10 = OpTypePointer Function %9
180          %12 = OpConstant %7 2
181          %13 = OpTypeArray %6 %12
182          %14 = OpTypeStruct %13
183          %15 = OpTypePointer Uniform %14
184          %16 = OpVariable %15 Uniform
185          %17 = OpTypeInt 32 1
186          %18 = OpConstant %17 0
187          %19 = OpTypePointer Uniform %6
188          %39 = OpTypePointer Function %17
189          %41 = OpConstant %7 5
190          %42 = OpTypeArray %17 %41
191          %43 = OpTypeStruct %42
192          %44 = OpTypePointer Uniform %43
193          %45 = OpVariable %44 Uniform
194          %46 = OpConstant %17 3
195          %47 = OpTypePointer Uniform %17
196          %56 = OpConstant %17 1
197          %59 = OpTypeBool
198          %62 = OpConstant %17 2
199          %69 = OpConstant %17 4
200         %102 = OpTypePointer Function %6
201         %117 = OpTypeVector %6 4
202         %118 = OpTypeMatrix %117 2
203         %119 = OpConstant %6 0
204         %120 = OpConstantComposite %117 %119 %119 %119 %119
205         %121 = OpConstantComposite %118 %120 %120
206         %129 = OpTypePointer Function %118
207         %139 = OpTypeVector %6 2
208         %140 = OpTypeMatrix %139 3
209         %141 = OpConstantComposite %139 %119 %119
210         %142 = OpConstantComposite %140 %141 %141 %141
211         %150 = OpTypePointer Function %140
212         %160 = OpTypeVector %6 3
213         %161 = OpTypeMatrix %160 3
214         %162 = OpConstantComposite %160 %119 %119 %119
215         %163 = OpConstantComposite %161 %162 %162 %162
216         %171 = OpTypePointer Function %161
217         %181 = OpTypeMatrix %117 3
218         %182 = OpConstantComposite %181 %120 %120 %120
219         %188 = OpTypePointer Function %181
220         %198 = OpTypeMatrix %139 4
221         %199 = OpConstantComposite %198 %141 %141 %141 %141
222         %203 = OpTypePointer Function %198
223         %213 = OpTypeMatrix %160 4
224         %214 = OpConstantComposite %213 %162 %162 %162 %162
225         %218 = OpTypePointer Function %213
226         %227 = OpTypeMatrix %117 4
227         %228 = OpConstantComposite %227 %120 %120 %120 %120
228         %234 = OpTypePointer Function %227
229         %281 = OpTypePointer Output %117
230         %282 = OpVariable %281 Output
231           %4 = OpFunction %2 None %3
232           %5 = OpLabel
233          %11 = OpVariable %10 Function
234          %40 = OpVariable %39 Function
235          %61 = OpVariable %39 Function
236          %71 = OpVariable %39 Function
237          %80 = OpVariable %39 Function
238         %130 = OpVariable %129 Function
239         %151 = OpVariable %150 Function
240         %172 = OpVariable %171 Function
241         %189 = OpVariable %188 Function
242         %204 = OpVariable %203 Function
243         %219 = OpVariable %218 Function
244         %235 = OpVariable %234 Function
245          %20 = OpAccessChain %19 %16 %18 %18
246          %21 = OpLoad %6 %20
247          %38 = OpCompositeConstruct %9 %21 %21 %21 %21 %21 %21 %21 %21 %21
248                OpStore %11 %38
249          %48 = OpAccessChain %47 %45 %18 %46
250          %49 = OpLoad %17 %48
251                OpStore %40 %49
252                OpBranch %50
253          %50 = OpLabel
254         %301 = OpPhi %17 %49 %5 %251 %53
255                OpLoopMerge %52 %53 None
256                OpBranch %54
257          %54 = OpLabel
258          %57 = OpAccessChain %47 %45 %18 %56
259          %58 = OpLoad %17 %57
260          %60 = OpSLessThan %59 %301 %58
261                OpBranchConditional %60 %51 %52
262          %51 = OpLabel
263                OpStore %61 %62
264                OpBranch %63
265          %63 = OpLabel
266         %302 = OpPhi %17 %62 %51 %249 %66
267                OpLoopMerge %65 %66 None
268                OpBranch %67
269          %67 = OpLabel
270          %70 = OpSLessThanEqual %59 %302 %69
271                OpBranchConditional %70 %64 %65
272          %64 = OpLabel
273                OpStore %71 %18
274                OpBranch %72
275          %72 = OpLabel
276         %304 = OpPhi %17 %18 %64 %247 %75
277                OpLoopMerge %74 %75 None
278                OpBranch %76
279          %76 = OpLabel
280          %79 = OpSLessThan %59 %304 %302
281                OpBranchConditional %79 %73 %74
282          %73 = OpLabel
283                OpStore %80 %18
284                OpBranch %81
285          %81 = OpLabel
286         %306 = OpPhi %17 %18 %73 %245 %84
287                OpLoopMerge %83 %84 None
288                OpBranch %85
289          %85 = OpLabel
290          %87 = OpSLessThan %59 %306 %62
291                OpBranchConditional %87 %82 %83
292          %82 = OpLabel
293                OpSelectionMerge %98 None
294                OpSwitch %301 %98 0 %89 1 %90 2 %91 3 %92 4 %93 5 %94 6 %95 7 %96 8 %97
295          %89 = OpLabel
296         %103 = OpAccessChain %102 %11 %301
297         %104 = OpLoad %6 %103
298         %105 = OpFAdd %6 %104 %21
299                OpStore %103 %105
300                OpBranch %98
301          %90 = OpLabel
302         %111 = OpAccessChain %102 %11 %301
303         %112 = OpLoad %6 %111
304         %113 = OpFAdd %6 %112 %21
305                OpStore %111 %113
306                OpBranch %98
307          %91 = OpLabel
308         %123 = OpAccessChain %47 %45 %18 %69
309         %124 = OpLoad %17 %123
310         %127 = OpExtInst %17 %1 SClamp %304 %124 %49
311                OpStore %130 %121
312         %131 = OpAccessChain %102 %130 %127 %306
313         %132 = OpLoad %6 %131
314         %133 = OpAccessChain %102 %11 %301
315         %134 = OpLoad %6 %133
316         %135 = OpFAdd %6 %134 %132
317                OpStore %133 %135
318                OpBranch %98
319          %92 = OpLabel
320         %144 = OpAccessChain %47 %45 %18 %69
321         %145 = OpLoad %17 %144
322         %146 = OpAccessChain %47 %45 %18 %62
323         %147 = OpLoad %17 %146
324         %148 = OpExtInst %17 %1 SClamp %304 %145 %147
325                OpStore %151 %142
326         %152 = OpAccessChain %102 %151 %148 %306
327         %153 = OpLoad %6 %152
328         %154 = OpAccessChain %102 %11 %301
329         %155 = OpLoad %6 %154
330         %156 = OpFAdd %6 %155 %153
331                OpStore %154 %156
332                OpBranch %98
333          %93 = OpLabel
334         %165 = OpAccessChain %47 %45 %18 %69
335         %166 = OpLoad %17 %165
336         %167 = OpAccessChain %47 %45 %18 %62
337         %168 = OpLoad %17 %167
338         %169 = OpExtInst %17 %1 SClamp %304 %166 %168
339                OpStore %172 %163
340         %173 = OpAccessChain %102 %172 %169 %306
341         %174 = OpLoad %6 %173
342         %175 = OpAccessChain %102 %11 %301
343         %176 = OpLoad %6 %175
344         %177 = OpFAdd %6 %176 %174
345                OpStore %175 %177
346                OpBranch %98
347          %94 = OpLabel
348         %184 = OpAccessChain %47 %45 %18 %62
349         %185 = OpLoad %17 %184
350         %186 = OpExtInst %17 %1 SClamp %304 %18 %185
351                OpStore %189 %182
352         %190 = OpAccessChain %102 %189 %186 %306
353         %191 = OpLoad %6 %190
354         %192 = OpAccessChain %102 %11 %301
355         %193 = OpLoad %6 %192
356         %194 = OpFAdd %6 %193 %191
357                OpStore %192 %194
358                OpBranch %98
359          %95 = OpLabel
360         %201 = OpExtInst %17 %1 SClamp %304 %18 %46
361                OpStore %204 %199
362         %205 = OpAccessChain %102 %204 %201 %306
363         %206 = OpLoad %6 %205
364         %207 = OpAccessChain %102 %11 %301
365         %208 = OpLoad %6 %207
366         %209 = OpFAdd %6 %208 %206
367                OpStore %207 %209
368                OpBranch %98
369          %96 = OpLabel
370         %216 = OpExtInst %17 %1 SClamp %304 %18 %46
371                OpStore %219 %214
372         %220 = OpAccessChain %102 %219 %216 %306
373         %221 = OpLoad %6 %220
374         %222 = OpAccessChain %102 %11 %301
375         %223 = OpLoad %6 %222
376         %224 = OpFAdd %6 %223 %221
377                OpStore %222 %224
378                OpBranch %97
379          %97 = OpLabel
380         %230 = OpAccessChain %47 %45 %18 %18
381         %231 = OpLoad %17 %230
382         %232 = OpExtInst %17 %1 SClamp %304 %18 %231
383                OpStore %235 %228
384         %236 = OpAccessChain %102 %235 %232 %306
385         %237 = OpLoad %6 %236
386         %238 = OpAccessChain %102 %11 %301
387         %239 = OpLoad %6 %238
388         %240 = OpFAdd %6 %239 %237
389                OpStore %238 %240
390                OpBranch %98
391          %98 = OpLabel
392                OpBranch %84
393          %84 = OpLabel
394         %245 = OpIAdd %17 %306 %56
395                OpStore %80 %245
396                OpBranch %81
397          %83 = OpLabel
398                OpBranch %75
399          %75 = OpLabel
400         %247 = OpIAdd %17 %304 %56
401                OpStore %71 %247
402                OpBranch %72
403          %74 = OpLabel
404                OpBranch %66
405          %66 = OpLabel
406         %249 = OpIAdd %17 %302 %56
407                OpStore %61 %249
408                OpBranch %63
409          %65 = OpLabel
410                OpBranch %53
411          %53 = OpLabel
412         %251 = OpIAdd %17 %301 %56
413                OpStore %40 %251
414                OpBranch %50
415          %52 = OpLabel
416         %252 = OpAccessChain %47 %45 %18 %69
417         %253 = OpLoad %17 %252
418         %254 = OpAccessChain %102 %11 %253
419         %255 = OpLoad %6 %254
420         %258 = OpFOrdEqual %59 %255 %21
421                OpSelectionMerge %260 None
422                OpBranchConditional %258 %259 %260
423         %259 = OpLabel
424         %263 = OpAccessChain %102 %11 %49
425         %264 = OpLoad %6 %263
426         %265 = OpAccessChain %19 %16 %18 %56
427         %266 = OpLoad %6 %265
428         %267 = OpFOrdEqual %59 %264 %266
429                OpBranch %260
430         %260 = OpLabel
431         %268 = OpPhi %59 %258 %52 %267 %259
432                OpSelectionMerge %270 None
433                OpBranchConditional %268 %269 %270
434         %269 = OpLabel
435         %271 = OpAccessChain %47 %45 %18 %62
436         %272 = OpLoad %17 %271
437         %273 = OpAccessChain %102 %11 %272
438         %274 = OpLoad %6 %273
439         %277 = OpFOrdEqual %59 %274 %21
440                OpBranch %270
441         %270 = OpLabel
442         %278 = OpPhi %59 %268 %260 %277 %269
443                OpSelectionMerge %280 None
444                OpBranchConditional %278 %279 %296
445         %279 = OpLabel
446         %285 = OpConvertSToF %6 %49
447         %288 = OpConvertSToF %6 %253
448         %295 = OpCompositeConstruct %117 %285 %288 %288 %285
449                OpStore %282 %295
450                OpBranch %280
451         %296 = OpLabel
452         %299 = OpConvertSToF %6 %253
453         %300 = OpCompositeConstruct %117 %299 %299 %299 %299
454                OpStore %282 %300
455                OpBranch %280
456         %280 = OpLabel
457                OpReturn
458                OpFunctionEnd
459 END
460
461 # uniforms for variant
462
463 # _GLF_uniform_int_values
464 BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
465  3 5 2 1 0
466 END
467 # _GLF_uniform_float_values
468 BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
469  1.0 19.0
470 END
471
472 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
473
474 PIPELINE graphics variant_pipeline
475   ATTACH variant_vertex_shader
476   ATTACH variant_fragment_shader
477   FRAMEBUFFER_SIZE 32 32
478   BIND BUFFER variant_framebuffer AS color LOCATION 0
479   BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
480   BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
481 END
482 CLEAR_COLOR variant_pipeline 0 0 0 255
483
484 CLEAR variant_pipeline
485 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 32 32
486
487 EXPECT variant_framebuffer IDX 0 0 SIZE 32 32 EQ_RGBA 255 0 0 255