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: Two shaders with diff: added mat3x3 func param
22 # The test renders two images using semantically equivalent shaders, and then
23 # checks that the images are similar.
24 # The test passes because the shaders have the same semantics and so the images
27 SHADER vertex reference_vertex_shader PASSTHROUGH
29 SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
32 ; Generator: Khronos Glslang Reference Front End; 7
36 %1 = OpExtInstImport "GLSL.std.450"
37 OpMemoryModel Logical GLSL450
38 OpEntryPoint Fragment %4 "main" %183 %324
39 OpExecutionMode %4 OriginUpperLeft
42 OpName %11 "swap(i1;i1;"
45 OpName %16 "performPartition(i1;i1;"
48 OpName %18 "quicksort("
50 OpName %24 "QuicksortObject"
51 OpMemberName %24 0 "numbers"
69 OpName %183 "gl_FragCoord"
71 OpMemberName %186 0 "resolution"
74 OpName %324 "_GLF_color"
75 OpDecorate %183 BuiltIn FragCoord
76 OpMemberDecorate %186 0 Offset 0
78 OpDecorate %188 DescriptorSet 0
79 OpDecorate %188 Binding 0
80 OpDecorate %324 Location 0
82 %3 = OpTypeFunction %2
84 %7 = OpTypePointer Function %6
85 %8 = OpTypeFunction %2 %7 %7
86 %13 = OpTypeFunction %6 %7 %7
88 %22 = OpConstant %21 10
89 %23 = OpTypeArray %6 %22
90 %24 = OpTypeStruct %23
91 %25 = OpTypePointer Private %24
92 %26 = OpVariable %25 Private
94 %29 = OpTypePointer Private %6
98 %90 = OpConstant %6 -1
99 %91 = OpTypePointer Function %23
100 %159 = OpConstant %6 10
101 %177 = OpTypeFloat 32
102 %178 = OpTypeVector %177 2
103 %179 = OpTypePointer Function %178
104 %181 = OpTypeVector %177 4
105 %182 = OpTypePointer Input %181
106 %183 = OpVariable %182 Input
107 %186 = OpTypeStruct %178
108 %187 = OpTypePointer Uniform %186
109 %188 = OpVariable %187 Uniform
110 %189 = OpTypePointer Uniform %178
111 %193 = OpTypeVector %177 3
112 %194 = OpTypePointer Function %193
113 %196 = OpConstant %177 1
114 %197 = OpConstant %177 2
115 %198 = OpConstant %177 3
116 %199 = OpConstantComposite %193 %196 %197 %198
117 %203 = OpConstant %21 0
118 %204 = OpTypePointer Function %177
119 %211 = OpConstant %177 0.25
120 %224 = OpConstant %177 0.5
121 %228 = OpConstant %6 2
122 %232 = OpConstant %21 1
123 %239 = OpConstant %177 0.75
124 %243 = OpConstant %6 3
125 %247 = OpConstant %21 2
126 %252 = OpConstant %6 4
127 %265 = OpConstant %6 5
128 %278 = OpConstant %6 6
129 %291 = OpConstant %6 7
130 %299 = OpConstant %6 8
131 %323 = OpTypePointer Output %181
132 %324 = OpVariable %323 Output
133 %4 = OpFunction %2 None %3
135 %152 = OpVariable %7 Function
136 %180 = OpVariable %179 Function
137 %195 = OpVariable %194 Function
141 OpLoopMerge %155 %156 None
144 %158 = OpLoad %6 %152
145 %160 = OpSLessThan %58 %158 %159
146 OpBranchConditional %160 %154 %155
148 %161 = OpLoad %6 %152
149 %162 = OpLoad %6 %152
150 %163 = OpISub %6 %159 %162
151 %164 = OpAccessChain %29 %26 %27 %161
153 %165 = OpLoad %6 %152
154 %166 = OpLoad %6 %152
155 %167 = OpAccessChain %29 %26 %27 %166
156 %168 = OpLoad %6 %167
157 %169 = OpLoad %6 %152
158 %170 = OpAccessChain %29 %26 %27 %169
159 %171 = OpLoad %6 %170
160 %172 = OpIMul %6 %168 %171
161 %173 = OpAccessChain %29 %26 %27 %165
165 %174 = OpLoad %6 %152
166 %175 = OpIAdd %6 %174 %46
170 %176 = OpFunctionCall %2 %18
171 %184 = OpLoad %181 %183
172 %185 = OpVectorShuffle %178 %184 %184 0 1
173 %190 = OpAccessChain %189 %188 %27
174 %191 = OpLoad %178 %190
175 %192 = OpFDiv %178 %185 %191
178 %200 = OpAccessChain %29 %26 %27 %27
179 %201 = OpLoad %6 %200
180 %202 = OpConvertSToF %177 %201
181 %205 = OpAccessChain %204 %195 %203
182 %206 = OpLoad %177 %205
183 %207 = OpFAdd %177 %206 %202
184 %208 = OpAccessChain %204 %195 %203
186 %209 = OpAccessChain %204 %180 %203
187 %210 = OpLoad %177 %209
188 %212 = OpFOrdGreaterThan %58 %210 %211
189 OpSelectionMerge %214 None
190 OpBranchConditional %212 %213 %214
192 %215 = OpAccessChain %29 %26 %27 %46
193 %216 = OpLoad %6 %215
194 %217 = OpConvertSToF %177 %216
195 %218 = OpAccessChain %204 %195 %203
196 %219 = OpLoad %177 %218
197 %220 = OpFAdd %177 %219 %217
198 %221 = OpAccessChain %204 %195 %203
202 %222 = OpAccessChain %204 %180 %203
203 %223 = OpLoad %177 %222
204 %225 = OpFOrdGreaterThan %58 %223 %224
205 OpSelectionMerge %227 None
206 OpBranchConditional %225 %226 %227
208 %229 = OpAccessChain %29 %26 %27 %228
209 %230 = OpLoad %6 %229
210 %231 = OpConvertSToF %177 %230
211 %233 = OpAccessChain %204 %195 %232
212 %234 = OpLoad %177 %233
213 %235 = OpFAdd %177 %234 %231
214 %236 = OpAccessChain %204 %195 %232
218 %237 = OpAccessChain %204 %180 %203
219 %238 = OpLoad %177 %237
220 %240 = OpFOrdGreaterThan %58 %238 %239
221 OpSelectionMerge %242 None
222 OpBranchConditional %240 %241 %242
224 %244 = OpAccessChain %29 %26 %27 %243
225 %245 = OpLoad %6 %244
226 %246 = OpConvertSToF %177 %245
227 %248 = OpAccessChain %204 %195 %247
228 %249 = OpLoad %177 %248
229 %250 = OpFAdd %177 %249 %246
230 %251 = OpAccessChain %204 %195 %247
234 %253 = OpAccessChain %29 %26 %27 %252
235 %254 = OpLoad %6 %253
236 %255 = OpConvertSToF %177 %254
237 %256 = OpAccessChain %204 %195 %232
238 %257 = OpLoad %177 %256
239 %258 = OpFAdd %177 %257 %255
240 %259 = OpAccessChain %204 %195 %232
242 %260 = OpAccessChain %204 %180 %232
243 %261 = OpLoad %177 %260
244 %262 = OpFOrdGreaterThan %58 %261 %211
245 OpSelectionMerge %264 None
246 OpBranchConditional %262 %263 %264
248 %266 = OpAccessChain %29 %26 %27 %265
249 %267 = OpLoad %6 %266
250 %268 = OpConvertSToF %177 %267
251 %269 = OpAccessChain %204 %195 %203
252 %270 = OpLoad %177 %269
253 %271 = OpFAdd %177 %270 %268
254 %272 = OpAccessChain %204 %195 %203
258 %273 = OpAccessChain %204 %180 %232
259 %274 = OpLoad %177 %273
260 %275 = OpFOrdGreaterThan %58 %274 %224
261 OpSelectionMerge %277 None
262 OpBranchConditional %275 %276 %277
264 %279 = OpAccessChain %29 %26 %27 %278
265 %280 = OpLoad %6 %279
266 %281 = OpConvertSToF %177 %280
267 %282 = OpAccessChain %204 %195 %232
268 %283 = OpLoad %177 %282
269 %284 = OpFAdd %177 %283 %281
270 %285 = OpAccessChain %204 %195 %232
274 %286 = OpAccessChain %204 %180 %232
275 %287 = OpLoad %177 %286
276 %288 = OpFOrdGreaterThan %58 %287 %239
277 OpSelectionMerge %290 None
278 OpBranchConditional %288 %289 %290
280 %292 = OpAccessChain %29 %26 %27 %291
281 %293 = OpLoad %6 %292
282 %294 = OpConvertSToF %177 %293
283 %295 = OpAccessChain %204 %195 %247
284 %296 = OpLoad %177 %295
285 %297 = OpFAdd %177 %296 %294
286 %298 = OpAccessChain %204 %195 %247
290 %300 = OpAccessChain %29 %26 %27 %299
291 %301 = OpLoad %6 %300
292 %302 = OpConvertSToF %177 %301
293 %303 = OpAccessChain %204 %195 %247
294 %304 = OpLoad %177 %303
295 %305 = OpFAdd %177 %304 %302
296 %306 = OpAccessChain %204 %195 %247
298 %307 = OpAccessChain %204 %180 %203
299 %308 = OpLoad %177 %307
300 %309 = OpAccessChain %204 %180 %232
301 %310 = OpLoad %177 %309
302 %311 = OpFSub %177 %308 %310
303 %312 = OpExtInst %177 %1 FAbs %311
304 %313 = OpFOrdLessThan %58 %312 %211
305 OpSelectionMerge %315 None
306 OpBranchConditional %313 %314 %315
308 %316 = OpAccessChain %29 %26 %27 %88
309 %317 = OpLoad %6 %316
310 %318 = OpConvertSToF %177 %317
311 %319 = OpAccessChain %204 %195 %203
312 %320 = OpLoad %177 %319
313 %321 = OpFAdd %177 %320 %318
314 %322 = OpAccessChain %204 %195 %203
318 %325 = OpLoad %193 %195
319 %326 = OpExtInst %193 %1 Normalize %325
320 %327 = OpCompositeExtract %177 %326 0
321 %328 = OpCompositeExtract %177 %326 1
322 %329 = OpCompositeExtract %177 %326 2
323 %330 = OpCompositeConstruct %181 %327 %328 %329 %196
327 %11 = OpFunction %2 None %8
328 %9 = OpFunctionParameter %7
329 %10 = OpFunctionParameter %7
331 %20 = OpVariable %7 Function
333 %30 = OpAccessChain %29 %26 %27 %28
338 %34 = OpAccessChain %29 %26 %27 %33
340 %36 = OpAccessChain %29 %26 %27 %32
344 %39 = OpAccessChain %29 %26 %27 %37
348 %16 = OpFunction %6 None %13
349 %14 = OpFunctionParameter %7
350 %15 = OpFunctionParameter %7
352 %40 = OpVariable %7 Function
353 %44 = OpVariable %7 Function
354 %48 = OpVariable %7 Function
355 %69 = OpVariable %7 Function
356 %71 = OpVariable %7 Function
357 %78 = OpVariable %7 Function
358 %80 = OpVariable %7 Function
360 %42 = OpAccessChain %29 %26 %27 %41
364 %47 = OpISub %6 %45 %46
370 OpLoopMerge %52 %53 None
375 %57 = OpISub %6 %56 %46
376 %59 = OpSLessThanEqual %58 %55 %57
377 OpBranchConditional %59 %51 %52
380 %61 = OpAccessChain %29 %26 %27 %60
383 %64 = OpSLessThanEqual %58 %62 %63
384 OpSelectionMerge %66 None
385 OpBranchConditional %64 %65 %66
388 %68 = OpIAdd %6 %67 %46
394 %73 = OpFunctionCall %2 %11 %69 %71
400 %75 = OpIAdd %6 %74 %46
405 %77 = OpIAdd %6 %76 %46
411 %82 = OpFunctionCall %2 %11 %78 %80
415 %18 = OpFunction %2 None %3
417 %86 = OpVariable %7 Function
418 %87 = OpVariable %7 Function
419 %89 = OpVariable %7 Function
420 %92 = OpVariable %91 Function
421 %116 = OpVariable %7 Function
422 %117 = OpVariable %7 Function
423 %119 = OpVariable %7 Function
428 %94 = OpIAdd %6 %93 %46
431 %96 = OpAccessChain %7 %92 %94
434 %98 = OpIAdd %6 %97 %46
437 %100 = OpAccessChain %7 %92 %98
441 OpLoopMerge %103 %104 None
445 %107 = OpSGreaterThanEqual %58 %106 %27
446 OpBranchConditional %107 %102 %103
449 %109 = OpISub %6 %108 %46
451 %110 = OpAccessChain %7 %92 %108
452 %111 = OpLoad %6 %110
455 %113 = OpISub %6 %112 %46
457 %114 = OpAccessChain %7 %92 %112
458 %115 = OpLoad %6 %114
464 %121 = OpFunctionCall %6 %16 %117 %119
466 %122 = OpLoad %6 %116
467 %123 = OpISub %6 %122 %46
469 %125 = OpSGreaterThan %58 %123 %124
470 OpSelectionMerge %127 None
471 OpBranchConditional %125 %126 %127
474 %129 = OpIAdd %6 %128 %46
477 %131 = OpAccessChain %7 %92 %129
480 %133 = OpIAdd %6 %132 %46
482 %134 = OpLoad %6 %116
483 %135 = OpISub %6 %134 %46
484 %136 = OpAccessChain %7 %92 %133
488 %137 = OpLoad %6 %116
489 %138 = OpIAdd %6 %137 %46
491 %140 = OpSLessThan %58 %138 %139
492 OpSelectionMerge %142 None
493 OpBranchConditional %140 %141 %142
496 %144 = OpIAdd %6 %143 %46
498 %145 = OpLoad %6 %116
499 %146 = OpIAdd %6 %145 %46
500 %147 = OpAccessChain %7 %92 %144
503 %149 = OpIAdd %6 %148 %46
506 %151 = OpAccessChain %7 %92 %149
518 # uniforms for reference
521 BUFFER reference_resolution DATA_TYPE vec2<float> STD140 DATA
525 BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
527 PIPELINE graphics reference_pipeline
528 ATTACH reference_vertex_shader
529 ATTACH reference_fragment_shader
530 FRAMEBUFFER_SIZE 256 256
531 BIND BUFFER reference_framebuffer AS color LOCATION 0
532 BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
534 CLEAR_COLOR reference_pipeline 0 0 0 255
536 CLEAR reference_pipeline
537 RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
540 SHADER vertex variant_vertex_shader PASSTHROUGH
542 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
545 ; Generator: Khronos Glslang Reference Front End; 7
549 %1 = OpExtInstImport "GLSL.std.450"
550 OpMemoryModel Logical GLSL450
551 OpEntryPoint Fragment %4 "main" %183 %324
552 OpExecutionMode %4 OriginUpperLeft
555 OpName %11 "swap(i1;i1;"
558 OpName %16 "performPartition(i1;i1;"
561 OpName %18 "quicksort("
563 OpName %24 "QuicksortObject"
564 OpMemberName %24 0 "numbers"
582 OpName %183 "gl_FragCoord"
584 OpMemberName %186 0 "resolution"
587 OpName %324 "_GLF_color"
588 OpDecorate %183 BuiltIn FragCoord
589 OpMemberDecorate %186 0 Offset 0
590 OpDecorate %186 Block
591 OpDecorate %188 DescriptorSet 0
592 OpDecorate %188 Binding 0
593 OpDecorate %324 Location 0
595 %3 = OpTypeFunction %2
597 %7 = OpTypePointer Function %6
598 %13 = OpTypeFunction %6 %7 %7
600 %22 = OpConstant %21 10
601 %23 = OpTypeArray %6 %22
602 %24 = OpTypeStruct %23
603 %25 = OpTypePointer Private %24
604 %26 = OpVariable %25 Private
605 %27 = OpConstant %6 0
606 %29 = OpTypePointer Private %6
607 %46 = OpConstant %6 1
609 %88 = OpConstant %6 9
610 %90 = OpConstant %6 -1
611 %91 = OpTypePointer Function %23
612 %159 = OpConstant %6 10
613 %177 = OpTypeFloat 32
614 %178 = OpTypeVector %177 2
615 %179 = OpTypePointer Function %178
616 %181 = OpTypeVector %177 4
617 %182 = OpTypePointer Input %181
618 %183 = OpVariable %182 Input
619 %186 = OpTypeStruct %178
620 %187 = OpTypePointer Uniform %186
621 %188 = OpVariable %187 Uniform
622 %189 = OpTypePointer Uniform %178
623 %193 = OpTypeVector %177 3
624 %194 = OpTypePointer Function %193
625 %196 = OpConstant %177 1
626 %197 = OpConstant %177 2
627 %198 = OpConstant %177 3
628 %199 = OpConstantComposite %193 %196 %197 %198
629 %203 = OpConstant %21 0
630 %204 = OpTypePointer Function %177
631 %211 = OpConstant %177 0.25
632 %224 = OpConstant %177 0.5
633 %228 = OpConstant %6 2
634 %232 = OpConstant %21 1
635 %239 = OpConstant %177 0.75
636 %243 = OpConstant %6 3
637 %247 = OpConstant %21 2
638 %252 = OpConstant %6 4
639 %265 = OpConstant %6 5
640 %278 = OpConstant %6 6
641 %291 = OpConstant %6 7
642 %299 = OpConstant %6 8
643 %323 = OpTypePointer Output %181
644 %324 = OpVariable %323 Output
645 %438 = OpTypeMatrix %193 3
646 %521 = OpConstant %177 0
647 %522 = OpConstantComposite %193 %521 %521 %521
648 %527 = OpConstantComposite %438 %522 %522 %522
649 %8 = OpTypeFunction %2 %7 %7 %438
650 %4 = OpFunction %2 None %3
652 %152 = OpVariable %7 Function
653 %180 = OpVariable %179 Function
654 %195 = OpVariable %194 Function
658 OpLoopMerge %155 %156 None
661 %158 = OpLoad %6 %152
662 %160 = OpSLessThan %58 %158 %159
663 OpBranchConditional %160 %154 %155
665 %161 = OpLoad %6 %152
666 %162 = OpLoad %6 %152
667 %163 = OpISub %6 %159 %162
668 %164 = OpAccessChain %29 %26 %27 %161
670 %165 = OpLoad %6 %152
671 %166 = OpLoad %6 %152
672 %167 = OpAccessChain %29 %26 %27 %166
673 %168 = OpLoad %6 %167
674 %169 = OpLoad %6 %152
675 %170 = OpAccessChain %29 %26 %27 %169
676 %171 = OpLoad %6 %170
677 %172 = OpIMul %6 %168 %171
678 %173 = OpAccessChain %29 %26 %27 %165
682 %174 = OpLoad %6 %152
683 %175 = OpIAdd %6 %174 %46
687 %176 = OpFunctionCall %2 %18
688 %184 = OpLoad %181 %183
689 %185 = OpVectorShuffle %178 %184 %184 0 1
690 %190 = OpAccessChain %189 %188 %27
691 %191 = OpLoad %178 %190
692 %192 = OpFDiv %178 %185 %191
695 %200 = OpAccessChain %29 %26 %27 %27
696 %201 = OpLoad %6 %200
697 %202 = OpConvertSToF %177 %201
698 %205 = OpAccessChain %204 %195 %203
699 %206 = OpLoad %177 %205
700 %207 = OpFAdd %177 %206 %202
701 %208 = OpAccessChain %204 %195 %203
703 %209 = OpAccessChain %204 %180 %203
704 %210 = OpLoad %177 %209
705 %212 = OpFOrdGreaterThan %58 %210 %211
706 OpSelectionMerge %214 None
707 OpBranchConditional %212 %213 %214
709 %215 = OpAccessChain %29 %26 %27 %46
710 %216 = OpLoad %6 %215
711 %217 = OpConvertSToF %177 %216
712 %218 = OpAccessChain %204 %195 %203
713 %219 = OpLoad %177 %218
714 %220 = OpFAdd %177 %219 %217
715 %221 = OpAccessChain %204 %195 %203
719 %222 = OpAccessChain %204 %180 %203
720 %223 = OpLoad %177 %222
721 %225 = OpFOrdGreaterThan %58 %223 %224
722 OpSelectionMerge %227 None
723 OpBranchConditional %225 %226 %227
725 %229 = OpAccessChain %29 %26 %27 %228
726 %230 = OpLoad %6 %229
727 %231 = OpConvertSToF %177 %230
728 %233 = OpAccessChain %204 %195 %232
729 %234 = OpLoad %177 %233
730 %235 = OpFAdd %177 %234 %231
731 %236 = OpAccessChain %204 %195 %232
735 %237 = OpAccessChain %204 %180 %203
736 %238 = OpLoad %177 %237
737 %240 = OpFOrdGreaterThan %58 %238 %239
738 OpSelectionMerge %242 None
739 OpBranchConditional %240 %241 %242
741 %244 = OpAccessChain %29 %26 %27 %243
742 %245 = OpLoad %6 %244
743 %246 = OpConvertSToF %177 %245
744 %248 = OpAccessChain %204 %195 %247
745 %249 = OpLoad %177 %248
746 %250 = OpFAdd %177 %249 %246
747 %251 = OpAccessChain %204 %195 %247
751 %253 = OpAccessChain %29 %26 %27 %252
752 %254 = OpLoad %6 %253
753 %255 = OpConvertSToF %177 %254
754 %256 = OpAccessChain %204 %195 %232
755 %257 = OpLoad %177 %256
756 %258 = OpFAdd %177 %257 %255
757 %259 = OpAccessChain %204 %195 %232
759 %260 = OpAccessChain %204 %180 %232
760 %261 = OpLoad %177 %260
761 %262 = OpFOrdGreaterThan %58 %261 %211
762 OpSelectionMerge %264 None
763 OpBranchConditional %262 %263 %264
765 %266 = OpAccessChain %29 %26 %27 %265
766 %267 = OpLoad %6 %266
767 %268 = OpConvertSToF %177 %267
768 %269 = OpAccessChain %204 %195 %203
769 %270 = OpLoad %177 %269
770 %271 = OpFAdd %177 %270 %268
771 %272 = OpAccessChain %204 %195 %203
775 %273 = OpAccessChain %204 %180 %232
776 %274 = OpLoad %177 %273
777 %275 = OpFOrdGreaterThan %58 %274 %224
778 OpSelectionMerge %277 None
779 OpBranchConditional %275 %276 %277
781 %279 = OpAccessChain %29 %26 %27 %278
782 %280 = OpLoad %6 %279
783 %281 = OpConvertSToF %177 %280
784 %282 = OpAccessChain %204 %195 %232
785 %283 = OpLoad %177 %282
786 %284 = OpFAdd %177 %283 %281
787 %285 = OpAccessChain %204 %195 %232
791 %286 = OpAccessChain %204 %180 %232
792 %287 = OpLoad %177 %286
793 %288 = OpFOrdGreaterThan %58 %287 %239
794 OpSelectionMerge %290 None
795 OpBranchConditional %288 %289 %290
797 %292 = OpAccessChain %29 %26 %27 %291
798 %293 = OpLoad %6 %292
799 %294 = OpConvertSToF %177 %293
800 %295 = OpAccessChain %204 %195 %247
801 %296 = OpLoad %177 %295
802 %297 = OpFAdd %177 %296 %294
803 %298 = OpAccessChain %204 %195 %247
807 %300 = OpAccessChain %29 %26 %27 %299
808 %301 = OpLoad %6 %300
809 %302 = OpConvertSToF %177 %301
810 %303 = OpAccessChain %204 %195 %247
811 %304 = OpLoad %177 %303
812 %305 = OpFAdd %177 %304 %302
813 %306 = OpAccessChain %204 %195 %247
815 %307 = OpAccessChain %204 %180 %203
816 %308 = OpLoad %177 %307
817 %309 = OpAccessChain %204 %180 %232
818 %310 = OpLoad %177 %309
819 %311 = OpFSub %177 %308 %310
820 %312 = OpExtInst %177 %1 FAbs %311
821 %313 = OpFOrdLessThan %58 %312 %211
822 OpSelectionMerge %315 None
823 OpBranchConditional %313 %314 %315
825 %316 = OpAccessChain %29 %26 %27 %88
826 %317 = OpLoad %6 %316
827 %318 = OpConvertSToF %177 %317
828 %319 = OpAccessChain %204 %195 %203
829 %320 = OpLoad %177 %319
830 %321 = OpFAdd %177 %320 %318
831 %322 = OpAccessChain %204 %195 %203
835 %325 = OpLoad %193 %195
836 %326 = OpExtInst %193 %1 Normalize %325
837 %327 = OpCompositeExtract %177 %326 0
838 %328 = OpCompositeExtract %177 %326 1
839 %329 = OpCompositeExtract %177 %326 2
840 %330 = OpCompositeConstruct %181 %327 %328 %329 %196
844 %11 = OpFunction %2 None %8
845 %9 = OpFunctionParameter %7
846 %10 = OpFunctionParameter %7
847 %528 = OpFunctionParameter %438
849 %20 = OpVariable %7 Function
851 %30 = OpAccessChain %29 %26 %27 %28
856 %34 = OpAccessChain %29 %26 %27 %33
858 %36 = OpAccessChain %29 %26 %27 %32
862 %39 = OpAccessChain %29 %26 %27 %37
866 %16 = OpFunction %6 None %13
867 %14 = OpFunctionParameter %7
868 %15 = OpFunctionParameter %7
870 %40 = OpVariable %7 Function
871 %44 = OpVariable %7 Function
872 %48 = OpVariable %7 Function
873 %69 = OpVariable %7 Function
874 %71 = OpVariable %7 Function
875 %78 = OpVariable %7 Function
876 %80 = OpVariable %7 Function
878 %42 = OpAccessChain %29 %26 %27 %41
882 %47 = OpISub %6 %45 %46
888 OpLoopMerge %52 %53 None
893 %57 = OpISub %6 %56 %46
894 %59 = OpSLessThanEqual %58 %55 %57
895 OpBranchConditional %59 %51 %52
898 %61 = OpAccessChain %29 %26 %27 %60
901 %64 = OpSLessThanEqual %58 %62 %63
902 OpSelectionMerge %66 None
903 OpBranchConditional %64 %65 %66
906 %68 = OpIAdd %6 %67 %46
912 %73 = OpFunctionCall %2 %11 %69 %71 %527
918 %75 = OpIAdd %6 %74 %46
923 %77 = OpIAdd %6 %76 %46
929 %82 = OpFunctionCall %2 %11 %78 %80 %527
933 %18 = OpFunction %2 None %3
935 %86 = OpVariable %7 Function
936 %87 = OpVariable %7 Function
937 %89 = OpVariable %7 Function
938 %92 = OpVariable %91 Function
939 %116 = OpVariable %7 Function
940 %117 = OpVariable %7 Function
941 %119 = OpVariable %7 Function
946 %94 = OpIAdd %6 %93 %46
949 %96 = OpAccessChain %7 %92 %94
952 %98 = OpIAdd %6 %97 %46
955 %100 = OpAccessChain %7 %92 %98
959 OpLoopMerge %103 %104 None
963 %107 = OpSGreaterThanEqual %58 %106 %27
964 OpBranchConditional %107 %102 %103
967 %109 = OpISub %6 %108 %46
969 %110 = OpAccessChain %7 %92 %108
970 %111 = OpLoad %6 %110
973 %113 = OpISub %6 %112 %46
975 %114 = OpAccessChain %7 %92 %112
976 %115 = OpLoad %6 %114
982 %121 = OpFunctionCall %6 %16 %117 %119
984 %122 = OpLoad %6 %116
985 %123 = OpISub %6 %122 %46
987 %125 = OpSGreaterThan %58 %123 %124
988 OpSelectionMerge %127 None
989 OpBranchConditional %125 %126 %127
992 %129 = OpIAdd %6 %128 %46
995 %131 = OpAccessChain %7 %92 %129
998 %133 = OpIAdd %6 %132 %46
1000 %134 = OpLoad %6 %116
1001 %135 = OpISub %6 %134 %46
1002 %136 = OpAccessChain %7 %92 %133
1006 %137 = OpLoad %6 %116
1007 %138 = OpIAdd %6 %137 %46
1008 %139 = OpLoad %6 %87
1009 %140 = OpSLessThan %58 %138 %139
1010 OpSelectionMerge %142 None
1011 OpBranchConditional %140 %141 %142
1013 %143 = OpLoad %6 %89
1014 %144 = OpIAdd %6 %143 %46
1016 %145 = OpLoad %6 %116
1017 %146 = OpIAdd %6 %145 %46
1018 %147 = OpAccessChain %7 %92 %144
1020 %148 = OpLoad %6 %89
1021 %149 = OpIAdd %6 %148 %46
1023 %150 = OpLoad %6 %87
1024 %151 = OpAccessChain %7 %92 %149
1036 # uniforms for variant
1039 BUFFER variant_resolution DATA_TYPE vec2<float> STD140 DATA
1043 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
1045 PIPELINE graphics variant_pipeline
1046 ATTACH variant_vertex_shader
1047 ATTACH variant_fragment_shader
1048 FRAMEBUFFER_SIZE 256 256
1049 BIND BUFFER variant_framebuffer AS color LOCATION 0
1050 BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
1052 CLEAR_COLOR variant_pipeline 0 0 0 255
1054 CLEAR variant_pipeline
1055 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
1057 EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005