3 # Copyright 2022 Google LLC
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
9 # http://www.apache.org/licenses/LICENSE-2.0
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.
18 # A test for a coverage-gap found by the GraphicsFuzz project.
20 # Short description: A fragment shader that covers specific LLVM code paths
22 # The test passes because the shader always writes red.
24 SHADER vertex variant_vertex_shader PASSTHROUGH
26 # variant_fragment_shader is derived from the following GLSL:
28 # #define _int_0 _GLF_uniform_int_values[0]
29 # #define _int_1 _GLF_uniform_int_values[1]
30 # #define _int_2 _GLF_uniform_int_values[2]
31 # #define _int_7 _GLF_uniform_int_values[3]
32 # #define _int_8 _GLF_uniform_int_values[4]
34 # precision highp float;
35 # precision highp int;
37 # // Contents of _GLF_uniform_int_values: [0, 1, 2, 7, 8]
38 # layout(set = 0, binding = 0) uniform buf0
40 # int _GLF_uniform_int_values[5];
43 # const int _GLF_global_loop_bound = 10;
44 # int _GLF_global_loop_count = 0;
46 # layout(location = 0) out vec4 _GLF_color;
50 # int arr0[16] = int[16](_int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0);
51 # int arr1[16] = int[16](_int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1);
52 # ivec2 v = ivec2(_int_1);
55 # for(int i = _int_1; i < _int_8 && _GLF_global_loop_count < _GLF_global_loop_bound; i++)
57 # _GLF_global_loop_count++;
60 # for(int j = 1; _GLF_global_loop_count < _GLF_global_loop_bound; j++)
62 # _GLF_global_loop_count++;
66 # _GLF_global_loop_count++;
69 # if(arr1[j + i] == _int_1)
76 # while(_GLF_global_loop_count < _GLF_global_loop_bound)
78 # _GLF_global_loop_count++;
81 # for(int k = _int_1; k < _int_8 && _GLF_global_loop_count < _GLF_global_loop_bound; k++)
83 # _GLF_global_loop_count++;
91 # while(_GLF_global_loop_count < _GLF_global_loop_bound)
93 # _GLF_global_loop_count++;
98 # if(arr0[_int_1] == _int_1)
106 # while(_GLF_global_loop_count < _GLF_global_loop_bound)
108 # _GLF_global_loop_count++;
122 # while(_GLF_global_loop_count < _GLF_global_loop_bound)
124 # _GLF_global_loop_count++;
128 # while(_GLF_global_loop_count < _GLF_global_loop_bound);
132 # arr1[v.x + v.y] = _int_2;
135 # if(arr0[_int_1] == _int_1 && arr1[_int_2] == _int_2)
137 # _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
141 # _GLF_color = vec4(_int_0);
144 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
147 ; Generator: Khronos Glslang Reference Front End; 10
151 %1 = OpExtInstImport "GLSL.std.450"
152 OpMemoryModel Logical GLSL450
153 OpEntryPoint Fragment %4 "main" %285
154 OpExecutionMode %4 OriginUpperLeft
157 OpName %8 "_GLF_global_loop_count"
160 OpMemberName %17 0 "_GLF_uniform_int_values"
169 OpName %285 "_GLF_color"
170 OpDecorate %16 ArrayStride 16
171 OpMemberDecorate %17 0 Offset 0
173 OpDecorate %19 DescriptorSet 0
174 OpDecorate %19 Binding 0
175 OpDecorate %285 Location 0
177 %3 = OpTypeFunction %2
179 %7 = OpTypePointer Private %6
180 %8 = OpVariable %7 Private
183 %11 = OpConstant %10 16
184 %12 = OpTypeArray %6 %11
185 %13 = OpTypePointer Function %12
186 %15 = OpConstant %10 5
187 %16 = OpTypeArray %6 %15
188 %17 = OpTypeStruct %16
189 %18 = OpTypePointer Uniform %17
190 %19 = OpVariable %18 Uniform
191 %20 = OpTypePointer Uniform %6
192 %55 = OpConstant %6 1
193 %89 = OpTypeVector %6 2
194 %90 = OpTypePointer Function %89
195 %95 = OpTypePointer Function %6
196 %105 = OpConstant %6 4
198 %111 = OpConstant %6 10
199 %144 = OpConstant %10 0
200 %179 = OpConstant %6 3
201 %255 = OpConstant %10 1
202 %259 = OpConstant %6 2
203 %282 = OpTypeFloat 32
204 %283 = OpTypeVector %282 4
205 %284 = OpTypePointer Output %283
206 %285 = OpVariable %284 Output
207 %4 = OpFunction %2 None %3
209 %14 = OpVariable %13 Function
210 %54 = OpVariable %13 Function
211 %91 = OpVariable %90 Function
212 %96 = OpVariable %95 Function
213 %116 = OpVariable %95 Function
214 %146 = OpVariable %95 Function
215 %149 = OpVariable %95 Function
216 %161 = OpVariable %95 Function
218 %21 = OpAccessChain %20 %19 %9 %9
220 %23 = OpAccessChain %20 %19 %9 %9
222 %25 = OpAccessChain %20 %19 %9 %9
224 %27 = OpAccessChain %20 %19 %9 %9
226 %29 = OpAccessChain %20 %19 %9 %9
228 %31 = OpAccessChain %20 %19 %9 %9
230 %33 = OpAccessChain %20 %19 %9 %9
232 %35 = OpAccessChain %20 %19 %9 %9
234 %37 = OpAccessChain %20 %19 %9 %9
236 %39 = OpAccessChain %20 %19 %9 %9
238 %41 = OpAccessChain %20 %19 %9 %9
240 %43 = OpAccessChain %20 %19 %9 %9
242 %45 = OpAccessChain %20 %19 %9 %9
244 %47 = OpAccessChain %20 %19 %9 %9
246 %49 = OpAccessChain %20 %19 %9 %9
248 %51 = OpAccessChain %20 %19 %9 %9
250 %53 = OpCompositeConstruct %12 %22 %24 %26 %28 %30 %32 %34 %36 %38 %40 %42 %44 %46 %48 %50 %52
252 %56 = OpAccessChain %20 %19 %9 %55
254 %58 = OpAccessChain %20 %19 %9 %55
256 %60 = OpAccessChain %20 %19 %9 %55
258 %62 = OpAccessChain %20 %19 %9 %55
260 %64 = OpAccessChain %20 %19 %9 %55
262 %66 = OpAccessChain %20 %19 %9 %55
264 %68 = OpAccessChain %20 %19 %9 %55
266 %70 = OpAccessChain %20 %19 %9 %55
268 %72 = OpAccessChain %20 %19 %9 %55
270 %74 = OpAccessChain %20 %19 %9 %55
272 %76 = OpAccessChain %20 %19 %9 %55
274 %78 = OpAccessChain %20 %19 %9 %55
276 %80 = OpAccessChain %20 %19 %9 %55
278 %82 = OpAccessChain %20 %19 %9 %55
280 %84 = OpAccessChain %20 %19 %9 %55
282 %86 = OpAccessChain %20 %19 %9 %55
284 %88 = OpCompositeConstruct %12 %57 %59 %61 %63 %65 %67 %69 %71 %73 %75 %77 %79 %81 %83 %85 %87
286 %92 = OpAccessChain %20 %19 %9 %55
288 %94 = OpCompositeConstruct %89 %93 %93
290 %97 = OpAccessChain %20 %19 %9 %55
295 OpLoopMerge %101 %102 None
299 %106 = OpAccessChain %20 %19 %9 %105
300 %107 = OpLoad %6 %106
301 %109 = OpSLessThan %108 %104 %107
303 %112 = OpSLessThan %108 %110 %111
304 %113 = OpLogicalAnd %108 %109 %112
305 OpBranchConditional %113 %100 %101
308 %115 = OpIAdd %6 %114 %55
313 OpLoopMerge %119 %120 None
317 %123 = OpSLessThan %108 %122 %111
318 OpBranchConditional %123 %118 %119
321 %125 = OpIAdd %6 %124 %55
325 OpLoopMerge %128 %129 None
329 %131 = OpIAdd %6 %130 %55
331 %132 = OpLoad %6 %116
333 %134 = OpIAdd %6 %132 %133
334 %135 = OpAccessChain %95 %54 %134
335 %136 = OpLoad %6 %135
336 %137 = OpAccessChain %20 %19 %9 %55
337 %138 = OpLoad %6 %137
338 %139 = OpIEqual %108 %136 %138
339 OpSelectionMerge %141 None
340 OpBranchConditional %139 %140 %141
342 %142 = OpAccessChain %20 %19 %9 %55
343 %143 = OpLoad %6 %142
344 %145 = OpAccessChain %95 %91 %144
346 %147 = OpAccessChain %20 %19 %9 %55
347 %148 = OpLoad %6 %147
349 %150 = OpAccessChain %20 %19 %9 %55
350 %151 = OpLoad %6 %150
354 OpLoopMerge %154 %155 None
358 %158 = OpSLessThan %108 %157 %111
359 OpBranchConditional %158 %153 %154
362 %160 = OpIAdd %6 %159 %55
364 %162 = OpAccessChain %20 %19 %9 %55
365 %163 = OpLoad %6 %162
369 OpLoopMerge %166 %167 None
372 %169 = OpLoad %6 %161
373 %170 = OpAccessChain %20 %19 %9 %105
374 %171 = OpLoad %6 %170
375 %172 = OpSLessThan %108 %169 %171
377 %174 = OpSLessThan %108 %173 %111
378 %175 = OpLogicalAnd %108 %172 %174
379 OpBranchConditional %175 %165 %166
382 %177 = OpIAdd %6 %176 %55
384 %178 = OpLoad %6 %149
385 %180 = OpAccessChain %20 %19 %9 %179
386 %181 = OpLoad %6 %180
387 %182 = OpSGreaterThanEqual %108 %178 %181
388 OpSelectionMerge %184 None
389 OpBranchConditional %182 %183 %184
393 %186 = OpLoad %6 %149
394 %187 = OpIAdd %6 %186 %55
398 OpLoopMerge %190 %191 None
402 %194 = OpSLessThan %108 %193 %111
403 OpBranchConditional %194 %189 %190
406 %196 = OpIAdd %6 %195 %55
414 %197 = OpLoad %6 %161
415 %198 = OpIAdd %6 %197 %55
419 %199 = OpAccessChain %20 %19 %9 %55
420 %200 = OpLoad %6 %199
421 %201 = OpAccessChain %95 %14 %200
422 %202 = OpLoad %6 %201
423 %203 = OpAccessChain %20 %19 %9 %55
424 %204 = OpLoad %6 %203
425 %205 = OpIEqual %108 %202 %204
426 OpSelectionMerge %207 None
427 OpBranchConditional %205 %206 %207
429 %208 = OpLoad %6 %146
430 %209 = OpIAdd %6 %208 %55
434 %210 = OpLoad %6 %146
435 %211 = OpAccessChain %20 %19 %9 %55
436 %212 = OpLoad %6 %211
437 %213 = OpIEqual %108 %210 %212
438 OpSelectionMerge %215 None
439 OpBranchConditional %213 %214 %215
443 OpLoopMerge %218 %219 None
447 %222 = OpSLessThan %108 %221 %111
448 OpBranchConditional %222 %217 %218
451 %224 = OpIAdd %6 %223 %55
457 %225 = OpLoad %6 %146
458 %226 = OpAccessChain %20 %19 %9 %55
459 %227 = OpLoad %6 %226
460 %228 = OpAccessChain %95 %14 %225
464 %229 = OpLoad %6 %146
465 %230 = OpAccessChain %20 %19 %9 %179
466 %231 = OpLoad %6 %230
467 %232 = OpSGreaterThanEqual %108 %229 %231
468 OpSelectionMerge %234 None
469 OpBranchConditional %232 %233 %234
473 %236 = OpLoad %6 %146
474 %237 = OpIAdd %6 %236 %55
482 OpLoopMerge %240 %241 None
486 %244 = OpSLessThan %108 %243 %111
487 OpBranchConditional %244 %239 %240
490 %246 = OpIAdd %6 %245 %55
501 %248 = OpSLessThan %108 %247 %111
502 OpBranchConditional %248 %126 %128
506 %249 = OpLoad %6 %116
507 %250 = OpIAdd %6 %249 %55
514 %252 = OpIAdd %6 %251 %55
518 %253 = OpAccessChain %95 %91 %144
519 %254 = OpLoad %6 %253
520 %256 = OpAccessChain %95 %91 %255
521 %257 = OpLoad %6 %256
522 %258 = OpIAdd %6 %254 %257
523 %260 = OpAccessChain %20 %19 %9 %259
524 %261 = OpLoad %6 %260
525 %262 = OpAccessChain %95 %54 %258
527 %263 = OpAccessChain %20 %19 %9 %55
528 %264 = OpLoad %6 %263
529 %265 = OpAccessChain %95 %14 %264
530 %266 = OpLoad %6 %265
531 %267 = OpAccessChain %20 %19 %9 %55
532 %268 = OpLoad %6 %267
533 %269 = OpIEqual %108 %266 %268
534 OpSelectionMerge %271 None
535 OpBranchConditional %269 %270 %271
537 %272 = OpAccessChain %20 %19 %9 %259
538 %273 = OpLoad %6 %272
539 %274 = OpAccessChain %95 %54 %273
540 %275 = OpLoad %6 %274
541 %276 = OpAccessChain %20 %19 %9 %259
542 %277 = OpLoad %6 %276
543 %278 = OpIEqual %108 %275 %277
546 %279 = OpPhi %108 %269 %101 %278 %270
547 OpSelectionMerge %281 None
548 OpBranchConditional %279 %280 %299
550 %286 = OpAccessChain %20 %19 %9 %55
551 %287 = OpLoad %6 %286
552 %288 = OpConvertSToF %282 %287
553 %289 = OpAccessChain %20 %19 %9 %9
554 %290 = OpLoad %6 %289
555 %291 = OpConvertSToF %282 %290
556 %292 = OpAccessChain %20 %19 %9 %9
557 %293 = OpLoad %6 %292
558 %294 = OpConvertSToF %282 %293
559 %295 = OpAccessChain %20 %19 %9 %55
560 %296 = OpLoad %6 %295
561 %297 = OpConvertSToF %282 %296
562 %298 = OpCompositeConstruct %283 %288 %291 %294 %297
566 %300 = OpAccessChain %20 %19 %9 %9
567 %301 = OpLoad %6 %300
568 %302 = OpConvertSToF %282 %301
569 %303 = OpCompositeConstruct %283 %302 %302 %302 %302
577 # uniforms for variant
579 # _GLF_uniform_int_values
580 BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
584 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
586 PIPELINE graphics variant_pipeline
587 ATTACH variant_vertex_shader
588 ATTACH variant_fragment_shader
589 FRAMEBUFFER_SIZE 32 32
590 BIND BUFFER variant_framebuffer AS color LOCATION 0
591 BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
593 CLEAR_COLOR variant_pipeline 0 0 0 255
595 CLEAR variant_pipeline
596 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 32 32
598 EXPECT variant_framebuffer IDX 0 0 SIZE 32 32 EQ_RGBA 255 0 0 255