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 extra access chains
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" %12 %435
36 OpExecutionMode %4 OriginUpperLeft
40 OpName %12 "gl_FragCoord"
42 OpMemberName %15 0 "resolution"
50 OpName %74 "directions"
53 OpName %435 "_GLF_color"
54 OpDecorate %12 BuiltIn FragCoord
55 OpMemberDecorate %15 0 Offset 0
57 OpDecorate %17 DescriptorSet 0
58 OpDecorate %17 Binding 0
59 OpDecorate %435 Location 0
61 %3 = OpTypeFunction %2
63 %7 = OpTypeVector %6 2
64 %8 = OpTypePointer Function %7
65 %10 = OpTypeVector %6 4
66 %11 = OpTypePointer Input %10
67 %12 = OpVariable %11 Input
69 %16 = OpTypePointer Uniform %15
70 %17 = OpVariable %16 Uniform
72 %19 = OpConstant %18 0
73 %20 = OpTypePointer Uniform %7
74 %24 = OpTypeVector %18 2
75 %25 = OpTypePointer Function %24
77 %28 = OpConstant %27 0
78 %29 = OpTypePointer Function %6
79 %32 = OpConstant %6 16
80 %35 = OpConstant %27 1
81 %41 = OpTypePointer Function %18
82 %49 = OpConstant %18 256
84 %52 = OpConstant %27 256
85 %53 = OpTypeArray %18 %52
86 %54 = OpTypePointer Private %53
87 %55 = OpVariable %54 Private
88 %57 = OpTypePointer Private %18
89 %60 = OpConstant %18 1
90 %63 = OpConstantComposite %24 %19 %19
91 %64 = OpTypePointer Function %50
92 %66 = OpConstantTrue %50
93 %82 = OpConstant %18 2
94 %86 = OpConstant %18 16
95 %119 = OpConstant %18 14
96 %162 = OpConstantFalse %50
97 %169 = OpConstant %18 8
98 %434 = OpTypePointer Output %10
99 %435 = OpVariable %434 Output
100 %436 = OpConstant %6 1
101 %437 = OpConstantComposite %10 %436 %436 %436 %436
102 %440 = OpConstant %6 0
103 %441 = OpConstantComposite %10 %440 %440 %440 %436
104 %4 = OpFunction %2 None %3
106 %9 = OpVariable %8 Function
107 %26 = OpVariable %25 Function
108 %42 = OpVariable %41 Function
109 %62 = OpVariable %25 Function
110 %65 = OpVariable %64 Function
111 %67 = OpVariable %41 Function
112 %74 = OpVariable %41 Function
113 %171 = OpVariable %41 Function
114 %208 = OpVariable %41 Function
116 %14 = OpVectorShuffle %7 %13 %13 0 1
117 %21 = OpAccessChain %20 %17 %19
119 %23 = OpFDiv %7 %14 %22
121 %30 = OpAccessChain %29 %9 %28
123 %33 = OpFMul %6 %31 %32
124 %34 = OpConvertFToS %18 %33
125 %36 = OpAccessChain %29 %9 %35
127 %38 = OpFMul %6 %37 %32
128 %39 = OpConvertFToS %18 %38
129 %40 = OpCompositeConstruct %24 %34 %39
134 OpLoopMerge %45 %46 None
138 %51 = OpSLessThan %50 %48 %49
139 OpBranchConditional %51 %44 %45
142 %58 = OpAccessChain %57 %55 %56
147 %61 = OpIAdd %18 %59 %60
156 OpLoopMerge %70 %71 None
160 %73 = OpIAdd %18 %72 %60
163 %75 = OpAccessChain %41 %62 %28
165 %77 = OpSGreaterThan %50 %76 %19
166 OpSelectionMerge %79 None
167 OpBranchConditional %77 %78 %79
169 %80 = OpAccessChain %41 %62 %28
171 %83 = OpISub %18 %81 %82
172 %84 = OpAccessChain %41 %62 %35
174 %87 = OpIMul %18 %85 %86
175 %88 = OpIAdd %18 %83 %87
176 %89 = OpAccessChain %57 %55 %88
178 %91 = OpIEqual %50 %90 %19
181 %92 = OpPhi %50 %77 %69 %91 %78
182 OpSelectionMerge %94 None
183 OpBranchConditional %92 %93 %94
186 %96 = OpIAdd %18 %95 %60
190 %97 = OpAccessChain %41 %62 %35
192 %99 = OpSGreaterThan %50 %98 %19
193 OpSelectionMerge %101 None
194 OpBranchConditional %99 %100 %101
196 %102 = OpAccessChain %41 %62 %28
197 %103 = OpLoad %18 %102
198 %104 = OpAccessChain %41 %62 %35
199 %105 = OpLoad %18 %104
200 %106 = OpISub %18 %105 %82
201 %107 = OpIMul %18 %106 %86
202 %108 = OpIAdd %18 %103 %107
203 %109 = OpAccessChain %57 %55 %108
204 %110 = OpLoad %18 %109
205 %111 = OpIEqual %50 %110 %19
208 %112 = OpPhi %50 %99 %94 %111 %100
209 OpSelectionMerge %114 None
210 OpBranchConditional %112 %113 %114
212 %115 = OpLoad %18 %74
213 %116 = OpIAdd %18 %115 %60
217 %117 = OpAccessChain %41 %62 %28
218 %118 = OpLoad %18 %117
219 %120 = OpSLessThan %50 %118 %119
220 OpSelectionMerge %122 None
221 OpBranchConditional %120 %121 %122
223 %123 = OpAccessChain %41 %62 %28
224 %124 = OpLoad %18 %123
225 %125 = OpIAdd %18 %124 %82
226 %126 = OpAccessChain %41 %62 %35
227 %127 = OpLoad %18 %126
228 %128 = OpIMul %18 %127 %86
229 %129 = OpIAdd %18 %125 %128
230 %130 = OpAccessChain %57 %55 %129
231 %131 = OpLoad %18 %130
232 %132 = OpIEqual %50 %131 %19
235 %133 = OpPhi %50 %120 %114 %132 %121
236 OpSelectionMerge %135 None
237 OpBranchConditional %133 %134 %135
239 %136 = OpLoad %18 %74
240 %137 = OpIAdd %18 %136 %60
244 %138 = OpAccessChain %41 %62 %35
245 %139 = OpLoad %18 %138
246 %140 = OpSLessThan %50 %139 %119
247 OpSelectionMerge %142 None
248 OpBranchConditional %140 %141 %142
250 %143 = OpAccessChain %41 %62 %28
251 %144 = OpLoad %18 %143
252 %145 = OpAccessChain %41 %62 %35
253 %146 = OpLoad %18 %145
254 %147 = OpIAdd %18 %146 %82
255 %148 = OpIMul %18 %147 %86
256 %149 = OpIAdd %18 %144 %148
257 %150 = OpAccessChain %57 %55 %149
258 %151 = OpLoad %18 %150
259 %152 = OpIEqual %50 %151 %19
262 %153 = OpPhi %50 %140 %135 %152 %141
263 OpSelectionMerge %155 None
264 OpBranchConditional %153 %154 %155
266 %156 = OpLoad %18 %74
267 %157 = OpIAdd %18 %156 %60
271 %158 = OpLoad %18 %74
272 %159 = OpIEqual %50 %158 %19
273 OpSelectionMerge %161 None
274 OpBranchConditional %159 %160 %207
280 OpLoopMerge %165 %166 None
283 %168 = OpLoad %18 %42
284 %170 = OpSLessThan %50 %168 %169
285 OpBranchConditional %170 %164 %165
290 OpLoopMerge %174 %175 None
293 %177 = OpLoad %18 %171
294 %178 = OpSLessThan %50 %177 %169
295 OpBranchConditional %178 %173 %174
297 %179 = OpLoad %18 %171
298 %180 = OpIMul %18 %179 %82
299 %181 = OpLoad %18 %42
300 %182 = OpIMul %18 %181 %82
301 %183 = OpIMul %18 %182 %86
302 %184 = OpIAdd %18 %180 %183
303 %185 = OpAccessChain %57 %55 %184
304 %186 = OpLoad %18 %185
305 %187 = OpIEqual %50 %186 %19
306 OpSelectionMerge %189 None
307 OpBranchConditional %187 %188 %189
309 %190 = OpLoad %18 %171
310 %191 = OpIMul %18 %190 %82
311 %192 = OpAccessChain %41 %62 %28
313 %193 = OpLoad %18 %42
314 %194 = OpIMul %18 %193 %82
315 %195 = OpAccessChain %41 %62 %35
322 %196 = OpLoad %18 %171
323 %197 = OpIAdd %18 %196 %60
329 %198 = OpLoad %18 %42
330 %199 = OpIAdd %18 %198 %60
334 %200 = OpAccessChain %41 %62 %28
335 %201 = OpLoad %18 %200
336 %202 = OpAccessChain %41 %62 %35
337 %203 = OpLoad %18 %202
338 %204 = OpIMul %18 %203 %86
339 %205 = OpIAdd %18 %201 %204
340 %206 = OpAccessChain %57 %55 %205
344 %209 = OpLoad %18 %67
345 %210 = OpLoad %18 %74
346 %211 = OpSMod %18 %209 %210
348 %212 = OpLoad %18 %74
349 %213 = OpLoad %18 %67
350 %214 = OpIAdd %18 %213 %212
352 %215 = OpLoad %18 %208
353 %216 = OpSGreaterThanEqual %50 %215 %19
354 OpSelectionMerge %218 None
355 OpBranchConditional %216 %217 %218
357 %219 = OpAccessChain %41 %62 %28
358 %220 = OpLoad %18 %219
359 %221 = OpSGreaterThan %50 %220 %19
362 %222 = OpPhi %50 %216 %207 %221 %217
363 OpSelectionMerge %224 None
364 OpBranchConditional %222 %223 %224
366 %225 = OpAccessChain %41 %62 %28
367 %226 = OpLoad %18 %225
368 %227 = OpISub %18 %226 %82
369 %228 = OpAccessChain %41 %62 %35
370 %229 = OpLoad %18 %228
371 %230 = OpIMul %18 %229 %86
372 %231 = OpIAdd %18 %227 %230
373 %232 = OpAccessChain %57 %55 %231
374 %233 = OpLoad %18 %232
375 %234 = OpIEqual %50 %233 %19
378 %235 = OpPhi %50 %222 %218 %234 %223
379 OpSelectionMerge %237 None
380 OpBranchConditional %235 %236 %237
382 %238 = OpLoad %18 %208
383 %239 = OpISub %18 %238 %60
385 %240 = OpAccessChain %41 %62 %28
386 %241 = OpLoad %18 %240
387 %242 = OpAccessChain %41 %62 %35
388 %243 = OpLoad %18 %242
389 %244 = OpIMul %18 %243 %86
390 %245 = OpIAdd %18 %241 %244
391 %246 = OpAccessChain %57 %55 %245
393 %247 = OpAccessChain %41 %62 %28
394 %248 = OpLoad %18 %247
395 %249 = OpISub %18 %248 %60
396 %250 = OpAccessChain %41 %62 %35
397 %251 = OpLoad %18 %250
398 %252 = OpIMul %18 %251 %86
399 %253 = OpIAdd %18 %249 %252
400 %254 = OpAccessChain %57 %55 %253
402 %255 = OpAccessChain %41 %62 %28
403 %256 = OpLoad %18 %255
404 %257 = OpISub %18 %256 %82
405 %258 = OpAccessChain %41 %62 %35
406 %259 = OpLoad %18 %258
407 %260 = OpIMul %18 %259 %86
408 %261 = OpIAdd %18 %257 %260
409 %262 = OpAccessChain %57 %55 %261
411 %263 = OpAccessChain %41 %62 %28
412 %264 = OpLoad %18 %263
413 %265 = OpISub %18 %264 %82
414 %266 = OpAccessChain %41 %62 %28
418 %267 = OpLoad %18 %208
419 %268 = OpSGreaterThanEqual %50 %267 %19
420 OpSelectionMerge %270 None
421 OpBranchConditional %268 %269 %270
423 %271 = OpAccessChain %41 %62 %35
424 %272 = OpLoad %18 %271
425 %273 = OpSGreaterThan %50 %272 %19
428 %274 = OpPhi %50 %268 %237 %273 %269
429 OpSelectionMerge %276 None
430 OpBranchConditional %274 %275 %276
432 %277 = OpAccessChain %41 %62 %28
433 %278 = OpLoad %18 %277
434 %279 = OpAccessChain %41 %62 %35
435 %280 = OpLoad %18 %279
436 %281 = OpISub %18 %280 %82
437 %282 = OpIMul %18 %281 %86
438 %283 = OpIAdd %18 %278 %282
439 %284 = OpAccessChain %57 %55 %283
440 %285 = OpLoad %18 %284
441 %286 = OpIEqual %50 %285 %19
444 %287 = OpPhi %50 %274 %270 %286 %275
445 OpSelectionMerge %289 None
446 OpBranchConditional %287 %288 %289
448 %290 = OpLoad %18 %208
449 %291 = OpISub %18 %290 %60
451 %292 = OpAccessChain %41 %62 %28
452 %293 = OpLoad %18 %292
453 %294 = OpAccessChain %41 %62 %35
454 %295 = OpLoad %18 %294
455 %296 = OpIMul %18 %295 %86
456 %297 = OpIAdd %18 %293 %296
457 %298 = OpAccessChain %57 %55 %297
459 %299 = OpAccessChain %41 %62 %28
460 %300 = OpLoad %18 %299
461 %301 = OpAccessChain %41 %62 %35
462 %302 = OpLoad %18 %301
463 %303 = OpISub %18 %302 %60
464 %304 = OpIMul %18 %303 %86
465 %305 = OpIAdd %18 %300 %304
466 %306 = OpAccessChain %57 %55 %305
468 %307 = OpAccessChain %41 %62 %28
469 %308 = OpLoad %18 %307
470 %309 = OpAccessChain %41 %62 %35
471 %310 = OpLoad %18 %309
472 %311 = OpISub %18 %310 %82
473 %312 = OpIMul %18 %311 %86
474 %313 = OpIAdd %18 %308 %312
475 %314 = OpAccessChain %57 %55 %313
477 %315 = OpAccessChain %41 %62 %35
478 %316 = OpLoad %18 %315
479 %317 = OpISub %18 %316 %82
480 %318 = OpAccessChain %41 %62 %35
484 %319 = OpLoad %18 %208
485 %320 = OpSGreaterThanEqual %50 %319 %19
486 OpSelectionMerge %322 None
487 OpBranchConditional %320 %321 %322
489 %323 = OpAccessChain %41 %62 %28
490 %324 = OpLoad %18 %323
491 %325 = OpSLessThan %50 %324 %119
494 %326 = OpPhi %50 %320 %289 %325 %321
495 OpSelectionMerge %328 None
496 OpBranchConditional %326 %327 %328
498 %329 = OpAccessChain %41 %62 %28
499 %330 = OpLoad %18 %329
500 %331 = OpIAdd %18 %330 %82
501 %332 = OpAccessChain %41 %62 %35
502 %333 = OpLoad %18 %332
503 %334 = OpIMul %18 %333 %86
504 %335 = OpIAdd %18 %331 %334
505 %336 = OpAccessChain %57 %55 %335
506 %337 = OpLoad %18 %336
507 %338 = OpIEqual %50 %337 %19
510 %339 = OpPhi %50 %326 %322 %338 %327
511 OpSelectionMerge %341 None
512 OpBranchConditional %339 %340 %341
514 %342 = OpLoad %18 %208
515 %343 = OpISub %18 %342 %60
517 %344 = OpAccessChain %41 %62 %28
518 %345 = OpLoad %18 %344
519 %346 = OpAccessChain %41 %62 %35
520 %347 = OpLoad %18 %346
521 %348 = OpIMul %18 %347 %86
522 %349 = OpIAdd %18 %345 %348
523 %350 = OpAccessChain %57 %55 %349
525 %351 = OpAccessChain %41 %62 %28
526 %352 = OpLoad %18 %351
527 %353 = OpIAdd %18 %352 %60
528 %354 = OpAccessChain %41 %62 %35
529 %355 = OpLoad %18 %354
530 %356 = OpIMul %18 %355 %86
531 %357 = OpIAdd %18 %353 %356
532 %358 = OpAccessChain %57 %55 %357
534 %359 = OpAccessChain %41 %62 %28
535 %360 = OpLoad %18 %359
536 %361 = OpIAdd %18 %360 %82
537 %362 = OpAccessChain %41 %62 %35
538 %363 = OpLoad %18 %362
539 %364 = OpIMul %18 %363 %86
540 %365 = OpIAdd %18 %361 %364
541 %366 = OpAccessChain %57 %55 %365
543 %367 = OpAccessChain %41 %62 %28
544 %368 = OpLoad %18 %367
545 %369 = OpIAdd %18 %368 %82
546 %370 = OpAccessChain %41 %62 %28
550 %371 = OpLoad %18 %208
551 %372 = OpSGreaterThanEqual %50 %371 %19
552 OpSelectionMerge %374 None
553 OpBranchConditional %372 %373 %374
555 %375 = OpAccessChain %41 %62 %35
556 %376 = OpLoad %18 %375
557 %377 = OpSLessThan %50 %376 %119
560 %378 = OpPhi %50 %372 %341 %377 %373
561 OpSelectionMerge %380 None
562 OpBranchConditional %378 %379 %380
564 %381 = OpAccessChain %41 %62 %28
565 %382 = OpLoad %18 %381
566 %383 = OpAccessChain %41 %62 %35
567 %384 = OpLoad %18 %383
568 %385 = OpIAdd %18 %384 %82
569 %386 = OpIMul %18 %385 %86
570 %387 = OpIAdd %18 %382 %386
571 %388 = OpAccessChain %57 %55 %387
572 %389 = OpLoad %18 %388
573 %390 = OpIEqual %50 %389 %19
576 %391 = OpPhi %50 %378 %374 %390 %379
577 OpSelectionMerge %393 None
578 OpBranchConditional %391 %392 %393
580 %394 = OpLoad %18 %208
581 %395 = OpISub %18 %394 %60
583 %396 = OpAccessChain %41 %62 %28
584 %397 = OpLoad %18 %396
585 %398 = OpAccessChain %41 %62 %35
586 %399 = OpLoad %18 %398
587 %400 = OpIMul %18 %399 %86
588 %401 = OpIAdd %18 %397 %400
589 %402 = OpAccessChain %57 %55 %401
591 %403 = OpAccessChain %41 %62 %28
592 %404 = OpLoad %18 %403
593 %405 = OpAccessChain %41 %62 %35
594 %406 = OpLoad %18 %405
595 %407 = OpIAdd %18 %406 %60
596 %408 = OpIMul %18 %407 %86
597 %409 = OpIAdd %18 %404 %408
598 %410 = OpAccessChain %57 %55 %409
600 %411 = OpAccessChain %41 %62 %28
601 %412 = OpLoad %18 %411
602 %413 = OpAccessChain %41 %62 %35
603 %414 = OpLoad %18 %413
604 %415 = OpIAdd %18 %414 %82
605 %416 = OpIMul %18 %415 %86
606 %417 = OpIAdd %18 %412 %416
607 %418 = OpAccessChain %57 %55 %417
609 %419 = OpAccessChain %41 %62 %35
610 %420 = OpLoad %18 %419
611 %421 = OpIAdd %18 %420 %82
612 %422 = OpAccessChain %41 %62 %35
618 %423 = OpAccessChain %41 %26 %35
619 %424 = OpLoad %18 %423
620 %425 = OpIMul %18 %424 %86
621 %426 = OpAccessChain %41 %26 %28
622 %427 = OpLoad %18 %426
623 %428 = OpIAdd %18 %425 %427
624 %429 = OpAccessChain %57 %55 %428
625 %430 = OpLoad %18 %429
626 %431 = OpIEqual %50 %430 %60
627 OpSelectionMerge %433 None
628 OpBranchConditional %431 %432 %433
635 %439 = OpLoad %50 %65
636 OpBranchConditional %439 %68 %70
643 # uniforms for reference
646 BUFFER reference_resolution DATA_TYPE vec2<float> DATA
650 BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
652 PIPELINE graphics reference_pipeline
653 ATTACH reference_vertex_shader
654 ATTACH reference_fragment_shader
655 FRAMEBUFFER_SIZE 64 64
656 BIND BUFFER reference_framebuffer AS color LOCATION 0
657 BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
659 CLEAR_COLOR reference_pipeline 0 0 0 255
661 CLEAR reference_pipeline
662 RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 64 64
665 SHADER vertex variant_vertex_shader PASSTHROUGH
667 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
670 ; Generator: Khronos Glslang Reference Front End; 7
674 %1 = OpExtInstImport "GLSL.std.450"
675 OpMemoryModel Logical GLSL450
676 OpEntryPoint Fragment %4 "main" %12 %435
677 OpExecutionMode %4 OriginUpperLeft
681 OpName %12 "gl_FragCoord"
683 OpMemberName %15 0 "resolution"
691 OpName %74 "directions"
694 OpName %435 "_GLF_color"
695 OpDecorate %12 BuiltIn FragCoord
696 OpMemberDecorate %15 0 Offset 0
698 OpDecorate %17 DescriptorSet 0
699 OpDecorate %17 Binding 0
700 OpDecorate %435 Location 0
702 %3 = OpTypeFunction %2
704 %7 = OpTypeVector %6 2
705 %8 = OpTypePointer Function %7
706 %10 = OpTypeVector %6 4
707 %11 = OpTypePointer Input %10
708 %12 = OpVariable %11 Input
709 %15 = OpTypeStruct %7
710 %16 = OpTypePointer Uniform %15
711 %17 = OpVariable %16 Uniform
713 %19 = OpConstant %18 0
714 %20 = OpTypePointer Uniform %7
715 %24 = OpTypeVector %18 2
716 %25 = OpTypePointer Function %24
718 %28 = OpConstant %27 0
719 %29 = OpTypePointer Function %6
720 %32 = OpConstant %6 16
721 %35 = OpConstant %27 1
722 %41 = OpTypePointer Function %18
723 %49 = OpConstant %18 256
725 %52 = OpConstant %27 256
726 %53 = OpTypeArray %18 %52
727 %54 = OpTypePointer Private %53
728 %55 = OpVariable %54 Private
729 %57 = OpTypePointer Private %18
730 %60 = OpConstant %18 1
731 %63 = OpConstantComposite %24 %19 %19
732 %64 = OpTypePointer Function %50
733 %66 = OpConstantTrue %50
734 %82 = OpConstant %18 2
735 %86 = OpConstant %18 16
736 %119 = OpConstant %18 14
737 %162 = OpConstantFalse %50
738 %169 = OpConstant %18 8
739 %434 = OpTypePointer Output %10
740 %435 = OpVariable %434 Output
741 %436 = OpConstant %6 1
742 %437 = OpConstantComposite %10 %436 %436 %436 %436
743 %440 = OpConstant %6 0
744 %441 = OpConstantComposite %10 %440 %440 %440 %436
745 %4 = OpFunction %2 None %3
747 %9 = OpVariable %8 Function
748 %26 = OpVariable %25 Function
749 %42 = OpVariable %41 Function
750 %62 = OpVariable %25 Function
751 %65 = OpVariable %64 Function
752 %67 = OpVariable %41 Function
753 %74 = OpVariable %41 Function
754 %171 = OpVariable %41 Function
755 %208 = OpVariable %41 Function
757 %14 = OpVectorShuffle %7 %13 %13 0 1
758 %21 = OpAccessChain %20 %17 %19
760 %23 = OpFDiv %7 %14 %22
762 %30 = OpAccessChain %29 %9 %28
764 %33 = OpFMul %6 %31 %32
765 %34 = OpConvertFToS %18 %33
766 %36 = OpAccessChain %29 %9 %35
768 %38 = OpFMul %6 %37 %32
769 %39 = OpConvertFToS %18 %38
770 %40 = OpCompositeConstruct %24 %34 %39
775 OpLoopMerge %45 %46 None
779 %51 = OpSLessThan %50 %48 %49
780 OpBranchConditional %51 %44 %45
783 %58 = OpAccessChain %57 %55 %56
788 %61 = OpIAdd %18 %59 %60
797 OpLoopMerge %70 %71 None
801 %73 = OpIAdd %18 %72 %60
804 %75 = OpAccessChain %41 %62 %28
806 %77 = OpSGreaterThan %50 %76 %19
807 OpSelectionMerge %79 None
808 OpBranchConditional %77 %78 %79
810 %80 = OpAccessChain %41 %62 %28
812 %83 = OpISub %18 %81 %82
813 %84 = OpAccessChain %41 %62 %35
815 %87 = OpIMul %18 %85 %86
816 %88 = OpIAdd %18 %83 %87
817 %89 = OpAccessChain %57 %55 %88
819 %91 = OpIEqual %50 %90 %19
822 %92 = OpPhi %50 %77 %69 %91 %78
823 OpSelectionMerge %94 None
824 OpBranchConditional %92 %93 %94
827 %96 = OpIAdd %18 %95 %60
831 %97 = OpAccessChain %41 %62 %35
833 %99 = OpSGreaterThan %50 %98 %19
834 OpSelectionMerge %101 None
835 OpBranchConditional %99 %100 %101
837 %102 = OpAccessChain %41 %62 %28
838 %103 = OpLoad %18 %102
839 %104 = OpAccessChain %41 %62 %35
840 %105 = OpLoad %18 %104
841 %106 = OpISub %18 %105 %82
842 %107 = OpIMul %18 %106 %86
843 %108 = OpIAdd %18 %103 %107
844 %109 = OpAccessChain %57 %55 %108
845 %110 = OpLoad %18 %109
846 %111 = OpIEqual %50 %110 %19
849 %112 = OpPhi %50 %99 %94 %111 %100
850 OpSelectionMerge %114 None
851 OpBranchConditional %112 %113 %114
853 %115 = OpLoad %18 %74
854 %116 = OpIAdd %18 %115 %60
858 %117 = OpAccessChain %41 %62 %28
859 %118 = OpLoad %18 %117
860 %120 = OpSLessThan %50 %118 %119
861 OpSelectionMerge %122 None
862 OpBranchConditional %120 %121 %122
864 %123 = OpAccessChain %41 %62 %28
865 %124 = OpLoad %18 %123
866 %125 = OpIAdd %18 %124 %82
867 %126 = OpAccessChain %41 %62 %35
868 %127 = OpLoad %18 %126
869 %128 = OpIMul %18 %127 %86
870 %129 = OpIAdd %18 %125 %128
871 %130 = OpAccessChain %57 %55 %129
872 %131 = OpLoad %18 %130
873 %132 = OpIEqual %50 %131 %19
876 %133 = OpPhi %50 %120 %114 %132 %121
877 OpSelectionMerge %135 None
878 OpBranchConditional %133 %134 %135
880 %136 = OpLoad %18 %74
881 %137 = OpIAdd %18 %136 %60
885 %138 = OpAccessChain %41 %62 %35
886 %139 = OpLoad %18 %138
887 %140 = OpSLessThan %50 %139 %119
888 OpSelectionMerge %142 None
889 OpBranchConditional %140 %141 %142
891 %143 = OpAccessChain %41 %62 %28
892 %144 = OpLoad %18 %143
893 %145 = OpAccessChain %41 %62 %35
894 %146 = OpLoad %18 %145
895 %147 = OpIAdd %18 %146 %82
896 %148 = OpIMul %18 %147 %86
897 %149 = OpIAdd %18 %144 %148
898 %150 = OpAccessChain %57 %55 %149
899 %151 = OpLoad %18 %150
900 %152 = OpIEqual %50 %151 %19
903 %153 = OpPhi %50 %140 %135 %152 %141
904 OpSelectionMerge %155 None
905 OpBranchConditional %153 %154 %155
907 %156 = OpLoad %18 %74
908 %157 = OpIAdd %18 %156 %60
912 %158 = OpLoad %18 %74
913 %159 = OpIEqual %50 %158 %19
914 OpSelectionMerge %161 None
915 OpBranchConditional %159 %160 %207
921 OpLoopMerge %165 %166 None
924 %168 = OpLoad %18 %42
925 %170 = OpSLessThan %50 %168 %169
926 OpBranchConditional %170 %164 %165
931 OpLoopMerge %174 %175 None
934 %177 = OpLoad %18 %171
935 %178 = OpSLessThan %50 %177 %169
936 OpBranchConditional %178 %173 %174
938 %179 = OpLoad %18 %171
939 %180 = OpIMul %18 %179 %82
940 %181 = OpLoad %18 %42
941 %182 = OpIMul %18 %181 %82
942 %183 = OpIMul %18 %182 %86
943 %184 = OpIAdd %18 %180 %183
944 %185 = OpAccessChain %57 %55 %184
945 %186 = OpLoad %18 %185
946 %187 = OpIEqual %50 %186 %19
947 OpSelectionMerge %189 None
948 OpBranchConditional %187 %188 %189
950 %190 = OpLoad %18 %171
951 %191 = OpIMul %18 %190 %82
952 %192 = OpAccessChain %41 %62 %28
954 %193 = OpLoad %18 %42
955 %194 = OpIMul %18 %193 %82
956 %195 = OpAccessChain %41 %62 %35
963 %196 = OpLoad %18 %171
964 %197 = OpIAdd %18 %196 %60
970 %198 = OpLoad %18 %42
971 %199 = OpIAdd %18 %198 %60
975 %200 = OpAccessChain %41 %62 %28
976 %201 = OpLoad %18 %200
977 %202 = OpAccessChain %41 %62 %35
978 %203 = OpLoad %18 %202
979 %204 = OpIMul %18 %203 %86
980 %205 = OpIAdd %18 %201 %204
981 %206 = OpAccessChain %57 %55 %205
985 %209 = OpLoad %18 %67
986 %210 = OpLoad %18 %74
987 %211 = OpSMod %18 %209 %210
989 %212 = OpLoad %18 %74
990 %213 = OpLoad %18 %67
991 %214 = OpIAdd %18 %213 %212
993 %215 = OpLoad %18 %208
994 %216 = OpSGreaterThanEqual %50 %215 %19
995 OpSelectionMerge %218 None
996 OpBranchConditional %216 %217 %218
998 %219 = OpAccessChain %41 %62 %28
999 %220 = OpLoad %18 %219
1000 %221 = OpSGreaterThan %50 %220 %19
1003 %222 = OpPhi %50 %216 %207 %221 %217
1004 OpSelectionMerge %224 None
1005 OpBranchConditional %222 %223 %224
1007 %225 = OpAccessChain %41 %62 %28
1008 %226 = OpLoad %18 %225
1009 %227 = OpISub %18 %226 %82
1010 %228 = OpAccessChain %41 %62 %35
1011 %229 = OpLoad %18 %228
1012 %230 = OpIMul %18 %229 %86
1013 %231 = OpIAdd %18 %227 %230
1014 %232 = OpAccessChain %57 %55 %231
1015 %233 = OpLoad %18 %232
1016 %234 = OpIEqual %50 %233 %19
1019 %235 = OpPhi %50 %222 %218 %234 %223
1020 OpSelectionMerge %237 None
1021 OpBranchConditional %235 %236 %237
1023 %238 = OpLoad %18 %208
1024 %239 = OpISub %18 %238 %60
1026 %240 = OpAccessChain %41 %62 %28
1027 %241 = OpLoad %18 %240
1028 %242 = OpAccessChain %41 %62 %35
1029 %243 = OpLoad %18 %242
1030 %244 = OpIMul %18 %243 %86
1031 %245 = OpIAdd %18 %241 %244
1032 %246 = OpAccessChain %57 %55 %245
1034 %247 = OpAccessChain %41 %62 %28
1035 %248 = OpLoad %18 %247
1036 %249 = OpISub %18 %248 %60
1037 %250 = OpAccessChain %41 %62 %35
1038 %251 = OpLoad %18 %250
1039 %252 = OpIMul %18 %251 %86
1040 %253 = OpIAdd %18 %249 %252
1041 %254 = OpAccessChain %57 %55 %253
1043 %255 = OpAccessChain %41 %62 %28
1044 %256 = OpLoad %18 %255
1045 %257 = OpISub %18 %256 %82
1046 %258 = OpAccessChain %41 %62 %35
1047 %259 = OpLoad %18 %258
1048 %260 = OpIMul %18 %259 %86
1049 %261 = OpIAdd %18 %257 %260
1050 %262 = OpAccessChain %57 %55 %261
1052 %263 = OpAccessChain %41 %62 %28
1053 %264 = OpLoad %18 %263
1054 %265 = OpISub %18 %264 %82
1055 %266 = OpAccessChain %41 %62 %28
1059 %267 = OpLoad %18 %208
1060 %268 = OpSGreaterThanEqual %50 %267 %19
1061 OpSelectionMerge %270 None
1062 OpBranchConditional %268 %269 %270
1064 %271 = OpAccessChain %41 %62 %35
1065 %272 = OpLoad %18 %271
1066 %273 = OpSGreaterThan %50 %272 %19
1069 %274 = OpPhi %50 %268 %237 %273 %269
1070 OpSelectionMerge %276 None
1071 OpBranchConditional %274 %275 %276
1073 %277 = OpAccessChain %41 %62 %28
1074 %278 = OpLoad %18 %277
1075 %279 = OpAccessChain %41 %62 %35
1076 %280 = OpLoad %18 %279
1077 %281 = OpISub %18 %280 %82
1078 %282 = OpIMul %18 %281 %86
1079 %283 = OpIAdd %18 %278 %282
1080 %284 = OpAccessChain %57 %55 %283
1081 %285 = OpLoad %18 %284
1082 %286 = OpIEqual %50 %285 %19
1085 %287 = OpPhi %50 %274 %270 %286 %275
1086 OpSelectionMerge %289 None
1087 OpBranchConditional %287 %288 %289
1089 %290 = OpLoad %18 %208
1090 %291 = OpISub %18 %290 %60
1092 %292 = OpAccessChain %41 %62 %28
1093 %293 = OpLoad %18 %292
1094 %294 = OpAccessChain %41 %62 %35
1095 %295 = OpLoad %18 %294
1096 %296 = OpIMul %18 %295 %86
1097 %297 = OpIAdd %18 %293 %296
1098 %298 = OpAccessChain %57 %55 %297
1100 %299 = OpAccessChain %41 %62 %28
1101 %300 = OpLoad %18 %299
1102 %301 = OpAccessChain %41 %62 %35
1103 %302 = OpLoad %18 %301
1104 %303 = OpISub %18 %302 %60
1105 %304 = OpIMul %18 %303 %86
1106 %305 = OpIAdd %18 %300 %304
1107 %306 = OpAccessChain %57 %55 %305
1109 %307 = OpAccessChain %41 %62 %28
1110 %308 = OpLoad %18 %307
1111 %309 = OpAccessChain %41 %62 %35
1112 %310 = OpLoad %18 %309
1113 %311 = OpISub %18 %310 %82
1114 %312 = OpIMul %18 %311 %86
1115 %313 = OpIAdd %18 %308 %312
1116 %314 = OpAccessChain %57 %55 %313
1118 %315 = OpAccessChain %41 %62 %35
1119 %316 = OpLoad %18 %315
1120 %317 = OpISub %18 %316 %82
1121 %318 = OpAccessChain %41 %62 %35
1125 %319 = OpLoad %18 %208
1126 %320 = OpSGreaterThanEqual %50 %319 %19
1127 OpSelectionMerge %322 None
1128 OpBranchConditional %320 %321 %322
1130 %323 = OpAccessChain %41 %62 %28
1131 %324 = OpLoad %18 %323
1132 %325 = OpSLessThan %50 %324 %119
1135 %326 = OpPhi %50 %320 %289 %325 %321
1136 OpSelectionMerge %328 None
1137 OpBranchConditional %326 %327 %328
1139 %329 = OpAccessChain %41 %62 %28
1140 %330 = OpLoad %18 %329
1141 %331 = OpIAdd %18 %330 %82
1142 %332 = OpAccessChain %41 %62 %35
1143 %333 = OpLoad %18 %332
1144 %334 = OpIMul %18 %333 %86
1145 %335 = OpIAdd %18 %331 %334
1146 %336 = OpAccessChain %57 %55 %335
1147 %337 = OpLoad %18 %336
1148 %338 = OpIEqual %50 %337 %19
1151 %339 = OpPhi %50 %326 %322 %338 %327
1152 OpSelectionMerge %341 None
1153 OpBranchConditional %339 %340 %341
1155 %342 = OpLoad %18 %208
1156 %343 = OpISub %18 %342 %60
1158 %344 = OpAccessChain %41 %62 %28
1159 %345 = OpLoad %18 %344
1160 %346 = OpAccessChain %41 %62 %35
1161 %347 = OpLoad %18 %346
1162 %348 = OpIMul %18 %347 %86
1163 %349 = OpIAdd %18 %345 %348
1164 %350 = OpAccessChain %57 %55 %349
1166 %351 = OpAccessChain %41 %62 %28
1167 %352 = OpLoad %18 %351
1168 %353 = OpIAdd %18 %352 %60
1169 %354 = OpAccessChain %41 %62 %35
1170 %355 = OpLoad %18 %354
1171 %356 = OpIMul %18 %355 %86
1172 %357 = OpIAdd %18 %353 %356
1173 %358 = OpAccessChain %57 %55 %357
1175 %359 = OpAccessChain %41 %62 %28
1176 %360 = OpLoad %18 %359
1177 %361 = OpIAdd %18 %360 %82
1178 %362 = OpAccessChain %41 %62 %35
1179 %363 = OpLoad %18 %362
1180 %364 = OpIMul %18 %363 %86
1181 %365 = OpIAdd %18 %361 %364
1182 %366 = OpAccessChain %57 %55 %365
1184 %367 = OpAccessChain %41 %62 %28
1185 %368 = OpLoad %18 %367
1186 %369 = OpIAdd %18 %368 %82
1187 %370 = OpAccessChain %41 %62 %28
1191 %371 = OpLoad %18 %208
1192 %372 = OpSGreaterThanEqual %50 %371 %19
1193 OpSelectionMerge %374 None
1194 OpBranchConditional %372 %373 %374
1196 %375 = OpAccessChain %41 %62 %35
1197 %376 = OpLoad %18 %375
1198 %377 = OpSLessThan %50 %376 %119
1201 %378 = OpPhi %50 %372 %341 %377 %373
1202 OpSelectionMerge %380 None
1203 OpBranchConditional %378 %379 %380
1205 %381 = OpAccessChain %41 %62 %28
1206 %382 = OpLoad %18 %381
1207 %383 = OpAccessChain %41 %62 %35
1208 %384 = OpLoad %18 %383
1209 %385 = OpIAdd %18 %384 %82
1210 %386 = OpIMul %18 %385 %86
1211 %387 = OpIAdd %18 %382 %386
1212 %388 = OpAccessChain %57 %55 %387
1213 %389 = OpLoad %18 %388
1214 %390 = OpIEqual %50 %389 %19
1217 %391 = OpPhi %50 %378 %374 %390 %379
1218 OpSelectionMerge %393 None
1219 OpBranchConditional %391 %392 %393
1221 %394 = OpLoad %18 %208
1222 %395 = OpISub %18 %394 %60
1224 %396 = OpAccessChain %41 %62 %28
1225 %397 = OpLoad %18 %396
1226 %398 = OpAccessChain %41 %62 %35
1227 %399 = OpLoad %18 %398
1228 %400 = OpIMul %18 %399 %86
1229 %401 = OpIAdd %18 %397 %400
1230 %402 = OpAccessChain %57 %55 %401
1232 %403 = OpAccessChain %41 %62 %28
1233 %404 = OpLoad %18 %403
1234 %405 = OpAccessChain %41 %62 %35
1235 %406 = OpLoad %18 %405
1236 %407 = OpIAdd %18 %406 %60
1237 %408 = OpIMul %18 %407 %86
1238 %409 = OpIAdd %18 %404 %408
1239 %410 = OpAccessChain %57 %55 %409
1241 %411 = OpAccessChain %41 %62 %28
1242 %412 = OpLoad %18 %411
1243 %413 = OpAccessChain %41 %62 %35
1244 %414 = OpLoad %18 %413
1245 %415 = OpIAdd %18 %414 %82
1246 %416 = OpIMul %18 %415 %86
1247 %417 = OpIAdd %18 %412 %416
1248 %418 = OpAccessChain %57 %55 %417
1250 %419 = OpAccessChain %41 %62 %35
1251 %420 = OpLoad %18 %419
1252 %421 = OpIAdd %18 %420 %82
1253 %422 = OpAccessChain %41 %62 %35
1259 %423 = OpAccessChain %41 %26 %35
1260 %424 = OpLoad %18 %423
1261 %425 = OpIMul %18 %424 %86
1262 %426 = OpAccessChain %41 %26 %28
1263 %427 = OpLoad %18 %426
1264 %428 = OpIAdd %18 %425 %427
1265 %429 = OpAccessChain %57 %55 %428
1266 %430 = OpLoad %18 %429
1267 %431 = OpIEqual %50 %430 %60
1268 OpSelectionMerge %433 None
1269 OpBranchConditional %431 %432 %433
1276 %439 = OpLoad %50 %65
1277 %740 = OpAccessChain %41 %208
1278 OpBranchConditional %439 %68 %70
1280 %741 = OpAccessChain %41 %740
1286 # uniforms for variant
1289 BUFFER variant_resolution DATA_TYPE vec2<float> DATA
1293 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
1295 PIPELINE graphics variant_pipeline
1296 ATTACH variant_vertex_shader
1297 ATTACH variant_fragment_shader
1298 FRAMEBUFFER_SIZE 64 64
1299 BIND BUFFER variant_framebuffer AS color LOCATION 0
1300 BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
1302 CLEAR_COLOR variant_pipeline 0 0 0 255
1304 CLEAR variant_pipeline
1305 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 64 64
1307 EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005