3 # Copyright 2019 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 bug found by GraphicsFuzz.
20 # Short description: A fragment shader performing a search computation, then writing red regardless
22 # The test passes because the uniform values used to run the shader guarantee
23 # that red will be written at the end, regardless of what the prior computation
26 SHADER vertex variant_vertex_shader PASSTHROUGH
28 # variant_fragment_shader is derived from the following GLSL:
30 # precision highp float;
32 # layout(location = 0) out vec4 _GLF_color;
34 # layout(set = 0, binding = 0) uniform buf0 {
35 # vec2 injectionSwitch;
46 # float odd_numbers[10];
47 # float even_numbers[10];
50 # void makeTreeNode(inout BST tree, int data)
53 # tree.leftIndex = - 1;
54 # tree.rightIndex = - 1;
56 # void insert(int treeIndex, int data)
59 # while(baseIndex <= treeIndex)
61 # if(data <= tree[baseIndex].data)
63 # if(tree[baseIndex].leftIndex == - 1)
65 # tree[baseIndex].leftIndex = treeIndex;
66 # makeTreeNode(tree[treeIndex], data);
71 # baseIndex = tree[baseIndex].leftIndex;
77 # if(tree[baseIndex].rightIndex == - 1)
79 # tree[baseIndex].rightIndex = treeIndex;
80 # makeTreeNode(tree[treeIndex], data);
86 # float GLF_live8A[50];
87 # GLF_live8A[GLF_live8i >= 0 && GLF_live8i < 50 ? GLF_live8i : 0] += GLF_live8A[(1 - 1) >= 0 && (1 - 1) < 50 ? 1 - 1 : 0];
90 # baseIndex = tree[baseIndex].rightIndex;
92 # while((injectionSwitch.x > injectionSwitch.y));
98 # int search(int target)
102 # while(index != - 1)
104 # currentNode = tree[index];
105 # if(currentNode.data == target)
109 # index = target > currentNode.data ? currentNode.rightIndex : currentNode.leftIndex;
113 # vec3 hueColor(float angle)
115 # float nodeData = float(search(15));
116 # return (30.0 + angle * vec3(1.0, 5.0, nodeData)) / 50.0;
118 # float makeFrame(float v)
123 # return float(search(100));
129 # if(v < float(search(6)))
133 # return 10.0 + float(search(30));
138 # makeTreeNode(tree[0], 9);
140 # insert(treeIndex, 5);
142 # int GLF_live1_looplimiter2 = 0;
144 # int GLF_live1i = 0;
149 # if(GLF_live1_looplimiter2 >= 7)
153 # GLF_live1_looplimiter2 ++;
155 # insert(treeIndex, 12);
157 # insert(treeIndex, 15);
159 # insert(treeIndex, 7);
161 # insert(treeIndex, 8);
163 # insert(treeIndex, 2);
165 # insert(treeIndex, 6);
168 # int GLF_live4_looplimiter3 = 0;
170 # int GLF_live4i = 0;
175 # if(GLF_live4_looplimiter3 >= 3)
179 # GLF_live4_looplimiter3 ++;
180 # int GLF_live4index = 1;
181 # GLF_live4obj.even_numbers[GLF_live4index >= 0 && GLF_live4index < 10 ? GLF_live4index : 0] = GLF_live4obj.even_numbers[1 >= 0 && 1 < 10 ? 1 : 0];
182 # GLF_live4obj.even_numbers[GLF_live4i >= 0 && GLF_live4i < 10 ? GLF_live4i : 0] = 1.0;
184 # insert(treeIndex, 17);
185 # if((injectionSwitch.x > injectionSwitch.y))
190 # insert(treeIndex, 13);
191 # vec2 z = (gl_FragCoord.yx / vec2(256.0, 256.0));
192 # float x = makeFrame(z.x);
193 # float y = makeFrame(z.y);
201 # int result = search(target);
217 # float a = x + y * float(sum);
218 # _GLF_color = vec4(injectionSwitch.x < injectionSwitch.y ? vec3(1.0, 0.0, 0.0) : hueColor(a), 1.);
220 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
223 ; Generator: Khronos Glslang Reference Front End; 7
227 %1 = OpExtInstImport "GLSL.std.450"
228 OpMemoryModel Logical GLSL450
229 OpEntryPoint Fragment %4 "main" %381 %436
230 OpExecutionMode %4 OriginUpperLeft
234 OpMemberName %7 0 "data"
235 OpMemberName %7 1 "leftIndex"
236 OpMemberName %7 2 "rightIndex"
237 OpName %13 "makeTreeNode(struct-BST-i1-i1-i11;i1;"
240 OpName %18 "insert(i1;i1;"
241 OpName %16 "treeIndex"
243 OpName %22 "search(i1;"
245 OpName %29 "hueColor(f1;"
247 OpName %33 "makeFrame(f1;"
249 OpName %43 "baseIndex"
255 OpName %112 "GLF_live8i"
256 OpName %116 "GLF_live8A"
258 OpMemberName %139 0 "injectionSwitch"
261 OpName %159 "currentNode"
262 OpName %186 "nodeData"
267 OpName %242 "treeIndex"
272 OpName %260 "GLF_live1_looplimiter2"
273 OpName %261 "GLF_live1i"
286 OpName %316 "GLF_live4_looplimiter3"
287 OpName %317 "GLF_live4i"
288 OpName %331 "GLF_live4index"
290 OpMemberName %333 0 "odd_numbers"
291 OpMemberName %333 1 "even_numbers"
292 OpName %335 "GLF_live4obj"
298 OpName %381 "gl_FragCoord"
308 OpName %436 "_GLF_color"
310 OpMemberDecorate %7 0 RelaxedPrecision
311 OpMemberDecorate %7 1 RelaxedPrecision
312 OpMemberDecorate %7 2 RelaxedPrecision
313 OpDecorate %12 RelaxedPrecision
314 OpDecorate %16 RelaxedPrecision
315 OpDecorate %17 RelaxedPrecision
316 OpDecorate %22 RelaxedPrecision
317 OpDecorate %21 RelaxedPrecision
318 OpDecorate %36 RelaxedPrecision
319 OpDecorate %43 RelaxedPrecision
320 OpDecorate %49 RelaxedPrecision
321 OpDecorate %50 RelaxedPrecision
322 OpDecorate %53 RelaxedPrecision
323 OpDecorate %59 RelaxedPrecision
324 OpDecorate %62 RelaxedPrecision
325 OpDecorate %66 RelaxedPrecision
326 OpDecorate %68 RelaxedPrecision
327 OpDecorate %72 RelaxedPrecision
328 OpDecorate %73 RelaxedPrecision
329 OpDecorate %75 RelaxedPrecision
330 OpDecorate %81 RelaxedPrecision
331 OpDecorate %87 RelaxedPrecision
332 OpDecorate %89 RelaxedPrecision
333 OpDecorate %92 RelaxedPrecision
334 OpDecorate %94 RelaxedPrecision
335 OpDecorate %98 RelaxedPrecision
336 OpDecorate %99 RelaxedPrecision
337 OpDecorate %101 RelaxedPrecision
338 OpDecorate %106 RelaxedPrecision
339 OpDecorate %112 RelaxedPrecision
340 OpDecorate %117 RelaxedPrecision
341 OpDecorate %119 RelaxedPrecision
342 OpDecorate %123 RelaxedPrecision
343 OpDecorate %135 RelaxedPrecision
344 OpDecorate %137 RelaxedPrecision
345 OpMemberDecorate %139 0 Offset 0
346 OpDecorate %139 Block
347 OpDecorate %141 DescriptorSet 0
348 OpDecorate %141 Binding 0
349 OpDecorate %151 RelaxedPrecision
350 OpDecorate %157 RelaxedPrecision
351 OpDecorate %160 RelaxedPrecision
352 OpDecorate %164 RelaxedPrecision
353 OpDecorate %165 RelaxedPrecision
354 OpDecorate %169 RelaxedPrecision
355 OpDecorate %171 RelaxedPrecision
356 OpDecorate %173 RelaxedPrecision
357 OpDecorate %179 RelaxedPrecision
358 OpDecorate %182 RelaxedPrecision
359 OpDecorate %183 RelaxedPrecision
360 OpDecorate %189 RelaxedPrecision
361 OpDecorate %215 RelaxedPrecision
362 OpDecorate %228 RelaxedPrecision
363 OpDecorate %237 RelaxedPrecision
364 OpDecorate %242 RelaxedPrecision
365 OpDecorate %251 RelaxedPrecision
366 OpDecorate %252 RelaxedPrecision
367 OpDecorate %255 RelaxedPrecision
368 OpDecorate %258 RelaxedPrecision
369 OpDecorate %259 RelaxedPrecision
370 OpDecorate %260 RelaxedPrecision
371 OpDecorate %261 RelaxedPrecision
372 OpDecorate %268 RelaxedPrecision
373 OpDecorate %274 RelaxedPrecision
374 OpDecorate %275 RelaxedPrecision
375 OpDecorate %276 RelaxedPrecision
376 OpDecorate %277 RelaxedPrecision
377 OpDecorate %280 RelaxedPrecision
378 OpDecorate %283 RelaxedPrecision
379 OpDecorate %284 RelaxedPrecision
380 OpDecorate %286 RelaxedPrecision
381 OpDecorate %289 RelaxedPrecision
382 OpDecorate %290 RelaxedPrecision
383 OpDecorate %292 RelaxedPrecision
384 OpDecorate %295 RelaxedPrecision
385 OpDecorate %296 RelaxedPrecision
386 OpDecorate %299 RelaxedPrecision
387 OpDecorate %302 RelaxedPrecision
388 OpDecorate %303 RelaxedPrecision
389 OpDecorate %305 RelaxedPrecision
390 OpDecorate %308 RelaxedPrecision
391 OpDecorate %309 RelaxedPrecision
392 OpDecorate %311 RelaxedPrecision
393 OpDecorate %314 RelaxedPrecision
394 OpDecorate %315 RelaxedPrecision
395 OpDecorate %316 RelaxedPrecision
396 OpDecorate %317 RelaxedPrecision
397 OpDecorate %323 RelaxedPrecision
398 OpDecorate %329 RelaxedPrecision
399 OpDecorate %330 RelaxedPrecision
400 OpDecorate %331 RelaxedPrecision
401 OpDecorate %336 RelaxedPrecision
402 OpDecorate %338 RelaxedPrecision
403 OpDecorate %342 RelaxedPrecision
404 OpDecorate %347 RelaxedPrecision
405 OpDecorate %349 RelaxedPrecision
406 OpDecorate %352 RelaxedPrecision
407 OpDecorate %355 RelaxedPrecision
408 OpDecorate %356 RelaxedPrecision
409 OpDecorate %359 RelaxedPrecision
410 OpDecorate %370 RelaxedPrecision
411 OpDecorate %371 RelaxedPrecision
412 OpDecorate %374 RelaxedPrecision
413 OpDecorate %381 BuiltIn FragCoord
414 OpDecorate %397 RelaxedPrecision
415 OpDecorate %399 RelaxedPrecision
416 OpDecorate %405 RelaxedPrecision
417 OpDecorate %408 RelaxedPrecision
418 OpDecorate %410 RelaxedPrecision
419 OpDecorate %411 RelaxedPrecision
420 OpDecorate %412 RelaxedPrecision
421 OpDecorate %417 RelaxedPrecision
422 OpDecorate %421 RelaxedPrecision
423 OpDecorate %422 RelaxedPrecision
424 OpDecorate %426 RelaxedPrecision
425 OpDecorate %427 RelaxedPrecision
426 OpDecorate %431 RelaxedPrecision
427 OpDecorate %436 Location 0
429 %3 = OpTypeFunction %2
431 %7 = OpTypeStruct %6 %6 %6
432 %8 = OpTypePointer Function %7
433 %9 = OpTypePointer Function %6
434 %10 = OpTypeFunction %2 %8 %9
435 %15 = OpTypeFunction %2 %9 %9
436 %20 = OpTypeFunction %6 %9
438 %25 = OpTypePointer Function %24
439 %26 = OpTypeVector %24 3
440 %27 = OpTypeFunction %26 %25
441 %31 = OpTypeFunction %24 %25
442 %35 = OpConstant %6 0
443 %38 = OpConstant %6 1
444 %39 = OpConstant %6 -1
445 %41 = OpConstant %6 2
448 %55 = OpConstant %54 10
449 %56 = OpTypeArray %7 %55
450 %57 = OpTypePointer Private %56
451 %58 = OpVariable %57 Private
452 %60 = OpTypePointer Private %6
453 %77 = OpTypePointer Private %7
454 %113 = OpConstant %54 50
455 %114 = OpTypeArray %24 %113
456 %115 = OpTypePointer Function %114
457 %120 = OpConstant %6 50
458 %138 = OpTypeVector %24 2
459 %139 = OpTypeStruct %138
460 %140 = OpTypePointer Uniform %139
461 %141 = OpVariable %140 Uniform
462 %142 = OpConstant %54 0
463 %143 = OpTypePointer Uniform %24
464 %146 = OpConstant %54 1
465 %187 = OpConstant %6 15
466 %191 = OpConstant %24 30
467 %193 = OpConstant %24 1
468 %194 = OpConstant %24 5
469 %200 = OpConstant %24 50
470 %205 = OpConstant %24 6.5
471 %209 = OpConstant %24 1.5
472 %213 = OpConstant %6 100
473 %219 = OpConstant %24 4
474 %223 = OpConstant %24 0
475 %226 = OpConstant %6 6
476 %234 = OpConstant %24 10
477 %235 = OpConstant %6 30
478 %243 = OpConstant %6 9
479 %253 = OpConstant %6 5
480 %267 = OpConstantTrue %51
481 %269 = OpConstant %6 7
482 %278 = OpConstant %6 12
483 %297 = OpConstant %6 8
484 %324 = OpConstant %6 3
485 %332 = OpTypeArray %24 %55
486 %333 = OpTypeStruct %332 %332
487 %334 = OpTypePointer Function %333
488 %339 = OpConstant %6 10
489 %357 = OpConstant %6 17
490 %372 = OpConstant %6 13
491 %377 = OpTypePointer Function %138
492 %379 = OpTypeVector %24 4
493 %380 = OpTypePointer Input %379
494 %381 = OpVariable %380 Input
495 %384 = OpConstant %24 256
496 %385 = OpConstantComposite %138 %384 %384
497 %398 = OpConstant %6 -100
498 %406 = OpConstant %6 20
499 %435 = OpTypePointer Output %379
500 %436 = OpVariable %435 Output
501 %442 = OpTypePointer Function %26
502 %446 = OpConstantComposite %26 %193 %223 %223
503 %4 = OpFunction %2 None %3
505 %242 = OpVariable %9 Function
506 %244 = OpVariable %8 Function
507 %247 = OpVariable %9 Function
508 %254 = OpVariable %9 Function
509 %256 = OpVariable %9 Function
510 %260 = OpVariable %9 Function
511 %261 = OpVariable %9 Function
512 %279 = OpVariable %9 Function
513 %281 = OpVariable %9 Function
514 %285 = OpVariable %9 Function
515 %287 = OpVariable %9 Function
516 %291 = OpVariable %9 Function
517 %293 = OpVariable %9 Function
518 %298 = OpVariable %9 Function
519 %300 = OpVariable %9 Function
520 %304 = OpVariable %9 Function
521 %306 = OpVariable %9 Function
522 %310 = OpVariable %9 Function
523 %312 = OpVariable %9 Function
524 %316 = OpVariable %9 Function
525 %317 = OpVariable %9 Function
526 %331 = OpVariable %9 Function
527 %335 = OpVariable %334 Function
528 %358 = OpVariable %9 Function
529 %360 = OpVariable %9 Function
530 %373 = OpVariable %9 Function
531 %375 = OpVariable %9 Function
532 %378 = OpVariable %377 Function
533 %387 = OpVariable %25 Function
534 %388 = OpVariable %25 Function
535 %392 = OpVariable %25 Function
536 %393 = OpVariable %25 Function
537 %397 = OpVariable %9 Function
538 %399 = OpVariable %9 Function
539 %408 = OpVariable %9 Function
540 %409 = OpVariable %9 Function
541 %428 = OpVariable %25 Function
542 %443 = OpVariable %442 Function
543 %448 = OpVariable %25 Function
545 %245 = OpAccessChain %77 %58 %35
546 %246 = OpLoad %7 %245
549 %248 = OpFunctionCall %2 %13 %244 %247
550 %249 = OpLoad %7 %244
551 %250 = OpAccessChain %77 %58 %35
553 %251 = OpLoad %6 %242
554 %252 = OpIAdd %6 %251 %38
556 %255 = OpLoad %6 %242
559 %257 = OpFunctionCall %2 %18 %254 %256
560 %258 = OpLoad %6 %242
561 %259 = OpIAdd %6 %258 %38
567 OpLoopMerge %264 %265 None
570 OpBranchConditional %267 %263 %264
572 %268 = OpLoad %6 %260
573 %270 = OpSGreaterThanEqual %51 %268 %269
574 OpSelectionMerge %272 None
575 OpBranchConditional %270 %271 %272
579 %274 = OpLoad %6 %260
580 %275 = OpIAdd %6 %274 %38
584 %276 = OpLoad %6 %261
585 %277 = OpIAdd %6 %276 %38
589 %280 = OpLoad %6 %242
592 %282 = OpFunctionCall %2 %18 %279 %281
593 %283 = OpLoad %6 %242
594 %284 = OpIAdd %6 %283 %38
596 %286 = OpLoad %6 %242
599 %288 = OpFunctionCall %2 %18 %285 %287
600 %289 = OpLoad %6 %242
601 %290 = OpIAdd %6 %289 %38
603 %292 = OpLoad %6 %242
606 %294 = OpFunctionCall %2 %18 %291 %293
607 %295 = OpLoad %6 %242
608 %296 = OpIAdd %6 %295 %38
610 %299 = OpLoad %6 %242
613 %301 = OpFunctionCall %2 %18 %298 %300
614 %302 = OpLoad %6 %242
615 %303 = OpIAdd %6 %302 %38
617 %305 = OpLoad %6 %242
620 %307 = OpFunctionCall %2 %18 %304 %306
621 %308 = OpLoad %6 %242
622 %309 = OpIAdd %6 %308 %38
624 %311 = OpLoad %6 %242
627 %313 = OpFunctionCall %2 %18 %310 %312
628 %314 = OpLoad %6 %242
629 %315 = OpIAdd %6 %314 %38
635 OpLoopMerge %320 %321 None
638 OpBranchConditional %267 %319 %320
640 %323 = OpLoad %6 %316
641 %325 = OpSGreaterThanEqual %51 %323 %324
642 OpSelectionMerge %327 None
643 OpBranchConditional %325 %326 %327
647 %329 = OpLoad %6 %316
648 %330 = OpIAdd %6 %329 %38
651 %336 = OpLoad %6 %331
652 %337 = OpSGreaterThanEqual %51 %336 %35
653 %338 = OpLoad %6 %331
654 %340 = OpSLessThan %51 %338 %339
655 %341 = OpLogicalAnd %51 %337 %340
656 %342 = OpLoad %6 %331
657 %343 = OpSelect %6 %341 %342 %35
658 %344 = OpAccessChain %25 %335 %38 %38
659 %345 = OpLoad %24 %344
660 %346 = OpAccessChain %25 %335 %38 %343
662 %347 = OpLoad %6 %317
663 %348 = OpSGreaterThanEqual %51 %347 %35
664 %349 = OpLoad %6 %317
665 %350 = OpSLessThan %51 %349 %339
666 %351 = OpLogicalAnd %51 %348 %350
667 %352 = OpLoad %6 %317
668 %353 = OpSelect %6 %351 %352 %35
669 %354 = OpAccessChain %25 %335 %38 %353
673 %355 = OpLoad %6 %317
674 %356 = OpIAdd %6 %355 %38
678 %359 = OpLoad %6 %242
681 %361 = OpFunctionCall %2 %18 %358 %360
682 %362 = OpAccessChain %143 %141 %35 %142
683 %363 = OpLoad %24 %362
684 %364 = OpAccessChain %143 %141 %35 %146
685 %365 = OpLoad %24 %364
686 %366 = OpFOrdGreaterThan %51 %363 %365
687 OpSelectionMerge %368 None
688 OpBranchConditional %366 %367 %368
692 %370 = OpLoad %6 %242
693 %371 = OpIAdd %6 %370 %38
695 %374 = OpLoad %6 %242
698 %376 = OpFunctionCall %2 %18 %373 %375
699 %382 = OpLoad %379 %381
700 %383 = OpVectorShuffle %138 %382 %382 1 0
701 %386 = OpFDiv %138 %383 %385
703 %389 = OpAccessChain %25 %378 %142
704 %390 = OpLoad %24 %389
706 %391 = OpFunctionCall %24 %33 %388
708 %394 = OpAccessChain %25 %378 %146
709 %395 = OpLoad %24 %394
711 %396 = OpFunctionCall %24 %33 %393
717 OpLoopMerge %402 %403 None
720 %405 = OpLoad %6 %399
721 %407 = OpSLessThan %51 %405 %406
722 OpBranchConditional %407 %401 %402
724 %410 = OpLoad %6 %399
726 %411 = OpFunctionCall %6 %22 %409
728 %412 = OpLoad %6 %408
729 %413 = OpSGreaterThan %51 %412 %35
730 OpSelectionMerge %415 None
731 OpBranchConditional %413 %414 %416
735 %417 = OpLoad %6 %408
736 OpSelectionMerge %420 None
737 OpSwitch %417 %420 -1 %418 0 %419
739 %421 = OpLoad %6 %397
740 %422 = OpIAdd %6 %421 %38
750 %426 = OpLoad %6 %399
751 %427 = OpIAdd %6 %426 %38
755 %429 = OpLoad %24 %387
756 %430 = OpLoad %24 %392
757 %431 = OpLoad %6 %397
758 %432 = OpConvertSToF %24 %431
759 %433 = OpFMul %24 %430 %432
760 %434 = OpFAdd %24 %429 %433
762 %437 = OpAccessChain %143 %141 %35 %142
763 %438 = OpLoad %24 %437
764 %439 = OpAccessChain %143 %141 %35 %146
765 %440 = OpLoad %24 %439
766 %441 = OpFOrdLessThan %51 %438 %440
767 OpSelectionMerge %445 None
768 OpBranchConditional %441 %444 %447
773 %449 = OpLoad %24 %428
775 %450 = OpFunctionCall %26 %29 %448
779 %451 = OpLoad %26 %443
780 %452 = OpCompositeExtract %24 %451 0
781 %453 = OpCompositeExtract %24 %451 1
782 %454 = OpCompositeExtract %24 %451 2
783 %455 = OpCompositeConstruct %379 %452 %453 %454 %193
787 %13 = OpFunction %2 None %10
788 %11 = OpFunctionParameter %8
789 %12 = OpFunctionParameter %9
792 %37 = OpAccessChain %9 %11 %35
794 %40 = OpAccessChain %9 %11 %38
796 %42 = OpAccessChain %9 %11 %41
800 %18 = OpFunction %2 None %15
801 %16 = OpFunctionParameter %9
802 %17 = OpFunctionParameter %9
804 %43 = OpVariable %9 Function
805 %76 = OpVariable %8 Function
806 %80 = OpVariable %9 Function
807 %102 = OpVariable %8 Function
808 %105 = OpVariable %9 Function
809 %112 = OpVariable %9 Function
810 %116 = OpVariable %115 Function
814 OpLoopMerge %46 %47 None
819 %52 = OpSLessThanEqual %51 %49 %50
820 OpBranchConditional %52 %45 %46
824 %61 = OpAccessChain %60 %58 %59 %35
826 %63 = OpSLessThanEqual %51 %53 %62
827 OpSelectionMerge %65 None
828 OpBranchConditional %63 %64 %91
831 %67 = OpAccessChain %60 %58 %66 %38
833 %69 = OpIEqual %51 %68 %39
834 OpSelectionMerge %71 None
835 OpBranchConditional %69 %70 %86
839 %74 = OpAccessChain %60 %58 %72 %38
842 %78 = OpAccessChain %77 %58 %75
847 %82 = OpFunctionCall %2 %13 %76 %80
849 %84 = OpAccessChain %77 %58 %75
854 %88 = OpAccessChain %60 %58 %87 %38
862 %93 = OpAccessChain %60 %58 %92 %41
864 %95 = OpIEqual %51 %94 %39
865 OpSelectionMerge %97 None
866 OpBranchConditional %95 %96 %111
870 %100 = OpAccessChain %60 %58 %98 %41
873 %103 = OpAccessChain %77 %58 %101
874 %104 = OpLoad %7 %103
878 %107 = OpFunctionCall %2 %13 %102 %105
879 %108 = OpLoad %7 %102
880 %109 = OpAccessChain %77 %58 %101
885 %117 = OpLoad %6 %112
886 %118 = OpSGreaterThanEqual %51 %117 %35
887 %119 = OpLoad %6 %112
888 %121 = OpSLessThan %51 %119 %120
889 %122 = OpLogicalAnd %51 %118 %121
890 %123 = OpLoad %6 %112
891 %124 = OpSelect %6 %122 %123 %35
892 %125 = OpAccessChain %25 %116 %35
893 %126 = OpLoad %24 %125
894 %127 = OpAccessChain %25 %116 %124
895 %128 = OpLoad %24 %127
896 %129 = OpFAdd %24 %128 %126
897 %130 = OpAccessChain %25 %116 %124
901 OpLoopMerge %133 %134 None
905 %136 = OpAccessChain %60 %58 %135 %41
906 %137 = OpLoad %6 %136
910 %144 = OpAccessChain %143 %141 %35 %142
911 %145 = OpLoad %24 %144
912 %147 = OpAccessChain %143 %141 %35 %146
913 %148 = OpLoad %24 %147
914 %149 = OpFOrdGreaterThan %51 %145 %148
915 OpBranchConditional %149 %131 %133
927 %22 = OpFunction %6 None %20
928 %21 = OpFunctionParameter %9
930 %151 = OpVariable %9 Function
931 %159 = OpVariable %8 Function
932 %175 = OpVariable %9 Function
936 OpLoopMerge %154 %155 None
939 %157 = OpLoad %6 %151
940 %158 = OpINotEqual %51 %157 %39
941 OpBranchConditional %158 %153 %154
943 %160 = OpLoad %6 %151
944 %161 = OpAccessChain %77 %58 %160
945 %162 = OpLoad %7 %161
947 %163 = OpAccessChain %9 %159 %35
948 %164 = OpLoad %6 %163
950 %166 = OpIEqual %51 %164 %165
951 OpSelectionMerge %168 None
952 OpBranchConditional %166 %167 %168
958 %172 = OpAccessChain %9 %159 %35
959 %173 = OpLoad %6 %172
960 %174 = OpSGreaterThan %51 %171 %173
961 OpSelectionMerge %177 None
962 OpBranchConditional %174 %176 %180
964 %178 = OpAccessChain %9 %159 %41
965 %179 = OpLoad %6 %178
969 %181 = OpAccessChain %9 %159 %38
970 %182 = OpLoad %6 %181
974 %183 = OpLoad %6 %175
982 %29 = OpFunction %26 None %27
983 %28 = OpFunctionParameter %25
985 %186 = OpVariable %25 Function
986 %188 = OpVariable %9 Function
988 %189 = OpFunctionCall %6 %22 %188
989 %190 = OpConvertSToF %24 %189
991 %192 = OpLoad %24 %28
992 %195 = OpLoad %24 %186
993 %196 = OpCompositeConstruct %26 %193 %194 %195
994 %197 = OpVectorTimesScalar %26 %196 %192
995 %198 = OpCompositeConstruct %26 %191 %191 %191
996 %199 = OpFAdd %26 %198 %197
997 %201 = OpCompositeConstruct %26 %200 %200 %200
998 %202 = OpFDiv %26 %199 %201
1001 %33 = OpFunction %24 None %31
1002 %32 = OpFunctionParameter %25
1004 %214 = OpVariable %9 Function
1005 %227 = OpVariable %9 Function
1006 %236 = OpVariable %9 Function
1007 %206 = OpLoad %24 %32
1008 %207 = OpFMul %24 %206 %205
1010 %208 = OpLoad %24 %32
1011 %210 = OpFOrdLessThan %51 %208 %209
1012 OpSelectionMerge %212 None
1013 OpBranchConditional %210 %211 %212
1016 %215 = OpFunctionCall %6 %22 %214
1017 %216 = OpConvertSToF %24 %215
1020 %218 = OpLoad %24 %32
1021 %220 = OpFOrdLessThan %51 %218 %219
1022 OpSelectionMerge %222 None
1023 OpBranchConditional %220 %221 %222
1027 %225 = OpLoad %24 %32
1029 %228 = OpFunctionCall %6 %22 %227
1030 %229 = OpConvertSToF %24 %228
1031 %230 = OpFOrdLessThan %51 %225 %229
1032 OpSelectionMerge %232 None
1033 OpBranchConditional %230 %231 %232
1038 %237 = OpFunctionCall %6 %22 %236
1039 %238 = OpConvertSToF %24 %237
1040 %239 = OpFAdd %24 %234 %238
1045 # uniforms for variant
1048 BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
1052 BUFFER framebuffer FORMAT B8G8R8A8_UNORM
1054 PIPELINE graphics gfz_pipeline
1055 ATTACH variant_vertex_shader
1056 ATTACH variant_fragment_shader
1057 FRAMEBUFFER_SIZE 256 256
1058 BIND BUFFER framebuffer AS color LOCATION 0
1059 BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
1061 CLEAR_COLOR gfz_pipeline 0 0 0 255
1064 RUN gfz_pipeline DRAW_RECT POS 0 0 SIZE 256 256
1065 EXPECT framebuffer IDX 0 0 SIZE 256 256 EQ_RGB 255 0 0