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 the GraphicsFuzz project.
20 # Short description: Equivalent shaders, one with more complex branching
22 # The test passes because both shaders render the same image.
24 SHADER vertex reference_vertex_shader PASSTHROUGH
26 SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
29 ; Generator: Khronos Glslang Reference Front End; 7
33 %1 = OpExtInstImport "GLSL.std.450"
34 OpMemoryModel Logical GLSL450
35 OpEntryPoint Fragment %4 "main" %243 %369
36 OpExecutionMode %4 OriginUpperLeft
39 OpName %12 "merge(i1;i1;i1;"
43 OpName %14 "mergeSort("
62 OpMemberName %159 0 "injectionSwitch"
65 OpName %243 "gl_FragCoord"
67 OpName %369 "_GLF_color"
69 OpMemberName %378 0 "resolution"
71 OpMemberDecorate %159 0 Offset 0
73 OpDecorate %161 DescriptorSet 0
74 OpDecorate %161 Binding 0
75 OpDecorate %243 BuiltIn FragCoord
76 OpDecorate %369 Location 0
77 OpMemberDecorate %378 0 Offset 0
79 OpDecorate %380 DescriptorSet 0
80 OpDecorate %380 Binding 1
82 %3 = OpTypeFunction %2
84 %7 = OpTypePointer Function %6
85 %8 = OpTypeFunction %2 %7 %7 %7
89 %38 = OpConstant %37 10
90 %39 = OpTypeArray %6 %38
91 %40 = OpTypePointer Private %39
92 %41 = OpVariable %40 Private
93 %43 = OpTypePointer Private %6
94 %52 = OpVariable %40 Private
95 %74 = OpConstant %6 10
96 %105 = OpConstant %6 0
97 %107 = OpConstant %6 9
98 %136 = OpConstant %6 2
100 %158 = OpTypeVector %157 2
101 %159 = OpTypeStruct %158
102 %160 = OpTypePointer Uniform %159
103 %161 = OpVariable %160 Uniform
104 %162 = OpConstant %37 0
105 %163 = OpTypePointer Uniform %157
106 %184 = OpConstant %6 4
107 %188 = OpConstant %6 3
108 %201 = OpConstant %6 -1
109 %205 = OpConstant %6 -2
110 %209 = OpConstant %6 -3
111 %213 = OpConstant %6 -4
112 %217 = OpConstant %6 -5
113 %241 = OpTypeVector %157 4
114 %242 = OpTypePointer Input %241
115 %243 = OpVariable %242 Input
116 %244 = OpConstant %37 1
117 %245 = OpTypePointer Input %157
118 %249 = OpConstant %6 30
119 %253 = OpTypePointer Function %157
120 %255 = OpConstant %157 0.5
121 %259 = OpConstant %157 10
122 %266 = OpConstant %6 60
123 %279 = OpConstant %6 90
124 %292 = OpConstant %6 120
125 %305 = OpConstant %6 150
126 %314 = OpConstant %6 180
127 %318 = OpConstant %6 5
128 %328 = OpConstant %6 210
129 %332 = OpConstant %6 6
130 %342 = OpConstant %6 240
131 %346 = OpConstant %6 7
132 %356 = OpConstant %6 270
133 %360 = OpConstant %6 8
134 %368 = OpTypePointer Output %241
135 %369 = OpVariable %368 Output
136 %371 = OpTypeVector %157 3
137 %373 = OpConstant %157 1
138 %378 = OpTypeStruct %158
139 %379 = OpTypePointer Uniform %378
140 %380 = OpVariable %379 Uniform
141 %4 = OpFunction %2 None %3
143 %156 = OpVariable %7 Function
144 %225 = OpVariable %7 Function
145 %254 = OpVariable %253 Function
146 %164 = OpAccessChain %163 %161 %105 %162
147 %165 = OpLoad %157 %164
148 %166 = OpConvertFToS %6 %165
152 OpLoopMerge %169 %170 None
155 %171 = OpLoad %6 %156
156 OpSelectionMerge %182 None
157 OpSwitch %171 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
159 %183 = OpLoad %6 %156
160 %185 = OpAccessChain %43 %41 %183
164 %187 = OpLoad %6 %156
165 %189 = OpAccessChain %43 %41 %187
169 %191 = OpLoad %6 %156
170 %192 = OpAccessChain %43 %41 %191
174 %194 = OpLoad %6 %156
175 %195 = OpAccessChain %43 %41 %194
179 %197 = OpLoad %6 %156
180 %198 = OpAccessChain %43 %41 %197
184 %200 = OpLoad %6 %156
185 %202 = OpAccessChain %43 %41 %200
189 %204 = OpLoad %6 %156
190 %206 = OpAccessChain %43 %41 %204
194 %208 = OpLoad %6 %156
195 %210 = OpAccessChain %43 %41 %208
199 %212 = OpLoad %6 %156
200 %214 = OpAccessChain %43 %41 %212
204 %216 = OpLoad %6 %156
205 %218 = OpAccessChain %43 %41 %216
209 %221 = OpLoad %6 %156
210 %222 = OpIAdd %6 %221 %22
214 %223 = OpLoad %6 %156
215 %224 = OpSLessThan %31 %223 %74
216 OpBranchConditional %224 %167 %169
221 OpLoopMerge %228 %229 None
224 %231 = OpLoad %6 %225
225 %232 = OpSLessThan %31 %231 %74
226 OpBranchConditional %232 %227 %228
228 %233 = OpLoad %6 %225
229 %234 = OpLoad %6 %225
230 %235 = OpAccessChain %43 %41 %234
231 %236 = OpLoad %6 %235
232 %237 = OpAccessChain %43 %52 %233
236 %238 = OpLoad %6 %225
237 %239 = OpIAdd %6 %238 %22
241 %240 = OpFunctionCall %2 %14
242 %246 = OpAccessChain %245 %243 %244
243 %247 = OpLoad %157 %246
244 %248 = OpConvertFToS %6 %247
245 %250 = OpSLessThan %31 %248 %249
246 OpSelectionMerge %252 None
247 OpBranchConditional %250 %251 %262
249 %256 = OpAccessChain %43 %41 %105
250 %257 = OpLoad %6 %256
251 %258 = OpConvertSToF %157 %257
252 %260 = OpFDiv %157 %258 %259
253 %261 = OpFAdd %157 %255 %260
257 %263 = OpAccessChain %245 %243 %244
258 %264 = OpLoad %157 %263
259 %265 = OpConvertFToS %6 %264
260 %267 = OpSLessThan %31 %265 %266
261 OpSelectionMerge %269 None
262 OpBranchConditional %267 %268 %275
264 %270 = OpAccessChain %43 %41 %22
265 %271 = OpLoad %6 %270
266 %272 = OpConvertSToF %157 %271
267 %273 = OpFDiv %157 %272 %259
268 %274 = OpFAdd %157 %255 %273
272 %276 = OpAccessChain %245 %243 %244
273 %277 = OpLoad %157 %276
274 %278 = OpConvertFToS %6 %277
275 %280 = OpSLessThan %31 %278 %279
276 OpSelectionMerge %282 None
277 OpBranchConditional %280 %281 %288
279 %283 = OpAccessChain %43 %41 %136
280 %284 = OpLoad %6 %283
281 %285 = OpConvertSToF %157 %284
282 %286 = OpFDiv %157 %285 %259
283 %287 = OpFAdd %157 %255 %286
287 %289 = OpAccessChain %245 %243 %244
288 %290 = OpLoad %157 %289
289 %291 = OpConvertFToS %6 %290
290 %293 = OpSLessThan %31 %291 %292
291 OpSelectionMerge %295 None
292 OpBranchConditional %293 %294 %301
294 %296 = OpAccessChain %43 %41 %188
295 %297 = OpLoad %6 %296
296 %298 = OpConvertSToF %157 %297
297 %299 = OpFDiv %157 %298 %259
298 %300 = OpFAdd %157 %255 %299
302 %302 = OpAccessChain %245 %243 %244
303 %303 = OpLoad %157 %302
304 %304 = OpConvertFToS %6 %303
305 %306 = OpSLessThan %31 %304 %305
306 OpSelectionMerge %308 None
307 OpBranchConditional %306 %307 %310
311 %311 = OpAccessChain %245 %243 %244
312 %312 = OpLoad %157 %311
313 %313 = OpConvertFToS %6 %312
314 %315 = OpSLessThan %31 %313 %314
315 OpSelectionMerge %317 None
316 OpBranchConditional %315 %316 %324
318 %319 = OpAccessChain %43 %41 %318
319 %320 = OpLoad %6 %319
320 %321 = OpConvertSToF %157 %320
321 %322 = OpFDiv %157 %321 %259
322 %323 = OpFAdd %157 %255 %322
326 %325 = OpAccessChain %245 %243 %244
327 %326 = OpLoad %157 %325
328 %327 = OpConvertFToS %6 %326
329 %329 = OpSLessThan %31 %327 %328
330 OpSelectionMerge %331 None
331 OpBranchConditional %329 %330 %338
333 %333 = OpAccessChain %43 %41 %332
334 %334 = OpLoad %6 %333
335 %335 = OpConvertSToF %157 %334
336 %336 = OpFDiv %157 %335 %259
337 %337 = OpFAdd %157 %255 %336
341 %339 = OpAccessChain %245 %243 %244
342 %340 = OpLoad %157 %339
343 %341 = OpConvertFToS %6 %340
344 %343 = OpSLessThan %31 %341 %342
345 OpSelectionMerge %345 None
346 OpBranchConditional %343 %344 %352
348 %347 = OpAccessChain %43 %41 %346
349 %348 = OpLoad %6 %347
350 %349 = OpConvertSToF %157 %348
351 %350 = OpFDiv %157 %349 %259
352 %351 = OpFAdd %157 %255 %350
356 %353 = OpAccessChain %245 %243 %244
357 %354 = OpLoad %157 %353
358 %355 = OpConvertFToS %6 %354
359 %357 = OpSLessThan %31 %355 %356
360 OpSelectionMerge %359 None
361 OpBranchConditional %357 %358 %366
363 %361 = OpAccessChain %43 %41 %360
364 %362 = OpLoad %6 %361
365 %363 = OpConvertSToF %157 %362
366 %364 = OpFDiv %157 %363 %259
367 %365 = OpFAdd %157 %255 %364
389 %370 = OpLoad %157 %254
390 %372 = OpCompositeConstruct %371 %370 %370 %370
391 %374 = OpCompositeExtract %157 %372 0
392 %375 = OpCompositeExtract %157 %372 1
393 %376 = OpCompositeExtract %157 %372 2
394 %377 = OpCompositeConstruct %241 %374 %375 %376 %373
398 %12 = OpFunction %2 None %8
399 %9 = OpFunctionParameter %7
400 %10 = OpFunctionParameter %7
401 %11 = OpFunctionParameter %7
403 %16 = OpVariable %7 Function
404 %18 = OpVariable %7 Function
405 %20 = OpVariable %7 Function
406 %87 = OpVariable %7 Function
412 %23 = OpIAdd %6 %21 %22
416 OpLoopMerge %26 %27 None
421 %32 = OpSLessThanEqual %31 %29 %30
424 %35 = OpSLessThanEqual %31 %33 %34
425 %36 = OpLogicalAnd %31 %32 %35
426 OpBranchConditional %36 %25 %26
429 %44 = OpAccessChain %43 %41 %42
432 %47 = OpAccessChain %43 %41 %46
434 %49 = OpSLessThan %31 %45 %48
435 OpSelectionMerge %51 None
436 OpBranchConditional %49 %50 %60
439 %54 = OpIAdd %6 %53 %22
442 %56 = OpIAdd %6 %55 %22
444 %57 = OpAccessChain %43 %41 %55
446 %59 = OpAccessChain %43 %52 %53
451 %62 = OpIAdd %6 %61 %22
454 %64 = OpIAdd %6 %63 %22
456 %65 = OpAccessChain %43 %41 %63
458 %67 = OpAccessChain %43 %52 %61
468 OpLoopMerge %70 %71 None
472 %75 = OpSLessThan %31 %73 %74
475 %78 = OpSLessThanEqual %31 %76 %77
476 %79 = OpLogicalAnd %31 %75 %78
477 OpBranchConditional %79 %69 %70
480 %81 = OpIAdd %6 %80 %22
483 %83 = OpIAdd %6 %82 %22
485 %84 = OpAccessChain %43 %41 %82
487 %86 = OpAccessChain %43 %52 %80
497 OpLoopMerge %91 %92 None
502 %96 = OpSLessThanEqual %31 %94 %95
503 OpBranchConditional %96 %90 %91
507 %99 = OpAccessChain %43 %52 %98
509 %101 = OpAccessChain %43 %41 %97
514 %103 = OpIAdd %6 %102 %22
520 %14 = OpFunction %2 None %3
522 %104 = OpVariable %7 Function
523 %106 = OpVariable %7 Function
524 %108 = OpVariable %7 Function
525 %117 = OpVariable %7 Function
526 %127 = OpVariable %7 Function
527 %129 = OpVariable %7 Function
528 %134 = OpVariable %7 Function
529 %143 = OpVariable %7 Function
530 %145 = OpVariable %7 Function
531 %147 = OpVariable %7 Function
537 OpLoopMerge %111 %112 None
540 %114 = OpLoad %6 %108
541 %115 = OpLoad %6 %106
542 %116 = OpSLessThanEqual %31 %114 %115
543 OpBranchConditional %116 %110 %111
545 %118 = OpLoad %6 %104
549 OpLoopMerge %121 %122 None
552 %124 = OpLoad %6 %117
553 %125 = OpLoad %6 %106
554 %126 = OpSLessThan %31 %124 %125
555 OpBranchConditional %126 %120 %121
557 %128 = OpLoad %6 %117
559 %130 = OpLoad %6 %117
560 %131 = OpLoad %6 %108
561 %132 = OpIAdd %6 %130 %131
562 %133 = OpISub %6 %132 %22
564 %135 = OpLoad %6 %117
565 %137 = OpLoad %6 %108
566 %138 = OpIMul %6 %136 %137
567 %139 = OpIAdd %6 %135 %138
568 %140 = OpISub %6 %139 %22
569 %141 = OpLoad %6 %106
570 %142 = OpExtInst %6 %1 SMin %140 %141
572 %144 = OpLoad %6 %127
574 %146 = OpLoad %6 %129
576 %148 = OpLoad %6 %134
578 %149 = OpFunctionCall %2 %12 %143 %145 %147
581 %150 = OpLoad %6 %108
582 %151 = OpIMul %6 %136 %150
583 %152 = OpLoad %6 %117
584 %153 = OpIAdd %6 %152 %151
590 %154 = OpLoad %6 %108
591 %155 = OpIMul %6 %136 %154
599 # uniforms for reference
602 BUFFER reference_injectionSwitch DATA_TYPE vec2<float> DATA
606 BUFFER reference_resolution DATA_TYPE vec2<float> DATA
610 BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
612 PIPELINE graphics reference_pipeline
613 ATTACH reference_vertex_shader
614 ATTACH reference_fragment_shader
615 FRAMEBUFFER_SIZE 256 256
616 BIND BUFFER reference_framebuffer AS color LOCATION 0
617 BIND BUFFER reference_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
618 BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 1
620 CLEAR_COLOR reference_pipeline 0 0 0 255
622 CLEAR reference_pipeline
623 RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
626 SHADER vertex variant_vertex_shader PASSTHROUGH
628 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
631 ; Generator: Khronos Glslang Reference Front End; 7
635 %1 = OpExtInstImport "GLSL.std.450"
636 OpMemoryModel Logical GLSL450
637 OpEntryPoint Fragment %4 "main" %243 %369
638 OpExecutionMode %4 OriginUpperLeft
641 OpName %12 "merge(i1;i1;i1;"
645 OpName %14 "mergeSort("
664 OpMemberName %159 0 "injectionSwitch"
667 OpName %243 "gl_FragCoord"
669 OpName %369 "_GLF_color"
671 OpMemberName %378 0 "resolution"
673 OpMemberDecorate %159 0 Offset 0
674 OpDecorate %159 Block
675 OpDecorate %161 DescriptorSet 0
676 OpDecorate %161 Binding 0
677 OpDecorate %243 BuiltIn FragCoord
678 OpDecorate %369 Location 0
679 OpMemberDecorate %378 0 Offset 0
680 OpDecorate %378 Block
681 OpDecorate %380 DescriptorSet 0
682 OpDecorate %380 Binding 1
684 %3 = OpTypeFunction %2
686 %7 = OpTypePointer Function %6
687 %8 = OpTypeFunction %2 %7 %7 %7
688 %22 = OpConstant %6 1
691 %38 = OpConstant %37 10
692 %39 = OpTypeArray %6 %38
693 %40 = OpTypePointer Private %39
694 %41 = OpVariable %40 Private
695 %43 = OpTypePointer Private %6
696 %52 = OpVariable %40 Private
697 %74 = OpConstant %6 10
698 %105 = OpConstant %6 0
699 %107 = OpConstant %6 9
700 %136 = OpConstant %6 2
701 %157 = OpTypeFloat 32
702 %158 = OpTypeVector %157 2
703 %159 = OpTypeStruct %158
704 %160 = OpTypePointer Uniform %159
705 %161 = OpVariable %160 Uniform
706 %162 = OpConstant %37 0
707 %163 = OpTypePointer Uniform %157
708 %184 = OpConstant %6 4
709 %188 = OpConstant %6 3
710 %201 = OpConstant %6 -1
711 %205 = OpConstant %6 -2
712 %209 = OpConstant %6 -3
713 %213 = OpConstant %6 -4
714 %217 = OpConstant %6 -5
715 %241 = OpTypeVector %157 4
716 %242 = OpTypePointer Input %241
717 %243 = OpVariable %242 Input
718 %244 = OpConstant %37 1
719 %245 = OpTypePointer Input %157
720 %249 = OpConstant %6 30
721 %253 = OpTypePointer Function %157
722 %255 = OpConstant %157 0.5
723 %259 = OpConstant %157 10
724 %266 = OpConstant %6 60
725 %279 = OpConstant %6 90
726 %292 = OpConstant %6 120
727 %305 = OpConstant %6 150
728 %314 = OpConstant %6 180
729 %318 = OpConstant %6 5
730 %328 = OpConstant %6 210
731 %332 = OpConstant %6 6
732 %342 = OpConstant %6 240
733 %346 = OpConstant %6 7
734 %356 = OpConstant %6 270
735 %360 = OpConstant %6 8
736 %368 = OpTypePointer Output %241
737 %369 = OpVariable %368 Output
738 %371 = OpTypeVector %157 3
739 %373 = OpConstant %157 1
740 %378 = OpTypeStruct %158
741 %379 = OpTypePointer Uniform %378
742 %380 = OpVariable %379 Uniform
743 %533 = OpConstantTrue %31
744 %4 = OpFunction %2 None %3
746 %156 = OpVariable %7 Function
747 %225 = OpVariable %7 Function
748 %254 = OpVariable %253 Function
749 %164 = OpAccessChain %163 %161 %105 %162
750 %165 = OpLoad %157 %164
751 %166 = OpConvertFToS %6 %165
755 OpLoopMerge %169 %170 None
758 %171 = OpLoad %6 %156
759 OpSelectionMerge %182 None
760 OpSwitch %171 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
762 %183 = OpLoad %6 %156
763 %185 = OpAccessChain %43 %41 %183
767 %187 = OpLoad %6 %156
768 %189 = OpAccessChain %43 %41 %187
772 %191 = OpLoad %6 %156
773 %192 = OpAccessChain %43 %41 %191
777 %194 = OpLoad %6 %156
778 %195 = OpAccessChain %43 %41 %194
782 %197 = OpLoad %6 %156
783 %198 = OpAccessChain %43 %41 %197
787 %200 = OpLoad %6 %156
788 %202 = OpAccessChain %43 %41 %200
792 %204 = OpLoad %6 %156
793 %206 = OpAccessChain %43 %41 %204
797 %208 = OpLoad %6 %156
798 %210 = OpAccessChain %43 %41 %208
802 %212 = OpLoad %6 %156
803 %214 = OpAccessChain %43 %41 %212
807 %216 = OpLoad %6 %156
808 %218 = OpAccessChain %43 %41 %216
810 OpBranchConditional %533 %182 %170
812 %221 = OpLoad %6 %156
813 %222 = OpIAdd %6 %221 %22
815 OpBranchConditional %533 %170 %170
817 %223 = OpLoad %6 %156
818 %224 = OpSLessThan %31 %223 %74
819 OpBranchConditional %224 %167 %169
824 OpLoopMerge %228 %229 None
827 %231 = OpLoad %6 %225
828 %232 = OpSLessThan %31 %231 %74
829 OpBranchConditional %232 %227 %228
831 %233 = OpLoad %6 %225
832 %234 = OpLoad %6 %225
833 %235 = OpAccessChain %43 %41 %234
834 %236 = OpLoad %6 %235
835 %237 = OpAccessChain %43 %52 %233
839 %238 = OpLoad %6 %225
840 %239 = OpIAdd %6 %238 %22
844 %240 = OpFunctionCall %2 %14
845 %246 = OpAccessChain %245 %243 %244
846 %247 = OpLoad %157 %246
847 %248 = OpConvertFToS %6 %247
848 %250 = OpSLessThan %31 %248 %249
849 OpSelectionMerge %252 None
850 OpBranchConditional %250 %251 %262
852 %256 = OpAccessChain %43 %41 %105
853 %257 = OpLoad %6 %256
854 %258 = OpConvertSToF %157 %257
855 %260 = OpFDiv %157 %258 %259
856 %261 = OpFAdd %157 %255 %260
860 %263 = OpAccessChain %245 %243 %244
861 %264 = OpLoad %157 %263
862 %265 = OpConvertFToS %6 %264
863 %267 = OpSLessThan %31 %265 %266
864 OpSelectionMerge %269 None
865 OpBranchConditional %267 %268 %275
867 %270 = OpAccessChain %43 %41 %22
868 %271 = OpLoad %6 %270
869 %272 = OpConvertSToF %157 %271
870 %273 = OpFDiv %157 %272 %259
871 %274 = OpFAdd %157 %255 %273
875 %276 = OpAccessChain %245 %243 %244
876 %277 = OpLoad %157 %276
877 %278 = OpConvertFToS %6 %277
878 %280 = OpSLessThan %31 %278 %279
879 OpSelectionMerge %282 None
880 OpBranchConditional %280 %281 %288
882 %283 = OpAccessChain %43 %41 %136
883 %284 = OpLoad %6 %283
884 %285 = OpConvertSToF %157 %284
885 %286 = OpFDiv %157 %285 %259
886 %287 = OpFAdd %157 %255 %286
890 %289 = OpAccessChain %245 %243 %244
891 %290 = OpLoad %157 %289
892 %291 = OpConvertFToS %6 %290
893 %293 = OpSLessThan %31 %291 %292
894 OpSelectionMerge %295 None
895 OpBranchConditional %293 %294 %301
897 %296 = OpAccessChain %43 %41 %188
898 %297 = OpLoad %6 %296
899 %298 = OpConvertSToF %157 %297
900 %299 = OpFDiv %157 %298 %259
901 %300 = OpFAdd %157 %255 %299
905 %302 = OpAccessChain %245 %243 %244
906 %303 = OpLoad %157 %302
907 %304 = OpConvertFToS %6 %303
908 %306 = OpSLessThan %31 %304 %305
909 OpSelectionMerge %308 None
910 OpBranchConditional %306 %307 %310
914 %311 = OpAccessChain %245 %243 %244
915 %312 = OpLoad %157 %311
916 %313 = OpConvertFToS %6 %312
917 %315 = OpSLessThan %31 %313 %314
918 OpSelectionMerge %317 None
919 OpBranchConditional %315 %316 %324
921 %319 = OpAccessChain %43 %41 %318
922 %320 = OpLoad %6 %319
923 %321 = OpConvertSToF %157 %320
924 %322 = OpFDiv %157 %321 %259
925 %323 = OpFAdd %157 %255 %322
929 %325 = OpAccessChain %245 %243 %244
930 %326 = OpLoad %157 %325
931 %327 = OpConvertFToS %6 %326
932 %329 = OpSLessThan %31 %327 %328
933 OpSelectionMerge %331 None
934 OpBranchConditional %329 %330 %338
936 %333 = OpAccessChain %43 %41 %332
937 %334 = OpLoad %6 %333
938 %335 = OpConvertSToF %157 %334
939 %336 = OpFDiv %157 %335 %259
940 %337 = OpFAdd %157 %255 %336
944 %339 = OpAccessChain %245 %243 %244
945 %340 = OpLoad %157 %339
946 %341 = OpConvertFToS %6 %340
947 %343 = OpSLessThan %31 %341 %342
948 OpSelectionMerge %345 None
949 OpBranchConditional %343 %344 %352
951 %347 = OpAccessChain %43 %41 %346
952 %348 = OpLoad %6 %347
953 %349 = OpConvertSToF %157 %348
954 %350 = OpFDiv %157 %349 %259
955 %351 = OpFAdd %157 %255 %350
959 %353 = OpAccessChain %245 %243 %244
960 %354 = OpLoad %157 %353
961 %355 = OpConvertFToS %6 %354
962 %357 = OpSLessThan %31 %355 %356
963 OpSelectionMerge %359 None
964 OpBranchConditional %357 %358 %366
966 %361 = OpAccessChain %43 %41 %360
967 %362 = OpLoad %6 %361
968 %363 = OpConvertSToF %157 %362
969 %364 = OpFDiv %157 %363 %259
970 %365 = OpFAdd %157 %255 %364
992 %370 = OpLoad %157 %254
993 %372 = OpCompositeConstruct %371 %370 %370 %370
994 %374 = OpCompositeExtract %157 %372 0
995 %375 = OpCompositeExtract %157 %372 1
996 %376 = OpCompositeExtract %157 %372 2
997 %377 = OpCompositeConstruct %241 %374 %375 %376 %373
1001 %12 = OpFunction %2 None %8
1002 %9 = OpFunctionParameter %7
1003 %10 = OpFunctionParameter %7
1004 %11 = OpFunctionParameter %7
1006 %16 = OpVariable %7 Function
1007 %18 = OpVariable %7 Function
1008 %20 = OpVariable %7 Function
1009 %87 = OpVariable %7 Function
1015 %23 = OpIAdd %6 %21 %22
1019 OpLoopMerge %26 %27 None
1024 %32 = OpSLessThanEqual %31 %29 %30
1027 %35 = OpSLessThanEqual %31 %33 %34
1028 %36 = OpLogicalAnd %31 %32 %35
1029 OpBranchConditional %36 %25 %26
1032 %44 = OpAccessChain %43 %41 %42
1035 %47 = OpAccessChain %43 %41 %46
1037 %49 = OpSLessThan %31 %45 %48
1038 OpSelectionMerge %51 None
1039 OpBranchConditional %49 %50 %60
1042 %54 = OpIAdd %6 %53 %22
1045 %56 = OpIAdd %6 %55 %22
1047 %57 = OpAccessChain %43 %41 %55
1049 %59 = OpAccessChain %43 %52 %53
1054 %62 = OpIAdd %6 %61 %22
1057 %64 = OpIAdd %6 %63 %22
1059 %65 = OpAccessChain %43 %41 %63
1061 %67 = OpAccessChain %43 %52 %61
1071 OpLoopMerge %70 %71 None
1075 %75 = OpSLessThan %31 %73 %74
1078 %78 = OpSLessThanEqual %31 %76 %77
1079 %79 = OpLogicalAnd %31 %75 %78
1080 OpBranchConditional %79 %69 %70
1083 %81 = OpIAdd %6 %80 %22
1086 %83 = OpIAdd %6 %82 %22
1088 %84 = OpAccessChain %43 %41 %82
1090 %86 = OpAccessChain %43 %52 %80
1100 OpLoopMerge %91 %92 None
1105 %96 = OpSLessThanEqual %31 %94 %95
1106 OpBranchConditional %96 %90 %91
1110 %99 = OpAccessChain %43 %52 %98
1111 %100 = OpLoad %6 %99
1112 %101 = OpAccessChain %43 %41 %97
1116 %102 = OpLoad %6 %87
1117 %103 = OpIAdd %6 %102 %22
1123 %14 = OpFunction %2 None %3
1125 %104 = OpVariable %7 Function
1126 %106 = OpVariable %7 Function
1127 %108 = OpVariable %7 Function
1128 %117 = OpVariable %7 Function
1129 %127 = OpVariable %7 Function
1130 %129 = OpVariable %7 Function
1131 %134 = OpVariable %7 Function
1132 %143 = OpVariable %7 Function
1133 %145 = OpVariable %7 Function
1134 %147 = OpVariable %7 Function
1140 OpLoopMerge %111 %112 None
1143 %114 = OpLoad %6 %108
1144 %115 = OpLoad %6 %106
1145 %116 = OpSLessThanEqual %31 %114 %115
1146 OpBranchConditional %116 %110 %111
1148 %118 = OpLoad %6 %104
1152 OpLoopMerge %121 %122 None
1155 %124 = OpLoad %6 %117
1156 %125 = OpLoad %6 %106
1157 %126 = OpSLessThan %31 %124 %125
1158 OpBranchConditional %126 %120 %121
1160 %128 = OpLoad %6 %117
1162 %130 = OpLoad %6 %117
1163 %131 = OpLoad %6 %108
1164 %132 = OpIAdd %6 %130 %131
1165 %133 = OpISub %6 %132 %22
1167 %135 = OpLoad %6 %117
1168 %137 = OpLoad %6 %108
1169 %138 = OpIMul %6 %136 %137
1170 %139 = OpIAdd %6 %135 %138
1171 %140 = OpISub %6 %139 %22
1172 %141 = OpLoad %6 %106
1173 %142 = OpExtInst %6 %1 SMin %140 %141
1175 %144 = OpLoad %6 %127
1177 %146 = OpLoad %6 %129
1179 %148 = OpLoad %6 %134
1181 %149 = OpFunctionCall %2 %12 %143 %145 %147
1184 %150 = OpLoad %6 %108
1185 %151 = OpIMul %6 %136 %150
1186 %152 = OpLoad %6 %117
1187 %153 = OpIAdd %6 %152 %151
1193 %154 = OpLoad %6 %108
1194 %155 = OpIMul %6 %136 %154
1202 # uniforms for variant
1205 BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
1209 BUFFER variant_resolution DATA_TYPE vec2<float> DATA
1213 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
1215 PIPELINE graphics variant_pipeline
1216 ATTACH variant_vertex_shader
1217 ATTACH variant_fragment_shader
1218 FRAMEBUFFER_SIZE 256 256
1219 BIND BUFFER variant_framebuffer AS color LOCATION 0
1220 BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
1221 BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 1
1223 CLEAR_COLOR variant_pipeline 0 0 0 255
1225 CLEAR variant_pipeline
1226 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
1228 EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005