3 # Copyright 2020 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 with once iterated reversed for loop
22 # The test passes because both shaders render the same image.
24 SHADER vertex reference_vertex_shader PASSTHROUGH
26 # reference_fragment_shader is derived from the following GLSL:
28 # precision highp float;
30 # precision highp int;
32 # layout(location = 0) out vec4 _GLF_color;
34 # layout(set = 0, binding = 0) uniform buf0
36 # vec2 injectionSwitch;
40 # int data[10], temp[10];
42 # void merge(int from, int mid, int to)
44 # int k = from, i = from, j = mid + 1;
45 # while (i <= mid && j <= to)
47 # if (data[i] < data[j])
49 # temp[k++] = data[i++];
53 # temp[k++] = data[j++];
56 # while (i < N && i <= mid)
58 # temp[k++] = data[i++];
60 # for (int i = from; i <= to; i++)
69 # for (int m = 1; m <= high; m = 2 * m)
71 # for (int i = low; i < high; i += 2 * m)
74 # int mid = i + m - 1;
75 # int to = min(i + 2 * m - 1, high);
76 # merge(from, mid, to);
82 # int i = int(injectionSwitch.x);
120 # for (int j = 0; j < 10; j++)
126 # if (int(gl_FragCoord[1]) < 30)
128 # grey = 0.5 + float(data[0]) / 10.0;
132 # if (int(gl_FragCoord[1]) < 60)
134 # grey = 0.5 + float(data[1]) / 10.0;
138 # if (int(gl_FragCoord[1]) < 90)
140 # grey = 0.5 + float(data[2]) / 10.0;
144 # if (int(gl_FragCoord[1]) < 120)
146 # grey = 0.5 + float(data[3]) / 10.0;
150 # if (int(gl_FragCoord[1]) < 150)
156 # if (int(gl_FragCoord[1]) < 180)
158 # grey = 0.5 + float(data[5]) / 10.0;
162 # if (int(gl_FragCoord[1]) < 210)
164 # grey = 0.5 + float(data[6]) / 10.0;
168 # if (int(gl_FragCoord[1]) < 240)
170 # grey = 0.5 + float(data[7]) / 10.0;
174 # if (int(gl_FragCoord[1]) < 270)
176 # grey = 0.5 + float(data[8]) / 10.0;
190 # _GLF_color = vec4(vec3(grey), 1.0);
192 SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
195 ; Generator: Khronos Glslang Reference Front End; 10
199 %1 = OpExtInstImport "GLSL.std.450"
200 OpMemoryModel Logical GLSL450
201 OpEntryPoint Fragment %4 "main" %243 %369
202 OpExecutionMode %4 OriginUpperLeft
205 OpName %12 "merge(i1;i1;i1;"
209 OpName %14 "mergeSort("
228 OpMemberName %159 0 "injectionSwitch"
231 OpName %243 "gl_FragCoord"
233 OpName %369 "_GLF_color"
234 OpMemberDecorate %159 0 Offset 0
235 OpDecorate %159 Block
236 OpDecorate %161 DescriptorSet 0
237 OpDecorate %161 Binding 0
238 OpDecorate %243 BuiltIn FragCoord
239 OpDecorate %369 Location 0
241 %3 = OpTypeFunction %2
243 %7 = OpTypePointer Function %6
244 %8 = OpTypeFunction %2 %7 %7 %7
245 %22 = OpConstant %6 1
248 %38 = OpConstant %37 10
249 %39 = OpTypeArray %6 %38
250 %40 = OpTypePointer Private %39
251 %41 = OpVariable %40 Private
252 %43 = OpTypePointer Private %6
253 %52 = OpVariable %40 Private
254 %74 = OpConstant %6 10
255 %105 = OpConstant %6 0
256 %107 = OpConstant %6 9
257 %136 = OpConstant %6 2
258 %157 = OpTypeFloat 32
259 %158 = OpTypeVector %157 2
260 %159 = OpTypeStruct %158
261 %160 = OpTypePointer Uniform %159
262 %161 = OpVariable %160 Uniform
263 %162 = OpConstant %37 0
264 %163 = OpTypePointer Uniform %157
265 %184 = OpConstant %6 4
266 %188 = OpConstant %6 3
267 %201 = OpConstant %6 -1
268 %205 = OpConstant %6 -2
269 %209 = OpConstant %6 -3
270 %213 = OpConstant %6 -4
271 %217 = OpConstant %6 -5
272 %241 = OpTypeVector %157 4
273 %242 = OpTypePointer Input %241
274 %243 = OpVariable %242 Input
275 %244 = OpConstant %37 1
276 %245 = OpTypePointer Input %157
277 %249 = OpConstant %6 30
278 %253 = OpTypePointer Function %157
279 %255 = OpConstant %157 0.5
280 %259 = OpConstant %157 10
281 %266 = OpConstant %6 60
282 %279 = OpConstant %6 90
283 %292 = OpConstant %6 120
284 %305 = OpConstant %6 150
285 %314 = OpConstant %6 180
286 %318 = OpConstant %6 5
287 %328 = OpConstant %6 210
288 %332 = OpConstant %6 6
289 %342 = OpConstant %6 240
290 %346 = OpConstant %6 7
291 %356 = OpConstant %6 270
292 %360 = OpConstant %6 8
293 %368 = OpTypePointer Output %241
294 %369 = OpVariable %368 Output
295 %371 = OpTypeVector %157 3
296 %373 = OpConstant %157 1
297 %4 = OpFunction %2 None %3
299 %156 = OpVariable %7 Function
300 %225 = OpVariable %7 Function
301 %254 = OpVariable %253 Function
302 %164 = OpAccessChain %163 %161 %105 %162
303 %165 = OpLoad %157 %164
304 %166 = OpConvertFToS %6 %165
308 OpLoopMerge %169 %170 None
311 %171 = OpLoad %6 %156
312 OpSelectionMerge %182 None
313 OpSwitch %171 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
315 %183 = OpLoad %6 %156
316 %185 = OpAccessChain %43 %41 %183
320 %187 = OpLoad %6 %156
321 %189 = OpAccessChain %43 %41 %187
325 %191 = OpLoad %6 %156
326 %192 = OpAccessChain %43 %41 %191
330 %194 = OpLoad %6 %156
331 %195 = OpAccessChain %43 %41 %194
335 %197 = OpLoad %6 %156
336 %198 = OpAccessChain %43 %41 %197
340 %200 = OpLoad %6 %156
341 %202 = OpAccessChain %43 %41 %200
345 %204 = OpLoad %6 %156
346 %206 = OpAccessChain %43 %41 %204
350 %208 = OpLoad %6 %156
351 %210 = OpAccessChain %43 %41 %208
355 %212 = OpLoad %6 %156
356 %214 = OpAccessChain %43 %41 %212
360 %216 = OpLoad %6 %156
361 %218 = OpAccessChain %43 %41 %216
365 %221 = OpLoad %6 %156
366 %222 = OpIAdd %6 %221 %22
370 %223 = OpLoad %6 %156
371 %224 = OpSLessThan %31 %223 %74
372 OpBranchConditional %224 %167 %169
377 OpLoopMerge %228 %229 None
380 %231 = OpLoad %6 %225
381 %232 = OpSLessThan %31 %231 %74
382 OpBranchConditional %232 %227 %228
384 %233 = OpLoad %6 %225
385 %234 = OpLoad %6 %225
386 %235 = OpAccessChain %43 %41 %234
387 %236 = OpLoad %6 %235
388 %237 = OpAccessChain %43 %52 %233
392 %238 = OpLoad %6 %225
393 %239 = OpIAdd %6 %238 %22
397 %240 = OpFunctionCall %2 %14
398 %246 = OpAccessChain %245 %243 %244
399 %247 = OpLoad %157 %246
400 %248 = OpConvertFToS %6 %247
401 %250 = OpSLessThan %31 %248 %249
402 OpSelectionMerge %252 None
403 OpBranchConditional %250 %251 %262
405 %256 = OpAccessChain %43 %41 %105
406 %257 = OpLoad %6 %256
407 %258 = OpConvertSToF %157 %257
408 %260 = OpFDiv %157 %258 %259
409 %261 = OpFAdd %157 %255 %260
413 %263 = OpAccessChain %245 %243 %244
414 %264 = OpLoad %157 %263
415 %265 = OpConvertFToS %6 %264
416 %267 = OpSLessThan %31 %265 %266
417 OpSelectionMerge %269 None
418 OpBranchConditional %267 %268 %275
420 %270 = OpAccessChain %43 %41 %22
421 %271 = OpLoad %6 %270
422 %272 = OpConvertSToF %157 %271
423 %273 = OpFDiv %157 %272 %259
424 %274 = OpFAdd %157 %255 %273
428 %276 = OpAccessChain %245 %243 %244
429 %277 = OpLoad %157 %276
430 %278 = OpConvertFToS %6 %277
431 %280 = OpSLessThan %31 %278 %279
432 OpSelectionMerge %282 None
433 OpBranchConditional %280 %281 %288
435 %283 = OpAccessChain %43 %41 %136
436 %284 = OpLoad %6 %283
437 %285 = OpConvertSToF %157 %284
438 %286 = OpFDiv %157 %285 %259
439 %287 = OpFAdd %157 %255 %286
443 %289 = OpAccessChain %245 %243 %244
444 %290 = OpLoad %157 %289
445 %291 = OpConvertFToS %6 %290
446 %293 = OpSLessThan %31 %291 %292
447 OpSelectionMerge %295 None
448 OpBranchConditional %293 %294 %301
450 %296 = OpAccessChain %43 %41 %188
451 %297 = OpLoad %6 %296
452 %298 = OpConvertSToF %157 %297
453 %299 = OpFDiv %157 %298 %259
454 %300 = OpFAdd %157 %255 %299
458 %302 = OpAccessChain %245 %243 %244
459 %303 = OpLoad %157 %302
460 %304 = OpConvertFToS %6 %303
461 %306 = OpSLessThan %31 %304 %305
462 OpSelectionMerge %308 None
463 OpBranchConditional %306 %307 %310
467 %311 = OpAccessChain %245 %243 %244
468 %312 = OpLoad %157 %311
469 %313 = OpConvertFToS %6 %312
470 %315 = OpSLessThan %31 %313 %314
471 OpSelectionMerge %317 None
472 OpBranchConditional %315 %316 %324
474 %319 = OpAccessChain %43 %41 %318
475 %320 = OpLoad %6 %319
476 %321 = OpConvertSToF %157 %320
477 %322 = OpFDiv %157 %321 %259
478 %323 = OpFAdd %157 %255 %322
482 %325 = OpAccessChain %245 %243 %244
483 %326 = OpLoad %157 %325
484 %327 = OpConvertFToS %6 %326
485 %329 = OpSLessThan %31 %327 %328
486 OpSelectionMerge %331 None
487 OpBranchConditional %329 %330 %338
489 %333 = OpAccessChain %43 %41 %332
490 %334 = OpLoad %6 %333
491 %335 = OpConvertSToF %157 %334
492 %336 = OpFDiv %157 %335 %259
493 %337 = OpFAdd %157 %255 %336
497 %339 = OpAccessChain %245 %243 %244
498 %340 = OpLoad %157 %339
499 %341 = OpConvertFToS %6 %340
500 %343 = OpSLessThan %31 %341 %342
501 OpSelectionMerge %345 None
502 OpBranchConditional %343 %344 %352
504 %347 = OpAccessChain %43 %41 %346
505 %348 = OpLoad %6 %347
506 %349 = OpConvertSToF %157 %348
507 %350 = OpFDiv %157 %349 %259
508 %351 = OpFAdd %157 %255 %350
512 %353 = OpAccessChain %245 %243 %244
513 %354 = OpLoad %157 %353
514 %355 = OpConvertFToS %6 %354
515 %357 = OpSLessThan %31 %355 %356
516 OpSelectionMerge %359 None
517 OpBranchConditional %357 %358 %366
519 %361 = OpAccessChain %43 %41 %360
520 %362 = OpLoad %6 %361
521 %363 = OpConvertSToF %157 %362
522 %364 = OpFDiv %157 %363 %259
523 %365 = OpFAdd %157 %255 %364
545 %370 = OpLoad %157 %254
546 %372 = OpCompositeConstruct %371 %370 %370 %370
547 %374 = OpCompositeExtract %157 %372 0
548 %375 = OpCompositeExtract %157 %372 1
549 %376 = OpCompositeExtract %157 %372 2
550 %377 = OpCompositeConstruct %241 %374 %375 %376 %373
554 %12 = OpFunction %2 None %8
555 %9 = OpFunctionParameter %7
556 %10 = OpFunctionParameter %7
557 %11 = OpFunctionParameter %7
559 %16 = OpVariable %7 Function
560 %18 = OpVariable %7 Function
561 %20 = OpVariable %7 Function
562 %87 = OpVariable %7 Function
568 %23 = OpIAdd %6 %21 %22
572 OpLoopMerge %26 %27 None
577 %32 = OpSLessThanEqual %31 %29 %30
580 %35 = OpSLessThanEqual %31 %33 %34
581 %36 = OpLogicalAnd %31 %32 %35
582 OpBranchConditional %36 %25 %26
585 %44 = OpAccessChain %43 %41 %42
588 %47 = OpAccessChain %43 %41 %46
590 %49 = OpSLessThan %31 %45 %48
591 OpSelectionMerge %51 None
592 OpBranchConditional %49 %50 %60
595 %54 = OpIAdd %6 %53 %22
598 %56 = OpIAdd %6 %55 %22
600 %57 = OpAccessChain %43 %41 %55
602 %59 = OpAccessChain %43 %52 %53
607 %62 = OpIAdd %6 %61 %22
610 %64 = OpIAdd %6 %63 %22
612 %65 = OpAccessChain %43 %41 %63
614 %67 = OpAccessChain %43 %52 %61
624 OpLoopMerge %70 %71 None
628 %75 = OpSLessThan %31 %73 %74
631 %78 = OpSLessThanEqual %31 %76 %77
632 %79 = OpLogicalAnd %31 %75 %78
633 OpBranchConditional %79 %69 %70
636 %81 = OpIAdd %6 %80 %22
639 %83 = OpIAdd %6 %82 %22
641 %84 = OpAccessChain %43 %41 %82
643 %86 = OpAccessChain %43 %52 %80
653 OpLoopMerge %91 %92 None
658 %96 = OpSLessThanEqual %31 %94 %95
659 OpBranchConditional %96 %90 %91
663 %99 = OpAccessChain %43 %52 %98
665 %101 = OpAccessChain %43 %41 %97
670 %103 = OpIAdd %6 %102 %22
676 %14 = OpFunction %2 None %3
678 %104 = OpVariable %7 Function
679 %106 = OpVariable %7 Function
680 %108 = OpVariable %7 Function
681 %117 = OpVariable %7 Function
682 %127 = OpVariable %7 Function
683 %129 = OpVariable %7 Function
684 %134 = OpVariable %7 Function
685 %143 = OpVariable %7 Function
686 %145 = OpVariable %7 Function
687 %147 = OpVariable %7 Function
693 OpLoopMerge %111 %112 None
696 %114 = OpLoad %6 %108
697 %115 = OpLoad %6 %106
698 %116 = OpSLessThanEqual %31 %114 %115
699 OpBranchConditional %116 %110 %111
701 %118 = OpLoad %6 %104
705 OpLoopMerge %121 %122 None
708 %124 = OpLoad %6 %117
709 %125 = OpLoad %6 %106
710 %126 = OpSLessThan %31 %124 %125
711 OpBranchConditional %126 %120 %121
713 %128 = OpLoad %6 %117
715 %130 = OpLoad %6 %117
716 %131 = OpLoad %6 %108
717 %132 = OpIAdd %6 %130 %131
718 %133 = OpISub %6 %132 %22
720 %135 = OpLoad %6 %117
721 %137 = OpLoad %6 %108
722 %138 = OpIMul %6 %136 %137
723 %139 = OpIAdd %6 %135 %138
724 %140 = OpISub %6 %139 %22
725 %141 = OpLoad %6 %106
726 %142 = OpExtInst %6 %1 SMin %140 %141
728 %144 = OpLoad %6 %127
730 %146 = OpLoad %6 %129
732 %148 = OpLoad %6 %134
734 %149 = OpFunctionCall %2 %12 %143 %145 %147
737 %150 = OpLoad %6 %108
738 %151 = OpIMul %6 %136 %150
739 %152 = OpLoad %6 %117
740 %153 = OpIAdd %6 %152 %151
746 %154 = OpLoad %6 %108
747 %155 = OpIMul %6 %136 %154
755 # uniforms for reference
758 BUFFER reference_injectionSwitch DATA_TYPE vec2<float> DATA
762 BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
764 PIPELINE graphics reference_pipeline
765 ATTACH reference_vertex_shader
766 ATTACH reference_fragment_shader
767 FRAMEBUFFER_SIZE 256 256
768 BIND BUFFER reference_framebuffer AS color LOCATION 0
769 BIND BUFFER reference_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
771 CLEAR_COLOR reference_pipeline 0 0 0 255
773 CLEAR reference_pipeline
774 RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
777 SHADER vertex variant_vertex_shader PASSTHROUGH
779 # variant_fragment_shader is derived from the following GLSL:
781 # precision highp float;
783 # precision highp int;
785 # layout(location = 0) out vec4 _GLF_color;
787 # layout(set = 0, binding = 0) uniform buf0
789 # vec2 injectionSwitch;
793 # int data[10], temp[10];
795 # void merge(int from, int mid, int to)
797 # int k = from, i = from, j = mid + 1;
798 # while (i <= mid && j <= to)
800 # if (data[i] < data[j])
802 # temp[k++] = data[i++];
806 # temp[k++] = data[j++];
809 # while (i < N && i <= mid)
811 # temp[k++] = data[i++];
813 # for (int i = from; i <= to; i++)
822 # for (int m = 1; m <= high; m = 2 * m)
824 # for (int i = low; i < high; i += 2 * m)
827 # int mid = i + m - 1;
828 # int to = min(i + 2 * m - 1, high);
829 # merge(from, mid, to);
835 # int i = int(injectionSwitch.x);
873 # for (int j = 0; j < 10; j++)
879 # if (int(gl_FragCoord[1]) < 30)
881 # grey = 0.5 + float(data[0]) / 10.0;
885 # if (int(gl_FragCoord[1]) < 60)
887 # grey = 0.5 + float(data[1]) / 10.0;
891 # if (int(gl_FragCoord[1]) < 90)
893 # grey = 0.5 + float(data[2]) / 10.0;
897 # if (int(gl_FragCoord[1]) < 120)
899 # grey = 0.5 + float(data[3]) / 10.0;
903 # if (int(gl_FragCoord[1]) < 150)
906 # for (int int_i = 1; int_i > int((injectionSwitch.x)); int_i--)
913 # if (int(gl_FragCoord[1]) < 180)
915 # grey = 0.5 + float(data[5]) / 10.0;
919 # if (int(gl_FragCoord[1]) < 210)
921 # grey = 0.5 + float(data[6]) / 10.0;
925 # if (int(gl_FragCoord[1]) < 240)
927 # grey = 0.5 + float(data[7]) / 10.0;
931 # if (int(gl_FragCoord[1]) < 270)
933 # grey = 0.5 + float(data[8]) / 10.0;
947 # _GLF_color = vec4(vec3(grey), 1.0);
949 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
952 ; Generator: Khronos Glslang Reference Front End; 10
956 %1 = OpExtInstImport "GLSL.std.450"
957 OpMemoryModel Logical GLSL450
958 OpEntryPoint Fragment %4 "main" %243 %382
959 OpExecutionMode %4 OriginUpperLeft
962 OpName %12 "merge(i1;i1;i1;"
966 OpName %14 "mergeSort("
985 OpMemberName %159 0 "injectionSwitch"
988 OpName %243 "gl_FragCoord"
991 OpName %382 "_GLF_color"
992 OpMemberDecorate %159 0 Offset 0
993 OpDecorate %159 Block
994 OpDecorate %161 DescriptorSet 0
995 OpDecorate %161 Binding 0
996 OpDecorate %243 BuiltIn FragCoord
997 OpDecorate %382 Location 0
999 %3 = OpTypeFunction %2
1001 %7 = OpTypePointer Function %6
1002 %8 = OpTypeFunction %2 %7 %7 %7
1003 %22 = OpConstant %6 1
1005 %37 = OpTypeInt 32 0
1006 %38 = OpConstant %37 10
1007 %39 = OpTypeArray %6 %38
1008 %40 = OpTypePointer Private %39
1009 %41 = OpVariable %40 Private
1010 %43 = OpTypePointer Private %6
1011 %52 = OpVariable %40 Private
1012 %74 = OpConstant %6 10
1013 %105 = OpConstant %6 0
1014 %107 = OpConstant %6 9
1015 %136 = OpConstant %6 2
1016 %157 = OpTypeFloat 32
1017 %158 = OpTypeVector %157 2
1018 %159 = OpTypeStruct %158
1019 %160 = OpTypePointer Uniform %159
1020 %161 = OpVariable %160 Uniform
1021 %162 = OpConstant %37 0
1022 %163 = OpTypePointer Uniform %157
1023 %184 = OpConstant %6 4
1024 %188 = OpConstant %6 3
1025 %201 = OpConstant %6 -1
1026 %205 = OpConstant %6 -2
1027 %209 = OpConstant %6 -3
1028 %213 = OpConstant %6 -4
1029 %217 = OpConstant %6 -5
1030 %241 = OpTypeVector %157 4
1031 %242 = OpTypePointer Input %241
1032 %243 = OpVariable %242 Input
1033 %244 = OpConstant %37 1
1034 %245 = OpTypePointer Input %157
1035 %249 = OpConstant %6 30
1036 %253 = OpTypePointer Function %157
1037 %255 = OpConstant %157 0.5
1038 %259 = OpConstant %157 10
1039 %266 = OpConstant %6 60
1040 %279 = OpConstant %6 90
1041 %292 = OpConstant %6 120
1042 %305 = OpConstant %6 150
1043 %327 = OpConstant %6 180
1044 %331 = OpConstant %6 5
1045 %341 = OpConstant %6 210
1046 %345 = OpConstant %6 6
1047 %355 = OpConstant %6 240
1048 %359 = OpConstant %6 7
1049 %369 = OpConstant %6 270
1050 %373 = OpConstant %6 8
1051 %381 = OpTypePointer Output %241
1052 %382 = OpVariable %381 Output
1053 %384 = OpTypeVector %157 3
1054 %386 = OpConstant %157 1
1055 %4 = OpFunction %2 None %3
1057 %156 = OpVariable %7 Function
1058 %225 = OpVariable %7 Function
1059 %254 = OpVariable %253 Function
1060 %309 = OpVariable %7 Function
1061 %164 = OpAccessChain %163 %161 %105 %162
1062 %165 = OpLoad %157 %164
1063 %166 = OpConvertFToS %6 %165
1067 OpLoopMerge %169 %170 None
1070 %171 = OpLoad %6 %156
1071 OpSelectionMerge %182 None
1072 OpSwitch %171 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
1074 %183 = OpLoad %6 %156
1075 %185 = OpAccessChain %43 %41 %183
1079 %187 = OpLoad %6 %156
1080 %189 = OpAccessChain %43 %41 %187
1084 %191 = OpLoad %6 %156
1085 %192 = OpAccessChain %43 %41 %191
1089 %194 = OpLoad %6 %156
1090 %195 = OpAccessChain %43 %41 %194
1094 %197 = OpLoad %6 %156
1095 %198 = OpAccessChain %43 %41 %197
1099 %200 = OpLoad %6 %156
1100 %202 = OpAccessChain %43 %41 %200
1104 %204 = OpLoad %6 %156
1105 %206 = OpAccessChain %43 %41 %204
1109 %208 = OpLoad %6 %156
1110 %210 = OpAccessChain %43 %41 %208
1114 %212 = OpLoad %6 %156
1115 %214 = OpAccessChain %43 %41 %212
1119 %216 = OpLoad %6 %156
1120 %218 = OpAccessChain %43 %41 %216
1124 %221 = OpLoad %6 %156
1125 %222 = OpIAdd %6 %221 %22
1129 %223 = OpLoad %6 %156
1130 %224 = OpSLessThan %31 %223 %74
1131 OpBranchConditional %224 %167 %169
1136 OpLoopMerge %228 %229 None
1139 %231 = OpLoad %6 %225
1140 %232 = OpSLessThan %31 %231 %74
1141 OpBranchConditional %232 %227 %228
1143 %233 = OpLoad %6 %225
1144 %234 = OpLoad %6 %225
1145 %235 = OpAccessChain %43 %41 %234
1146 %236 = OpLoad %6 %235
1147 %237 = OpAccessChain %43 %52 %233
1151 %238 = OpLoad %6 %225
1152 %239 = OpIAdd %6 %238 %22
1156 %240 = OpFunctionCall %2 %14
1157 %246 = OpAccessChain %245 %243 %244
1158 %247 = OpLoad %157 %246
1159 %248 = OpConvertFToS %6 %247
1160 %250 = OpSLessThan %31 %248 %249
1161 OpSelectionMerge %252 None
1162 OpBranchConditional %250 %251 %262
1164 %256 = OpAccessChain %43 %41 %105
1165 %257 = OpLoad %6 %256
1166 %258 = OpConvertSToF %157 %257
1167 %260 = OpFDiv %157 %258 %259
1168 %261 = OpFAdd %157 %255 %260
1172 %263 = OpAccessChain %245 %243 %244
1173 %264 = OpLoad %157 %263
1174 %265 = OpConvertFToS %6 %264
1175 %267 = OpSLessThan %31 %265 %266
1176 OpSelectionMerge %269 None
1177 OpBranchConditional %267 %268 %275
1179 %270 = OpAccessChain %43 %41 %22
1180 %271 = OpLoad %6 %270
1181 %272 = OpConvertSToF %157 %271
1182 %273 = OpFDiv %157 %272 %259
1183 %274 = OpFAdd %157 %255 %273
1187 %276 = OpAccessChain %245 %243 %244
1188 %277 = OpLoad %157 %276
1189 %278 = OpConvertFToS %6 %277
1190 %280 = OpSLessThan %31 %278 %279
1191 OpSelectionMerge %282 None
1192 OpBranchConditional %280 %281 %288
1194 %283 = OpAccessChain %43 %41 %136
1195 %284 = OpLoad %6 %283
1196 %285 = OpConvertSToF %157 %284
1197 %286 = OpFDiv %157 %285 %259
1198 %287 = OpFAdd %157 %255 %286
1202 %289 = OpAccessChain %245 %243 %244
1203 %290 = OpLoad %157 %289
1204 %291 = OpConvertFToS %6 %290
1205 %293 = OpSLessThan %31 %291 %292
1206 OpSelectionMerge %295 None
1207 OpBranchConditional %293 %294 %301
1209 %296 = OpAccessChain %43 %41 %188
1210 %297 = OpLoad %6 %296
1211 %298 = OpConvertSToF %157 %297
1212 %299 = OpFDiv %157 %298 %259
1213 %300 = OpFAdd %157 %255 %299
1217 %302 = OpAccessChain %245 %243 %244
1218 %303 = OpLoad %157 %302
1219 %304 = OpConvertFToS %6 %303
1220 %306 = OpSLessThan %31 %304 %305
1221 OpSelectionMerge %308 None
1222 OpBranchConditional %306 %307 %323
1227 OpLoopMerge %312 %313 None
1230 %315 = OpLoad %6 %309
1231 %316 = OpAccessChain %163 %161 %105 %162
1232 %317 = OpLoad %157 %316
1233 %318 = OpConvertFToS %6 %317
1234 %319 = OpSGreaterThan %31 %315 %318
1235 OpBranchConditional %319 %311 %312
1243 %324 = OpAccessChain %245 %243 %244
1244 %325 = OpLoad %157 %324
1245 %326 = OpConvertFToS %6 %325
1246 %328 = OpSLessThan %31 %326 %327
1247 OpSelectionMerge %330 None
1248 OpBranchConditional %328 %329 %337
1250 %332 = OpAccessChain %43 %41 %331
1251 %333 = OpLoad %6 %332
1252 %334 = OpConvertSToF %157 %333
1253 %335 = OpFDiv %157 %334 %259
1254 %336 = OpFAdd %157 %255 %335
1258 %338 = OpAccessChain %245 %243 %244
1259 %339 = OpLoad %157 %338
1260 %340 = OpConvertFToS %6 %339
1261 %342 = OpSLessThan %31 %340 %341
1262 OpSelectionMerge %344 None
1263 OpBranchConditional %342 %343 %351
1265 %346 = OpAccessChain %43 %41 %345
1266 %347 = OpLoad %6 %346
1267 %348 = OpConvertSToF %157 %347
1268 %349 = OpFDiv %157 %348 %259
1269 %350 = OpFAdd %157 %255 %349
1273 %352 = OpAccessChain %245 %243 %244
1274 %353 = OpLoad %157 %352
1275 %354 = OpConvertFToS %6 %353
1276 %356 = OpSLessThan %31 %354 %355
1277 OpSelectionMerge %358 None
1278 OpBranchConditional %356 %357 %365
1280 %360 = OpAccessChain %43 %41 %359
1281 %361 = OpLoad %6 %360
1282 %362 = OpConvertSToF %157 %361
1283 %363 = OpFDiv %157 %362 %259
1284 %364 = OpFAdd %157 %255 %363
1288 %366 = OpAccessChain %245 %243 %244
1289 %367 = OpLoad %157 %366
1290 %368 = OpConvertFToS %6 %367
1291 %370 = OpSLessThan %31 %368 %369
1292 OpSelectionMerge %372 None
1293 OpBranchConditional %370 %371 %379
1295 %374 = OpAccessChain %43 %41 %373
1296 %375 = OpLoad %6 %374
1297 %376 = OpConvertSToF %157 %375
1298 %377 = OpFDiv %157 %376 %259
1299 %378 = OpFAdd %157 %255 %377
1321 %383 = OpLoad %157 %254
1322 %385 = OpCompositeConstruct %384 %383 %383 %383
1323 %387 = OpCompositeExtract %157 %385 0
1324 %388 = OpCompositeExtract %157 %385 1
1325 %389 = OpCompositeExtract %157 %385 2
1326 %390 = OpCompositeConstruct %241 %387 %388 %389 %386
1330 %12 = OpFunction %2 None %8
1331 %9 = OpFunctionParameter %7
1332 %10 = OpFunctionParameter %7
1333 %11 = OpFunctionParameter %7
1335 %16 = OpVariable %7 Function
1336 %18 = OpVariable %7 Function
1337 %20 = OpVariable %7 Function
1338 %87 = OpVariable %7 Function
1344 %23 = OpIAdd %6 %21 %22
1348 OpLoopMerge %26 %27 None
1353 %32 = OpSLessThanEqual %31 %29 %30
1356 %35 = OpSLessThanEqual %31 %33 %34
1357 %36 = OpLogicalAnd %31 %32 %35
1358 OpBranchConditional %36 %25 %26
1361 %44 = OpAccessChain %43 %41 %42
1364 %47 = OpAccessChain %43 %41 %46
1366 %49 = OpSLessThan %31 %45 %48
1367 OpSelectionMerge %51 None
1368 OpBranchConditional %49 %50 %60
1371 %54 = OpIAdd %6 %53 %22
1374 %56 = OpIAdd %6 %55 %22
1376 %57 = OpAccessChain %43 %41 %55
1378 %59 = OpAccessChain %43 %52 %53
1383 %62 = OpIAdd %6 %61 %22
1386 %64 = OpIAdd %6 %63 %22
1388 %65 = OpAccessChain %43 %41 %63
1390 %67 = OpAccessChain %43 %52 %61
1400 OpLoopMerge %70 %71 None
1404 %75 = OpSLessThan %31 %73 %74
1407 %78 = OpSLessThanEqual %31 %76 %77
1408 %79 = OpLogicalAnd %31 %75 %78
1409 OpBranchConditional %79 %69 %70
1412 %81 = OpIAdd %6 %80 %22
1415 %83 = OpIAdd %6 %82 %22
1417 %84 = OpAccessChain %43 %41 %82
1419 %86 = OpAccessChain %43 %52 %80
1429 OpLoopMerge %91 %92 None
1434 %96 = OpSLessThanEqual %31 %94 %95
1435 OpBranchConditional %96 %90 %91
1439 %99 = OpAccessChain %43 %52 %98
1440 %100 = OpLoad %6 %99
1441 %101 = OpAccessChain %43 %41 %97
1445 %102 = OpLoad %6 %87
1446 %103 = OpIAdd %6 %102 %22
1452 %14 = OpFunction %2 None %3
1454 %104 = OpVariable %7 Function
1455 %106 = OpVariable %7 Function
1456 %108 = OpVariable %7 Function
1457 %117 = OpVariable %7 Function
1458 %127 = OpVariable %7 Function
1459 %129 = OpVariable %7 Function
1460 %134 = OpVariable %7 Function
1461 %143 = OpVariable %7 Function
1462 %145 = OpVariable %7 Function
1463 %147 = OpVariable %7 Function
1469 OpLoopMerge %111 %112 None
1472 %114 = OpLoad %6 %108
1473 %115 = OpLoad %6 %106
1474 %116 = OpSLessThanEqual %31 %114 %115
1475 OpBranchConditional %116 %110 %111
1477 %118 = OpLoad %6 %104
1481 OpLoopMerge %121 %122 None
1484 %124 = OpLoad %6 %117
1485 %125 = OpLoad %6 %106
1486 %126 = OpSLessThan %31 %124 %125
1487 OpBranchConditional %126 %120 %121
1489 %128 = OpLoad %6 %117
1491 %130 = OpLoad %6 %117
1492 %131 = OpLoad %6 %108
1493 %132 = OpIAdd %6 %130 %131
1494 %133 = OpISub %6 %132 %22
1496 %135 = OpLoad %6 %117
1497 %137 = OpLoad %6 %108
1498 %138 = OpIMul %6 %136 %137
1499 %139 = OpIAdd %6 %135 %138
1500 %140 = OpISub %6 %139 %22
1501 %141 = OpLoad %6 %106
1502 %142 = OpExtInst %6 %1 SMin %140 %141
1504 %144 = OpLoad %6 %127
1506 %146 = OpLoad %6 %129
1508 %148 = OpLoad %6 %134
1510 %149 = OpFunctionCall %2 %12 %143 %145 %147
1513 %150 = OpLoad %6 %108
1514 %151 = OpIMul %6 %136 %150
1515 %152 = OpLoad %6 %117
1516 %153 = OpIAdd %6 %152 %151
1522 %154 = OpLoad %6 %108
1523 %155 = OpIMul %6 %136 %154
1531 # uniforms for variant
1534 BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
1538 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
1540 PIPELINE graphics variant_pipeline
1541 ATTACH variant_vertex_shader
1542 ATTACH variant_fragment_shader
1543 FRAMEBUFFER_SIZE 256 256
1544 BIND BUFFER variant_framebuffer AS color LOCATION 0
1545 BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
1547 CLEAR_COLOR variant_pipeline 0 0 0 255
1549 CLEAR variant_pipeline
1550 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
1552 EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005