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 additional dead code
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; 10
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"
68 OpMemberDecorate %159 0 Offset 0
70 OpDecorate %161 DescriptorSet 0
71 OpDecorate %161 Binding 0
72 OpDecorate %243 BuiltIn FragCoord
73 OpDecorate %369 Location 0
75 %3 = OpTypeFunction %2
77 %7 = OpTypePointer Function %6
78 %8 = OpTypeFunction %2 %7 %7 %7
82 %38 = OpConstant %37 10
83 %39 = OpTypeArray %6 %38
84 %40 = OpTypePointer Private %39
85 %41 = OpVariable %40 Private
86 %43 = OpTypePointer Private %6
87 %52 = OpVariable %40 Private
88 %74 = OpConstant %6 10
89 %105 = OpConstant %6 0
90 %107 = OpConstant %6 9
91 %136 = OpConstant %6 2
93 %158 = OpTypeVector %157 2
94 %159 = OpTypeStruct %158
95 %160 = OpTypePointer Uniform %159
96 %161 = OpVariable %160 Uniform
97 %162 = OpConstant %37 0
98 %163 = OpTypePointer Uniform %157
99 %184 = OpConstant %6 4
100 %188 = OpConstant %6 3
101 %201 = OpConstant %6 -1
102 %205 = OpConstant %6 -2
103 %209 = OpConstant %6 -3
104 %213 = OpConstant %6 -4
105 %217 = OpConstant %6 -5
106 %241 = OpTypeVector %157 4
107 %242 = OpTypePointer Input %241
108 %243 = OpVariable %242 Input
109 %244 = OpConstant %37 1
110 %245 = OpTypePointer Input %157
111 %249 = OpConstant %6 30
112 %253 = OpTypePointer Function %157
113 %255 = OpConstant %157 0.5
114 %259 = OpConstant %157 10
115 %266 = OpConstant %6 60
116 %279 = OpConstant %6 90
117 %292 = OpConstant %6 120
118 %305 = OpConstant %6 150
119 %314 = OpConstant %6 180
120 %318 = OpConstant %6 5
121 %328 = OpConstant %6 210
122 %332 = OpConstant %6 6
123 %342 = OpConstant %6 240
124 %346 = OpConstant %6 7
125 %356 = OpConstant %6 270
126 %360 = OpConstant %6 8
127 %368 = OpTypePointer Output %241
128 %369 = OpVariable %368 Output
129 %371 = OpTypeVector %157 3
130 %373 = OpConstant %157 1
131 %4 = OpFunction %2 None %3
133 %156 = OpVariable %7 Function
134 %225 = OpVariable %7 Function
135 %254 = OpVariable %253 Function
136 %164 = OpAccessChain %163 %161 %105 %162
137 %165 = OpLoad %157 %164
138 %166 = OpConvertFToS %6 %165
142 OpLoopMerge %169 %170 None
145 %171 = OpLoad %6 %156
146 OpSelectionMerge %182 None
147 OpSwitch %171 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
149 %183 = OpLoad %6 %156
150 %185 = OpAccessChain %43 %41 %183
154 %187 = OpLoad %6 %156
155 %189 = OpAccessChain %43 %41 %187
159 %191 = OpLoad %6 %156
160 %192 = OpAccessChain %43 %41 %191
164 %194 = OpLoad %6 %156
165 %195 = OpAccessChain %43 %41 %194
169 %197 = OpLoad %6 %156
170 %198 = OpAccessChain %43 %41 %197
174 %200 = OpLoad %6 %156
175 %202 = OpAccessChain %43 %41 %200
179 %204 = OpLoad %6 %156
180 %206 = OpAccessChain %43 %41 %204
184 %208 = OpLoad %6 %156
185 %210 = OpAccessChain %43 %41 %208
189 %212 = OpLoad %6 %156
190 %214 = OpAccessChain %43 %41 %212
194 %216 = OpLoad %6 %156
195 %218 = OpAccessChain %43 %41 %216
199 %221 = OpLoad %6 %156
200 %222 = OpIAdd %6 %221 %22
204 %223 = OpLoad %6 %156
205 %224 = OpSLessThan %31 %223 %74
206 OpBranchConditional %224 %167 %169
211 OpLoopMerge %228 %229 None
214 %231 = OpLoad %6 %225
215 %232 = OpSLessThan %31 %231 %74
216 OpBranchConditional %232 %227 %228
218 %233 = OpLoad %6 %225
219 %234 = OpLoad %6 %225
220 %235 = OpAccessChain %43 %41 %234
221 %236 = OpLoad %6 %235
222 %237 = OpAccessChain %43 %52 %233
226 %238 = OpLoad %6 %225
227 %239 = OpIAdd %6 %238 %22
231 %240 = OpFunctionCall %2 %14
232 %246 = OpAccessChain %245 %243 %244
233 %247 = OpLoad %157 %246
234 %248 = OpConvertFToS %6 %247
235 %250 = OpSLessThan %31 %248 %249
236 OpSelectionMerge %252 None
237 OpBranchConditional %250 %251 %262
239 %256 = OpAccessChain %43 %41 %105
240 %257 = OpLoad %6 %256
241 %258 = OpConvertSToF %157 %257
242 %260 = OpFDiv %157 %258 %259
243 %261 = OpFAdd %157 %255 %260
247 %263 = OpAccessChain %245 %243 %244
248 %264 = OpLoad %157 %263
249 %265 = OpConvertFToS %6 %264
250 %267 = OpSLessThan %31 %265 %266
251 OpSelectionMerge %269 None
252 OpBranchConditional %267 %268 %275
254 %270 = OpAccessChain %43 %41 %22
255 %271 = OpLoad %6 %270
256 %272 = OpConvertSToF %157 %271
257 %273 = OpFDiv %157 %272 %259
258 %274 = OpFAdd %157 %255 %273
262 %276 = OpAccessChain %245 %243 %244
263 %277 = OpLoad %157 %276
264 %278 = OpConvertFToS %6 %277
265 %280 = OpSLessThan %31 %278 %279
266 OpSelectionMerge %282 None
267 OpBranchConditional %280 %281 %288
269 %283 = OpAccessChain %43 %41 %136
270 %284 = OpLoad %6 %283
271 %285 = OpConvertSToF %157 %284
272 %286 = OpFDiv %157 %285 %259
273 %287 = OpFAdd %157 %255 %286
277 %289 = OpAccessChain %245 %243 %244
278 %290 = OpLoad %157 %289
279 %291 = OpConvertFToS %6 %290
280 %293 = OpSLessThan %31 %291 %292
281 OpSelectionMerge %295 None
282 OpBranchConditional %293 %294 %301
284 %296 = OpAccessChain %43 %41 %188
285 %297 = OpLoad %6 %296
286 %298 = OpConvertSToF %157 %297
287 %299 = OpFDiv %157 %298 %259
288 %300 = OpFAdd %157 %255 %299
292 %302 = OpAccessChain %245 %243 %244
293 %303 = OpLoad %157 %302
294 %304 = OpConvertFToS %6 %303
295 %306 = OpSLessThan %31 %304 %305
296 OpSelectionMerge %308 None
297 OpBranchConditional %306 %307 %310
301 %311 = OpAccessChain %245 %243 %244
302 %312 = OpLoad %157 %311
303 %313 = OpConvertFToS %6 %312
304 %315 = OpSLessThan %31 %313 %314
305 OpSelectionMerge %317 None
306 OpBranchConditional %315 %316 %324
308 %319 = OpAccessChain %43 %41 %318
309 %320 = OpLoad %6 %319
310 %321 = OpConvertSToF %157 %320
311 %322 = OpFDiv %157 %321 %259
312 %323 = OpFAdd %157 %255 %322
316 %325 = OpAccessChain %245 %243 %244
317 %326 = OpLoad %157 %325
318 %327 = OpConvertFToS %6 %326
319 %329 = OpSLessThan %31 %327 %328
320 OpSelectionMerge %331 None
321 OpBranchConditional %329 %330 %338
323 %333 = OpAccessChain %43 %41 %332
324 %334 = OpLoad %6 %333
325 %335 = OpConvertSToF %157 %334
326 %336 = OpFDiv %157 %335 %259
327 %337 = OpFAdd %157 %255 %336
331 %339 = OpAccessChain %245 %243 %244
332 %340 = OpLoad %157 %339
333 %341 = OpConvertFToS %6 %340
334 %343 = OpSLessThan %31 %341 %342
335 OpSelectionMerge %345 None
336 OpBranchConditional %343 %344 %352
338 %347 = OpAccessChain %43 %41 %346
339 %348 = OpLoad %6 %347
340 %349 = OpConvertSToF %157 %348
341 %350 = OpFDiv %157 %349 %259
342 %351 = OpFAdd %157 %255 %350
346 %353 = OpAccessChain %245 %243 %244
347 %354 = OpLoad %157 %353
348 %355 = OpConvertFToS %6 %354
349 %357 = OpSLessThan %31 %355 %356
350 OpSelectionMerge %359 None
351 OpBranchConditional %357 %358 %366
353 %361 = OpAccessChain %43 %41 %360
354 %362 = OpLoad %6 %361
355 %363 = OpConvertSToF %157 %362
356 %364 = OpFDiv %157 %363 %259
357 %365 = OpFAdd %157 %255 %364
379 %370 = OpLoad %157 %254
380 %372 = OpCompositeConstruct %371 %370 %370 %370
381 %374 = OpCompositeExtract %157 %372 0
382 %375 = OpCompositeExtract %157 %372 1
383 %376 = OpCompositeExtract %157 %372 2
384 %377 = OpCompositeConstruct %241 %374 %375 %376 %373
388 %12 = OpFunction %2 None %8
389 %9 = OpFunctionParameter %7
390 %10 = OpFunctionParameter %7
391 %11 = OpFunctionParameter %7
393 %16 = OpVariable %7 Function
394 %18 = OpVariable %7 Function
395 %20 = OpVariable %7 Function
396 %87 = OpVariable %7 Function
402 %23 = OpIAdd %6 %21 %22
406 OpLoopMerge %26 %27 None
411 %32 = OpSLessThanEqual %31 %29 %30
414 %35 = OpSLessThanEqual %31 %33 %34
415 %36 = OpLogicalAnd %31 %32 %35
416 OpBranchConditional %36 %25 %26
419 %44 = OpAccessChain %43 %41 %42
422 %47 = OpAccessChain %43 %41 %46
424 %49 = OpSLessThan %31 %45 %48
425 OpSelectionMerge %51 None
426 OpBranchConditional %49 %50 %60
429 %54 = OpIAdd %6 %53 %22
432 %56 = OpIAdd %6 %55 %22
434 %57 = OpAccessChain %43 %41 %55
436 %59 = OpAccessChain %43 %52 %53
441 %62 = OpIAdd %6 %61 %22
444 %64 = OpIAdd %6 %63 %22
446 %65 = OpAccessChain %43 %41 %63
448 %67 = OpAccessChain %43 %52 %61
458 OpLoopMerge %70 %71 None
462 %75 = OpSLessThan %31 %73 %74
465 %78 = OpSLessThanEqual %31 %76 %77
466 %79 = OpLogicalAnd %31 %75 %78
467 OpBranchConditional %79 %69 %70
470 %81 = OpIAdd %6 %80 %22
473 %83 = OpIAdd %6 %82 %22
475 %84 = OpAccessChain %43 %41 %82
477 %86 = OpAccessChain %43 %52 %80
487 OpLoopMerge %91 %92 None
492 %96 = OpSLessThanEqual %31 %94 %95
493 OpBranchConditional %96 %90 %91
497 %99 = OpAccessChain %43 %52 %98
499 %101 = OpAccessChain %43 %41 %97
504 %103 = OpIAdd %6 %102 %22
510 %14 = OpFunction %2 None %3
512 %104 = OpVariable %7 Function
513 %106 = OpVariable %7 Function
514 %108 = OpVariable %7 Function
515 %117 = OpVariable %7 Function
516 %127 = OpVariable %7 Function
517 %129 = OpVariable %7 Function
518 %134 = OpVariable %7 Function
519 %143 = OpVariable %7 Function
520 %145 = OpVariable %7 Function
521 %147 = OpVariable %7 Function
527 OpLoopMerge %111 %112 None
530 %114 = OpLoad %6 %108
531 %115 = OpLoad %6 %106
532 %116 = OpSLessThanEqual %31 %114 %115
533 OpBranchConditional %116 %110 %111
535 %118 = OpLoad %6 %104
539 OpLoopMerge %121 %122 None
542 %124 = OpLoad %6 %117
543 %125 = OpLoad %6 %106
544 %126 = OpSLessThan %31 %124 %125
545 OpBranchConditional %126 %120 %121
547 %128 = OpLoad %6 %117
549 %130 = OpLoad %6 %117
550 %131 = OpLoad %6 %108
551 %132 = OpIAdd %6 %130 %131
552 %133 = OpISub %6 %132 %22
554 %135 = OpLoad %6 %117
555 %137 = OpLoad %6 %108
556 %138 = OpIMul %6 %136 %137
557 %139 = OpIAdd %6 %135 %138
558 %140 = OpISub %6 %139 %22
559 %141 = OpLoad %6 %106
560 %142 = OpExtInst %6 %1 SMin %140 %141
562 %144 = OpLoad %6 %127
564 %146 = OpLoad %6 %129
566 %148 = OpLoad %6 %134
568 %149 = OpFunctionCall %2 %12 %143 %145 %147
571 %150 = OpLoad %6 %108
572 %151 = OpIMul %6 %136 %150
573 %152 = OpLoad %6 %117
574 %153 = OpIAdd %6 %152 %151
580 %154 = OpLoad %6 %108
581 %155 = OpIMul %6 %136 %154
589 # uniforms for reference
592 BUFFER reference_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
596 BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
598 PIPELINE graphics reference_pipeline
599 ATTACH reference_vertex_shader
600 ATTACH reference_fragment_shader
601 FRAMEBUFFER_SIZE 256 256
602 BIND BUFFER reference_framebuffer AS color LOCATION 0
603 BIND BUFFER reference_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
605 CLEAR_COLOR reference_pipeline 0 0 0 255
607 CLEAR reference_pipeline
608 RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
611 SHADER vertex variant_vertex_shader PASSTHROUGH
613 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
616 ; Generator: Khronos Glslang Reference Front End; 10
620 %1 = OpExtInstImport "GLSL.std.450"
621 OpMemoryModel Logical GLSL450
622 OpEntryPoint Fragment %4 "main" %243 %369
623 OpExecutionMode %4 OriginUpperLeft
626 OpName %12 "merge(i1;i1;i1;"
630 OpName %14 "mergeSort("
649 OpMemberName %159 0 "injectionSwitch"
652 OpName %243 "gl_FragCoord"
654 OpName %369 "_GLF_color"
655 OpMemberDecorate %159 0 Offset 0
656 OpDecorate %159 Block
657 OpDecorate %161 DescriptorSet 0
658 OpDecorate %161 Binding 0
659 OpDecorate %243 BuiltIn FragCoord
660 OpDecorate %369 Location 0
662 %3 = OpTypeFunction %2
664 %7 = OpTypePointer Function %6
665 %8 = OpTypeFunction %2 %7 %7 %7
666 %22 = OpConstant %6 1
669 %38 = OpConstant %37 10
670 %39 = OpTypeArray %6 %38
671 %40 = OpTypePointer Private %39
672 %41 = OpVariable %40 Private
673 %43 = OpTypePointer Private %6
674 %52 = OpVariable %40 Private
675 %74 = OpConstant %6 10
676 %105 = OpConstant %6 0
677 %107 = OpConstant %6 9
678 %136 = OpConstant %6 2
679 %157 = OpTypeFloat 32
680 %158 = OpTypeVector %157 2
681 %159 = OpTypeStruct %158
682 %160 = OpTypePointer Uniform %159
683 %161 = OpVariable %160 Uniform
684 %162 = OpConstant %37 0
685 %163 = OpTypePointer Uniform %157
686 %184 = OpConstant %6 4
687 %188 = OpConstant %6 3
688 %201 = OpConstant %6 -1
689 %205 = OpConstant %6 -2
690 %209 = OpConstant %6 -3
691 %213 = OpConstant %6 -4
692 %217 = OpConstant %6 -5
693 %241 = OpTypeVector %157 4
694 %242 = OpTypePointer Input %241
695 %243 = OpVariable %242 Input
696 %244 = OpConstant %37 1
697 %245 = OpTypePointer Input %157
698 %249 = OpConstant %6 30
699 %253 = OpTypePointer Function %157
700 %255 = OpConstant %157 0.5
701 %259 = OpConstant %157 10
702 %266 = OpConstant %6 60
703 %279 = OpConstant %6 90
704 %292 = OpConstant %6 120
705 %305 = OpConstant %6 150
706 %314 = OpConstant %6 180
707 %318 = OpConstant %6 5
708 %328 = OpConstant %6 210
709 %332 = OpConstant %6 6
710 %342 = OpConstant %6 240
711 %346 = OpConstant %6 7
712 %356 = OpConstant %6 270
713 %360 = OpConstant %6 8
714 %368 = OpTypePointer Output %241
715 %369 = OpVariable %368 Output
716 %371 = OpTypeVector %157 3
717 %373 = OpConstant %157 1
718 %518 = OpConstantFalse %31
719 %715 = OpConstant %157 0
720 %4 = OpFunction %2 None %3
722 %156 = OpVariable %7 Function
723 %225 = OpVariable %7 Function
724 %254 = OpVariable %253 Function
725 %164 = OpAccessChain %163 %161 %105 %162
726 %165 = OpLoad %157 %164
727 %166 = OpConvertFToS %6 %165
731 OpLoopMerge %169 %170 None
734 %171 = OpLoad %6 %156
735 OpSelectionMerge %182 None
736 OpSwitch %171 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
738 %183 = OpLoad %6 %156
739 %185 = OpAccessChain %43 %41 %183
743 %187 = OpLoad %6 %156
744 %189 = OpAccessChain %43 %41 %187
748 %191 = OpLoad %6 %156
749 %192 = OpAccessChain %43 %41 %191
753 %194 = OpLoad %6 %156
754 %195 = OpAccessChain %43 %41 %194
758 %197 = OpLoad %6 %156
759 %198 = OpAccessChain %43 %41 %197
763 %200 = OpLoad %6 %156
764 %202 = OpAccessChain %43 %41 %200
768 %204 = OpLoad %6 %156
769 %206 = OpAccessChain %43 %41 %204
773 %208 = OpLoad %6 %156
774 %210 = OpAccessChain %43 %41 %208
778 %212 = OpLoad %6 %156
779 %214 = OpAccessChain %43 %41 %212
783 %216 = OpLoad %6 %156
784 %218 = OpAccessChain %43 %41 %216
788 %221 = OpLoad %6 %156
789 %222 = OpIAdd %6 %221 %22
793 %223 = OpLoad %6 %156
794 %224 = OpSLessThan %31 %223 %74
795 OpBranchConditional %224 %167 %169
800 OpLoopMerge %228 %229 None
803 %231 = OpLoad %6 %225
804 %232 = OpSLessThan %31 %231 %74
805 %1342 = OpAccessChain %163 %161 %105 %105
806 %1341 = OpLoad %157 %1342
807 %1340 = OpFUnordGreaterThan %31 %1341 %373
808 OpSelectionMerge %485 None
809 OpBranchConditional %1340 %537 %485
812 OpBranchConditional %518 %485 %485
814 OpBranchConditional %232 %227 %228
816 %233 = OpLoad %6 %225
817 %234 = OpLoad %6 %225
818 %235 = OpAccessChain %43 %41 %234
819 %236 = OpLoad %6 %235
820 %237 = OpAccessChain %43 %52 %233
824 %238 = OpLoad %6 %225
825 %239 = OpIAdd %6 %238 %22
829 %240 = OpFunctionCall %2 %14
830 %246 = OpAccessChain %245 %243 %244
831 %247 = OpLoad %157 %246
832 %248 = OpConvertFToS %6 %247
833 %250 = OpSLessThan %31 %248 %249
834 OpSelectionMerge %252 None
835 OpBranchConditional %250 %251 %262
837 %256 = OpAccessChain %43 %41 %105
838 %257 = OpLoad %6 %256
839 %258 = OpConvertSToF %157 %257
840 %260 = OpFDiv %157 %258 %259
841 %261 = OpFAdd %157 %255 %260
845 %263 = OpAccessChain %245 %243 %244
846 %264 = OpLoad %157 %263
847 %265 = OpConvertFToS %6 %264
848 %267 = OpSLessThan %31 %265 %266
849 OpSelectionMerge %269 None
850 OpBranchConditional %267 %268 %275
852 %270 = OpAccessChain %43 %41 %22
853 %271 = OpLoad %6 %270
854 %272 = OpConvertSToF %157 %271
855 %273 = OpFDiv %157 %272 %259
856 %274 = OpFAdd %157 %255 %273
860 %276 = OpAccessChain %245 %243 %244
861 %277 = OpLoad %157 %276
862 %278 = OpConvertFToS %6 %277
863 %280 = OpSLessThan %31 %278 %279
864 OpSelectionMerge %282 None
865 OpBranchConditional %280 %281 %288
867 %283 = OpAccessChain %43 %41 %136
868 %284 = OpLoad %6 %283
869 %285 = OpConvertSToF %157 %284
870 %286 = OpFDiv %157 %285 %259
871 %287 = OpFAdd %157 %255 %286
875 %289 = OpAccessChain %245 %243 %244
876 %290 = OpLoad %157 %289
877 %291 = OpConvertFToS %6 %290
878 %293 = OpSLessThan %31 %291 %292
879 OpSelectionMerge %295 None
880 OpBranchConditional %293 %294 %301
882 %296 = OpAccessChain %43 %41 %188
883 %297 = OpLoad %6 %296
884 %298 = OpConvertSToF %157 %297
885 %299 = OpFDiv %157 %298 %259
886 %300 = OpFAdd %157 %255 %299
890 %302 = OpAccessChain %245 %243 %244
891 %303 = OpLoad %157 %302
892 %304 = OpConvertFToS %6 %303
893 %306 = OpSLessThan %31 %304 %305
894 OpSelectionMerge %308 None
895 OpBranchConditional %306 %307 %310
899 %311 = OpAccessChain %245 %243 %244
900 %312 = OpLoad %157 %311
901 %313 = OpConvertFToS %6 %312
902 %315 = OpSLessThan %31 %313 %314
903 OpSelectionMerge %317 None
904 OpBranchConditional %315 %316 %324
906 %319 = OpAccessChain %43 %41 %318
907 %320 = OpLoad %6 %319
908 %321 = OpConvertSToF %157 %320
909 %322 = OpFDiv %157 %321 %259
910 %323 = OpFAdd %157 %255 %322
914 %325 = OpAccessChain %245 %243 %244
915 %326 = OpLoad %157 %325
916 %327 = OpConvertFToS %6 %326
917 %329 = OpSLessThan %31 %327 %328
918 OpSelectionMerge %331 None
919 OpBranchConditional %329 %330 %338
921 %333 = OpAccessChain %43 %41 %332
922 %334 = OpLoad %6 %333
923 %335 = OpConvertSToF %157 %334
924 %336 = OpFDiv %157 %335 %259
925 %337 = OpFAdd %157 %255 %336
929 %339 = OpAccessChain %245 %243 %244
930 %340 = OpLoad %157 %339
931 %341 = OpConvertFToS %6 %340
932 %343 = OpSLessThan %31 %341 %342
933 OpSelectionMerge %345 None
934 OpBranchConditional %343 %344 %352
936 %347 = OpAccessChain %43 %41 %346
937 %348 = OpLoad %6 %347
938 %349 = OpConvertSToF %157 %348
939 %350 = OpFDiv %157 %349 %259
940 %351 = OpFAdd %157 %255 %350
944 %353 = OpAccessChain %245 %243 %244
945 %354 = OpLoad %157 %353
946 %355 = OpConvertFToS %6 %354
947 %357 = OpSLessThan %31 %355 %356
948 OpSelectionMerge %359 None
949 OpBranchConditional %357 %358 %366
951 %361 = OpAccessChain %43 %41 %360
952 %362 = OpLoad %6 %361
953 %363 = OpConvertSToF %157 %362
954 %364 = OpFDiv %157 %363 %259
955 %365 = OpFAdd %157 %255 %364
959 %720 = OpAccessChain %163 %161 %105 %22
960 %719 = OpLoad %157 %720
961 %718 = OpFUnordGreaterThanEqual %31 %715 %719
962 OpBranchConditional %718 %359 %499
982 %370 = OpLoad %157 %254
983 %372 = OpCompositeConstruct %371 %370 %370 %370
984 %374 = OpCompositeExtract %157 %372 0
985 %375 = OpCompositeExtract %157 %372 1
986 %376 = OpCompositeExtract %157 %372 2
987 %377 = OpCompositeConstruct %241 %374 %375 %376 %373
991 %12 = OpFunction %2 None %8
992 %9 = OpFunctionParameter %7
993 %10 = OpFunctionParameter %7
994 %11 = OpFunctionParameter %7
996 %16 = OpVariable %7 Function
997 %18 = OpVariable %7 Function
998 %20 = OpVariable %7 Function
999 %87 = OpVariable %7 Function
1005 %23 = OpIAdd %6 %21 %22
1009 OpLoopMerge %26 %27 None
1014 %32 = OpSLessThanEqual %31 %29 %30
1017 %35 = OpSLessThanEqual %31 %33 %34
1018 %36 = OpLogicalAnd %31 %32 %35
1019 OpBranchConditional %36 %25 %26
1022 %44 = OpAccessChain %43 %41 %42
1025 %47 = OpAccessChain %43 %41 %46
1027 %49 = OpSLessThan %31 %45 %48
1028 OpSelectionMerge %51 None
1029 OpBranchConditional %49 %50 %60
1032 %54 = OpIAdd %6 %53 %22
1035 %56 = OpIAdd %6 %55 %22
1037 %57 = OpAccessChain %43 %41 %55
1039 %59 = OpAccessChain %43 %52 %53
1044 %62 = OpIAdd %6 %61 %22
1047 %64 = OpIAdd %6 %63 %22
1049 %65 = OpAccessChain %43 %41 %63
1051 %67 = OpAccessChain %43 %52 %61
1061 OpLoopMerge %70 %71 None
1065 %75 = OpSLessThan %31 %73 %74
1068 %78 = OpSLessThanEqual %31 %76 %77
1069 %79 = OpLogicalAnd %31 %75 %78
1070 OpBranchConditional %79 %69 %70
1073 %81 = OpIAdd %6 %80 %22
1076 %83 = OpIAdd %6 %82 %22
1078 %84 = OpAccessChain %43 %41 %82
1080 %86 = OpAccessChain %43 %52 %80
1090 OpLoopMerge %91 %92 None
1095 %96 = OpSLessThanEqual %31 %94 %95
1096 OpBranchConditional %96 %90 %91
1100 %99 = OpAccessChain %43 %52 %98
1101 %100 = OpLoad %6 %99
1102 %101 = OpAccessChain %43 %41 %97
1106 %102 = OpLoad %6 %87
1107 %103 = OpIAdd %6 %102 %22
1113 %14 = OpFunction %2 None %3
1115 %104 = OpVariable %7 Function
1116 %106 = OpVariable %7 Function
1117 %108 = OpVariable %7 Function
1118 %117 = OpVariable %7 Function
1119 %127 = OpVariable %7 Function
1120 %129 = OpVariable %7 Function
1121 %134 = OpVariable %7 Function
1122 %143 = OpVariable %7 Function
1123 %145 = OpVariable %7 Function
1124 %147 = OpVariable %7 Function
1130 OpLoopMerge %111 %112 None
1133 %114 = OpLoad %6 %108
1134 %115 = OpLoad %6 %106
1135 %116 = OpSLessThanEqual %31 %114 %115
1136 OpBranchConditional %116 %110 %111
1138 %118 = OpLoad %6 %104
1142 OpLoopMerge %121 %122 None
1145 %124 = OpLoad %6 %117
1146 %125 = OpLoad %6 %106
1147 %126 = OpSLessThan %31 %124 %125
1148 OpBranchConditional %126 %120 %121
1150 %128 = OpLoad %6 %117
1152 %130 = OpLoad %6 %117
1153 %131 = OpLoad %6 %108
1154 %132 = OpIAdd %6 %130 %131
1155 %133 = OpISub %6 %132 %22
1157 %135 = OpLoad %6 %117
1158 %137 = OpLoad %6 %108
1159 %138 = OpIMul %6 %136 %137
1160 %139 = OpIAdd %6 %135 %138
1161 %140 = OpISub %6 %139 %22
1162 %141 = OpLoad %6 %106
1163 %142 = OpExtInst %6 %1 SMin %140 %141
1165 %144 = OpLoad %6 %127
1167 %146 = OpLoad %6 %129
1169 %148 = OpLoad %6 %134
1171 %149 = OpFunctionCall %2 %12 %143 %145 %147
1174 %150 = OpLoad %6 %108
1175 %151 = OpIMul %6 %136 %150
1176 %152 = OpLoad %6 %117
1177 %153 = OpIAdd %6 %152 %151
1183 %154 = OpLoad %6 %108
1184 %155 = OpIMul %6 %136 %154
1192 # uniforms for variant
1195 BUFFER variant_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
1199 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
1201 PIPELINE graphics variant_pipeline
1202 ATTACH variant_vertex_shader
1203 ATTACH variant_fragment_shader
1204 FRAMEBUFFER_SIZE 256 256
1205 BIND BUFFER variant_framebuffer AS color LOCATION 0
1206 BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
1208 CLEAR_COLOR variant_pipeline 0 0 0 255
1210 CLEAR variant_pipeline
1211 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
1213 EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005