1#!amber
2
3# Copyright 2020 Google LLC
4#
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
8#
9#     http://www.apache.org/licenses/LICENSE-2.0
10#
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.
16
17
18# A test for a bug found by the GraphicsFuzz project.
19
20# Short description: Equivalent shaders; one features extra OpCopyObject instructions
21
22# The test passes because both shaders render the same image.
23
24SHADER vertex reference_vertex_shader PASSTHROUGH
25
26SHADER fragment reference_fragment_shader SPIRV-ASM
27; SPIR-V
28; Version: 1.0
29; Generator: Khronos Glslang Reference Front End; 7
30; Bound: 442
31; Schema: 0
32               OpCapability Shader
33          %1 = OpExtInstImport "GLSL.std.450"
34               OpMemoryModel Logical GLSL450
35               OpEntryPoint Fragment %4 "main" %12 %435
36               OpExecutionMode %4 OriginUpperLeft
37               OpSource ESSL 320
38               OpName %4 "main"
39               OpName %9 "pos"
40               OpName %12 "gl_FragCoord"
41               OpName %15 "buf0"
42               OpMemberName %15 0 "resolution"
43               OpName %17 ""
44               OpName %26 "ipos"
45               OpName %42 "i"
46               OpName %55 "map"
47               OpName %62 "p"
48               OpName %65 "canwalk"
49               OpName %67 "v"
50               OpName %74 "directions"
51               OpName %171 "j"
52               OpName %208 "d"
53               OpName %435 "_GLF_color"
54               OpDecorate %12 BuiltIn FragCoord
55               OpMemberDecorate %15 0 Offset 0
56               OpDecorate %15 Block
57               OpDecorate %17 DescriptorSet 0
58               OpDecorate %17 Binding 0
59               OpDecorate %435 Location 0
60          %2 = OpTypeVoid
61          %3 = OpTypeFunction %2
62          %6 = OpTypeFloat 32
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
68         %15 = OpTypeStruct %7
69         %16 = OpTypePointer Uniform %15
70         %17 = OpVariable %16 Uniform
71         %18 = OpTypeInt 32 1
72         %19 = OpConstant %18 0
73         %20 = OpTypePointer Uniform %7
74         %24 = OpTypeVector %18 2
75         %25 = OpTypePointer Function %24
76         %27 = OpTypeInt 32 0
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
83         %50 = OpTypeBool
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
105          %5 = OpLabel
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
115         %13 = OpLoad %10 %12
116         %14 = OpVectorShuffle %7 %13 %13 0 1
117         %21 = OpAccessChain %20 %17 %19
118         %22 = OpLoad %7 %21
119         %23 = OpFDiv %7 %14 %22
120               OpStore %9 %23
121         %30 = OpAccessChain %29 %9 %28
122         %31 = OpLoad %6 %30
123         %33 = OpFMul %6 %31 %32
124         %34 = OpConvertFToS %18 %33
125         %36 = OpAccessChain %29 %9 %35
126         %37 = OpLoad %6 %36
127         %38 = OpFMul %6 %37 %32
128         %39 = OpConvertFToS %18 %38
129         %40 = OpCompositeConstruct %24 %34 %39
130               OpStore %26 %40
131               OpStore %42 %19
132               OpBranch %43
133         %43 = OpLabel
134               OpLoopMerge %45 %46 None
135               OpBranch %47
136         %47 = OpLabel
137         %48 = OpLoad %18 %42
138         %51 = OpSLessThan %50 %48 %49
139               OpBranchConditional %51 %44 %45
140         %44 = OpLabel
141         %56 = OpLoad %18 %42
142         %58 = OpAccessChain %57 %55 %56
143               OpStore %58 %19
144               OpBranch %46
145         %46 = OpLabel
146         %59 = OpLoad %18 %42
147         %61 = OpIAdd %18 %59 %60
148               OpStore %42 %61
149               OpBranch %43
150         %45 = OpLabel
151               OpStore %62 %63
152               OpStore %65 %66
153               OpStore %67 %19
154               OpBranch %68
155         %68 = OpLabel
156               OpLoopMerge %70 %71 None
157               OpBranch %69
158         %69 = OpLabel
159         %72 = OpLoad %18 %67
160         %73 = OpIAdd %18 %72 %60
161               OpStore %67 %73
162               OpStore %74 %19
163         %75 = OpAccessChain %41 %62 %28
164         %76 = OpLoad %18 %75
165         %77 = OpSGreaterThan %50 %76 %19
166               OpSelectionMerge %79 None
167               OpBranchConditional %77 %78 %79
168         %78 = OpLabel
169         %80 = OpAccessChain %41 %62 %28
170         %81 = OpLoad %18 %80
171         %83 = OpISub %18 %81 %82
172         %84 = OpAccessChain %41 %62 %35
173         %85 = OpLoad %18 %84
174         %87 = OpIMul %18 %85 %86
175         %88 = OpIAdd %18 %83 %87
176         %89 = OpAccessChain %57 %55 %88
177         %90 = OpLoad %18 %89
178         %91 = OpIEqual %50 %90 %19
179               OpBranch %79
180         %79 = OpLabel
181         %92 = OpPhi %50 %77 %69 %91 %78
182               OpSelectionMerge %94 None
183               OpBranchConditional %92 %93 %94
184         %93 = OpLabel
185         %95 = OpLoad %18 %74
186         %96 = OpIAdd %18 %95 %60
187               OpStore %74 %96
188               OpBranch %94
189         %94 = OpLabel
190         %97 = OpAccessChain %41 %62 %35
191         %98 = OpLoad %18 %97
192         %99 = OpSGreaterThan %50 %98 %19
193               OpSelectionMerge %101 None
194               OpBranchConditional %99 %100 %101
195        %100 = OpLabel
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
206               OpBranch %101
207        %101 = OpLabel
208        %112 = OpPhi %50 %99 %94 %111 %100
209               OpSelectionMerge %114 None
210               OpBranchConditional %112 %113 %114
211        %113 = OpLabel
212        %115 = OpLoad %18 %74
213        %116 = OpIAdd %18 %115 %60
214               OpStore %74 %116
215               OpBranch %114
216        %114 = OpLabel
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
222        %121 = OpLabel
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
233               OpBranch %122
234        %122 = OpLabel
235        %133 = OpPhi %50 %120 %114 %132 %121
236               OpSelectionMerge %135 None
237               OpBranchConditional %133 %134 %135
238        %134 = OpLabel
239        %136 = OpLoad %18 %74
240        %137 = OpIAdd %18 %136 %60
241               OpStore %74 %137
242               OpBranch %135
243        %135 = OpLabel
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
249        %141 = OpLabel
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
260               OpBranch %142
261        %142 = OpLabel
262        %153 = OpPhi %50 %140 %135 %152 %141
263               OpSelectionMerge %155 None
264               OpBranchConditional %153 %154 %155
265        %154 = OpLabel
266        %156 = OpLoad %18 %74
267        %157 = OpIAdd %18 %156 %60
268               OpStore %74 %157
269               OpBranch %155
270        %155 = OpLabel
271        %158 = OpLoad %18 %74
272        %159 = OpIEqual %50 %158 %19
273               OpSelectionMerge %161 None
274               OpBranchConditional %159 %160 %207
275        %160 = OpLabel
276               OpStore %65 %162
277               OpStore %42 %19
278               OpBranch %163
279        %163 = OpLabel
280               OpLoopMerge %165 %166 None
281               OpBranch %167
282        %167 = OpLabel
283        %168 = OpLoad %18 %42
284        %170 = OpSLessThan %50 %168 %169
285               OpBranchConditional %170 %164 %165
286        %164 = OpLabel
287               OpStore %171 %19
288               OpBranch %172
289        %172 = OpLabel
290               OpLoopMerge %174 %175 None
291               OpBranch %176
292        %176 = OpLabel
293        %177 = OpLoad %18 %171
294        %178 = OpSLessThan %50 %177 %169
295               OpBranchConditional %178 %173 %174
296        %173 = OpLabel
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
308        %188 = OpLabel
309        %190 = OpLoad %18 %171
310        %191 = OpIMul %18 %190 %82
311        %192 = OpAccessChain %41 %62 %28
312               OpStore %192 %191
313        %193 = OpLoad %18 %42
314        %194 = OpIMul %18 %193 %82
315        %195 = OpAccessChain %41 %62 %35
316               OpStore %195 %194
317               OpStore %65 %66
318               OpBranch %189
319        %189 = OpLabel
320               OpBranch %175
321        %175 = OpLabel
322        %196 = OpLoad %18 %171
323        %197 = OpIAdd %18 %196 %60
324               OpStore %171 %197
325               OpBranch %172
326        %174 = OpLabel
327               OpBranch %166
328        %166 = OpLabel
329        %198 = OpLoad %18 %42
330        %199 = OpIAdd %18 %198 %60
331               OpStore %42 %199
332               OpBranch %163
333        %165 = OpLabel
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
341               OpStore %206 %60
342               OpBranch %161
343        %207 = OpLabel
344        %209 = OpLoad %18 %67
345        %210 = OpLoad %18 %74
346        %211 = OpSMod %18 %209 %210
347               OpStore %208 %211
348        %212 = OpLoad %18 %74
349        %213 = OpLoad %18 %67
350        %214 = OpIAdd %18 %213 %212
351               OpStore %67 %214
352        %215 = OpLoad %18 %208
353        %216 = OpSGreaterThanEqual %50 %215 %19
354               OpSelectionMerge %218 None
355               OpBranchConditional %216 %217 %218
356        %217 = OpLabel
357        %219 = OpAccessChain %41 %62 %28
358        %220 = OpLoad %18 %219
359        %221 = OpSGreaterThan %50 %220 %19
360               OpBranch %218
361        %218 = OpLabel
362        %222 = OpPhi %50 %216 %207 %221 %217
363               OpSelectionMerge %224 None
364               OpBranchConditional %222 %223 %224
365        %223 = OpLabel
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
376               OpBranch %224
377        %224 = OpLabel
378        %235 = OpPhi %50 %222 %218 %234 %223
379               OpSelectionMerge %237 None
380               OpBranchConditional %235 %236 %237
381        %236 = OpLabel
382        %238 = OpLoad %18 %208
383        %239 = OpISub %18 %238 %60
384               OpStore %208 %239
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
392               OpStore %246 %60
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
401               OpStore %254 %60
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
410               OpStore %262 %60
411        %263 = OpAccessChain %41 %62 %28
412        %264 = OpLoad %18 %263
413        %265 = OpISub %18 %264 %82
414        %266 = OpAccessChain %41 %62 %28
415               OpStore %266 %265
416               OpBranch %237
417        %237 = OpLabel
418        %267 = OpLoad %18 %208
419        %268 = OpSGreaterThanEqual %50 %267 %19
420               OpSelectionMerge %270 None
421               OpBranchConditional %268 %269 %270
422        %269 = OpLabel
423        %271 = OpAccessChain %41 %62 %35
424        %272 = OpLoad %18 %271
425        %273 = OpSGreaterThan %50 %272 %19
426               OpBranch %270
427        %270 = OpLabel
428        %274 = OpPhi %50 %268 %237 %273 %269
429               OpSelectionMerge %276 None
430               OpBranchConditional %274 %275 %276
431        %275 = OpLabel
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
442               OpBranch %276
443        %276 = OpLabel
444        %287 = OpPhi %50 %274 %270 %286 %275
445               OpSelectionMerge %289 None
446               OpBranchConditional %287 %288 %289
447        %288 = OpLabel
448        %290 = OpLoad %18 %208
449        %291 = OpISub %18 %290 %60
450               OpStore %208 %291
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
458               OpStore %298 %60
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
467               OpStore %306 %60
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
476               OpStore %314 %60
477        %315 = OpAccessChain %41 %62 %35
478        %316 = OpLoad %18 %315
479        %317 = OpISub %18 %316 %82
480        %318 = OpAccessChain %41 %62 %35
481               OpStore %318 %317
482               OpBranch %289
483        %289 = OpLabel
484        %319 = OpLoad %18 %208
485        %320 = OpSGreaterThanEqual %50 %319 %19
486               OpSelectionMerge %322 None
487               OpBranchConditional %320 %321 %322
488        %321 = OpLabel
489        %323 = OpAccessChain %41 %62 %28
490        %324 = OpLoad %18 %323
491        %325 = OpSLessThan %50 %324 %119
492               OpBranch %322
493        %322 = OpLabel
494        %326 = OpPhi %50 %320 %289 %325 %321
495               OpSelectionMerge %328 None
496               OpBranchConditional %326 %327 %328
497        %327 = OpLabel
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
508               OpBranch %328
509        %328 = OpLabel
510        %339 = OpPhi %50 %326 %322 %338 %327
511               OpSelectionMerge %341 None
512               OpBranchConditional %339 %340 %341
513        %340 = OpLabel
514        %342 = OpLoad %18 %208
515        %343 = OpISub %18 %342 %60
516               OpStore %208 %343
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
524               OpStore %350 %60
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
533               OpStore %358 %60
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
542               OpStore %366 %60
543        %367 = OpAccessChain %41 %62 %28
544        %368 = OpLoad %18 %367
545        %369 = OpIAdd %18 %368 %82
546        %370 = OpAccessChain %41 %62 %28
547               OpStore %370 %369
548               OpBranch %341
549        %341 = OpLabel
550        %371 = OpLoad %18 %208
551        %372 = OpSGreaterThanEqual %50 %371 %19
552               OpSelectionMerge %374 None
553               OpBranchConditional %372 %373 %374
554        %373 = OpLabel
555        %375 = OpAccessChain %41 %62 %35
556        %376 = OpLoad %18 %375
557        %377 = OpSLessThan %50 %376 %119
558               OpBranch %374
559        %374 = OpLabel
560        %378 = OpPhi %50 %372 %341 %377 %373
561               OpSelectionMerge %380 None
562               OpBranchConditional %378 %379 %380
563        %379 = OpLabel
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
574               OpBranch %380
575        %380 = OpLabel
576        %391 = OpPhi %50 %378 %374 %390 %379
577               OpSelectionMerge %393 None
578               OpBranchConditional %391 %392 %393
579        %392 = OpLabel
580        %394 = OpLoad %18 %208
581        %395 = OpISub %18 %394 %60
582               OpStore %208 %395
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
590               OpStore %402 %60
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
599               OpStore %410 %60
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
608               OpStore %418 %60
609        %419 = OpAccessChain %41 %62 %35
610        %420 = OpLoad %18 %419
611        %421 = OpIAdd %18 %420 %82
612        %422 = OpAccessChain %41 %62 %35
613               OpStore %422 %421
614               OpBranch %393
615        %393 = OpLabel
616               OpBranch %161
617        %161 = OpLabel
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
629        %432 = OpLabel
630               OpStore %435 %437
631               OpReturn
632        %433 = OpLabel
633               OpBranch %71
634         %71 = OpLabel
635        %439 = OpLoad %50 %65
636               OpBranchConditional %439 %68 %70
637         %70 = OpLabel
638               OpStore %435 %441
639               OpReturn
640               OpFunctionEnd
641END
642
643# uniforms for reference
644
645# resolution
646BUFFER reference_resolution DATA_TYPE vec2<float> DATA
647 256.0 256.0
648END
649
650BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
651
652PIPELINE graphics reference_pipeline
653  ATTACH reference_vertex_shader
654  ATTACH reference_fragment_shader
655  FRAMEBUFFER_SIZE 256 256
656  BIND BUFFER reference_framebuffer AS color LOCATION 0
657  BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
658END
659CLEAR_COLOR reference_pipeline 0 0 0 255
660
661CLEAR reference_pipeline
662RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
663
664
665SHADER vertex variant_vertex_shader PASSTHROUGH
666
667SHADER fragment variant_fragment_shader SPIRV-ASM
668; SPIR-V
669; Version: 1.0
670; Generator: Khronos Glslang Reference Front End; 7
671; Bound: 978
672; Schema: 0
673               OpCapability Shader
674          %1 = OpExtInstImport "GLSL.std.450"
675               OpMemoryModel Logical GLSL450
676               OpEntryPoint Fragment %4 "main" %12 %435
677               OpExecutionMode %4 OriginUpperLeft
678               OpSource ESSL 320
679               OpName %4 "main"
680               OpName %9 "pos"
681               OpName %12 "gl_FragCoord"
682               OpName %15 "buf0"
683               OpMemberName %15 0 "resolution"
684               OpName %17 ""
685               OpName %26 "ipos"
686               OpName %42 "i"
687               OpName %55 "map"
688               OpName %62 "p"
689               OpName %65 "canwalk"
690               OpName %67 "v"
691               OpName %74 "directions"
692               OpName %171 "j"
693               OpName %208 "d"
694               OpName %435 "_GLF_color"
695               OpDecorate %12 BuiltIn FragCoord
696               OpMemberDecorate %15 0 Offset 0
697               OpDecorate %15 Block
698               OpDecorate %17 DescriptorSet 0
699               OpDecorate %17 Binding 0
700               OpDecorate %435 Location 0
701          %2 = OpTypeVoid
702          %3 = OpTypeFunction %2
703          %6 = OpTypeFloat 32
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
712         %18 = OpTypeInt 32 1
713         %19 = OpConstant %18 0
714         %20 = OpTypePointer Uniform %7
715         %24 = OpTypeVector %18 2
716         %25 = OpTypePointer Function %24
717         %27 = OpTypeInt 32 0
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
724         %50 = OpTypeBool
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
746          %5 = OpLabel
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
756         %13 = OpLoad %10 %12
757         %14 = OpVectorShuffle %7 %13 %13 0 1
758         %21 = OpAccessChain %20 %17 %19
759         %22 = OpLoad %7 %21
760         %23 = OpFDiv %7 %14 %22
761               OpStore %9 %23
762         %30 = OpAccessChain %29 %9 %28
763         %31 = OpLoad %6 %30
764         %33 = OpFMul %6 %31 %32
765         %34 = OpConvertFToS %18 %33
766         %36 = OpAccessChain %29 %9 %35
767         %37 = OpLoad %6 %36
768         %38 = OpFMul %6 %37 %32
769         %39 = OpConvertFToS %18 %38
770         %40 = OpCompositeConstruct %24 %34 %39
771               OpStore %26 %40
772               OpStore %42 %19
773               OpBranch %43
774         %43 = OpLabel
775               OpLoopMerge %45 %46 None
776               OpBranch %47
777         %47 = OpLabel
778         %48 = OpLoad %18 %42
779         %51 = OpSLessThan %50 %48 %49
780               OpBranchConditional %51 %44 %45
781         %44 = OpLabel
782         %56 = OpLoad %18 %42
783         %58 = OpAccessChain %57 %55 %56
784               OpStore %58 %19
785               OpBranch %46
786         %46 = OpLabel
787         %59 = OpLoad %18 %42
788         %61 = OpIAdd %18 %59 %60
789               OpStore %42 %61
790               OpBranch %43
791         %45 = OpLabel
792               OpStore %62 %63
793               OpStore %65 %66
794               OpStore %67 %19
795               OpBranch %68
796         %68 = OpLabel
797               OpLoopMerge %70 %71 None
798               OpBranch %69
799         %69 = OpLabel
800         %72 = OpLoad %18 %67
801         %73 = OpIAdd %18 %72 %60
802               OpStore %67 %73
803               OpStore %74 %19
804         %75 = OpAccessChain %41 %62 %28
805         %76 = OpLoad %18 %75
806         %77 = OpSGreaterThan %50 %76 %19
807               OpSelectionMerge %79 None
808               OpBranchConditional %77 %78 %79
809         %78 = OpLabel
810         %80 = OpAccessChain %41 %62 %28
811         %81 = OpLoad %18 %80
812         %83 = OpISub %18 %81 %82
813         %84 = OpAccessChain %41 %62 %35
814         %85 = OpLoad %18 %84
815         %87 = OpIMul %18 %85 %86
816         %88 = OpIAdd %18 %83 %87
817         %89 = OpAccessChain %57 %55 %88
818         %90 = OpLoad %18 %89
819         %91 = OpIEqual %50 %90 %19
820               OpBranch %79
821         %79 = OpLabel
822         %92 = OpPhi %50 %77 %69 %91 %78
823               OpSelectionMerge %94 None
824               OpBranchConditional %92 %93 %94
825         %93 = OpLabel
826         %95 = OpLoad %18 %74
827         %96 = OpIAdd %18 %95 %60
828               OpStore %74 %96
829               OpBranch %94
830         %94 = OpLabel
831         %97 = OpAccessChain %41 %62 %35
832         %98 = OpLoad %18 %97
833         %99 = OpSGreaterThan %50 %98 %19
834               OpSelectionMerge %101 None
835               OpBranchConditional %99 %100 %101
836        %100 = OpLabel
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
847               OpBranch %101
848        %101 = OpLabel
849        %112 = OpPhi %50 %99 %94 %111 %100
850               OpSelectionMerge %114 None
851               OpBranchConditional %112 %113 %114
852        %113 = OpLabel
853        %115 = OpLoad %18 %74
854        %116 = OpIAdd %18 %115 %60
855               OpStore %74 %116
856               OpBranch %114
857        %114 = OpLabel
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
863        %121 = OpLabel
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
874               OpBranch %122
875        %122 = OpLabel
876        %133 = OpPhi %50 %120 %114 %132 %121
877               OpSelectionMerge %135 None
878               OpBranchConditional %133 %134 %135
879        %134 = OpLabel
880        %136 = OpLoad %18 %74
881        %137 = OpIAdd %18 %136 %60
882               OpStore %74 %137
883               OpBranch %135
884        %135 = OpLabel
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
890        %141 = OpLabel
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
901               OpBranch %142
902        %142 = OpLabel
903        %153 = OpPhi %50 %140 %135 %152 %141
904               OpSelectionMerge %155 None
905               OpBranchConditional %153 %154 %155
906        %154 = OpLabel
907        %156 = OpLoad %18 %74
908        %157 = OpIAdd %18 %156 %60
909               OpStore %74 %157
910               OpBranch %155
911        %155 = OpLabel
912        %158 = OpLoad %18 %74
913        %159 = OpIEqual %50 %158 %19
914               OpSelectionMerge %161 None
915               OpBranchConditional %159 %160 %207
916        %160 = OpLabel
917               OpStore %65 %162
918               OpStore %42 %19
919               OpBranch %163
920        %163 = OpLabel
921               OpLoopMerge %165 %166 None
922               OpBranch %167
923        %167 = OpLabel
924        %168 = OpLoad %18 %42
925        %170 = OpSLessThan %50 %168 %169
926               OpBranchConditional %170 %164 %165
927        %164 = OpLabel
928               OpStore %171 %19
929               OpBranch %172
930        %172 = OpLabel
931               OpLoopMerge %174 %175 None
932               OpBranch %176
933        %176 = OpLabel
934        %177 = OpLoad %18 %171
935        %178 = OpSLessThan %50 %177 %169
936               OpBranchConditional %178 %173 %174
937        %173 = OpLabel
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
949        %188 = OpLabel
950        %190 = OpLoad %18 %171
951        %191 = OpIMul %18 %190 %82
952        %192 = OpAccessChain %41 %62 %28
953               OpStore %192 %191
954        %193 = OpLoad %18 %42
955        %194 = OpIMul %18 %193 %82
956        %195 = OpAccessChain %41 %62 %35
957               OpStore %195 %194
958               OpStore %65 %66
959               OpBranch %189
960        %189 = OpLabel
961               OpBranch %175
962        %175 = OpLabel
963        %196 = OpLoad %18 %171
964        %197 = OpIAdd %18 %196 %60
965               OpStore %171 %197
966               OpBranch %172
967        %174 = OpLabel
968               OpBranch %166
969        %166 = OpLabel
970        %198 = OpLoad %18 %42
971        %199 = OpIAdd %18 %198 %60
972               OpStore %42 %199
973               OpBranch %163
974        %165 = OpLabel
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
982               OpStore %206 %60
983               OpBranch %161
984        %207 = OpLabel
985        %209 = OpLoad %18 %67
986        %210 = OpLoad %18 %74
987        %211 = OpSMod %18 %209 %210
988               OpStore %208 %211
989        %212 = OpLoad %18 %74
990        %213 = OpLoad %18 %67
991        %214 = OpIAdd %18 %213 %212
992               OpStore %67 %214
993        %215 = OpLoad %18 %208
994        %216 = OpSGreaterThanEqual %50 %215 %19
995               OpSelectionMerge %218 None
996               OpBranchConditional %216 %217 %218
997        %217 = OpLabel
998        %219 = OpAccessChain %41 %62 %28
999        %220 = OpLoad %18 %219
1000        %221 = OpSGreaterThan %50 %220 %19
1001               OpBranch %218
1002        %218 = OpLabel
1003        %222 = OpPhi %50 %216 %207 %221 %217
1004               OpSelectionMerge %224 None
1005               OpBranchConditional %222 %223 %224
1006        %223 = OpLabel
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
1017               OpBranch %224
1018        %224 = OpLabel
1019        %235 = OpPhi %50 %222 %218 %234 %223
1020               OpSelectionMerge %237 None
1021               OpBranchConditional %235 %236 %237
1022        %236 = OpLabel
1023        %238 = OpLoad %18 %208
1024        %239 = OpISub %18 %238 %60
1025               OpStore %208 %239
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
1033               OpStore %246 %60
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
1042               OpStore %254 %60
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
1051               OpStore %262 %60
1052        %263 = OpAccessChain %41 %62 %28
1053        %264 = OpLoad %18 %263
1054        %265 = OpISub %18 %264 %82
1055        %266 = OpAccessChain %41 %62 %28
1056               OpStore %266 %265
1057               OpBranch %237
1058        %237 = OpLabel
1059        %267 = OpLoad %18 %208
1060        %268 = OpSGreaterThanEqual %50 %267 %19
1061               OpSelectionMerge %270 None
1062               OpBranchConditional %268 %269 %270
1063        %269 = OpLabel
1064        %271 = OpAccessChain %41 %62 %35
1065        %272 = OpLoad %18 %271
1066        %273 = OpSGreaterThan %50 %272 %19
1067               OpBranch %270
1068        %270 = OpLabel
1069        %274 = OpPhi %50 %268 %237 %273 %269
1070               OpSelectionMerge %276 None
1071               OpBranchConditional %274 %275 %276
1072        %275 = OpLabel
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
1083               OpBranch %276
1084        %276 = OpLabel
1085        %287 = OpPhi %50 %274 %270 %286 %275
1086               OpSelectionMerge %289 None
1087               OpBranchConditional %287 %288 %289
1088        %288 = OpLabel
1089        %290 = OpLoad %18 %208
1090        %291 = OpISub %18 %290 %60
1091               OpStore %208 %291
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
1099               OpStore %298 %60
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
1108               OpStore %306 %60
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
1117               OpStore %314 %60
1118        %315 = OpAccessChain %41 %62 %35
1119        %316 = OpLoad %18 %315
1120        %317 = OpISub %18 %316 %82
1121        %318 = OpAccessChain %41 %62 %35
1122               OpStore %318 %317
1123               OpBranch %289
1124        %289 = OpLabel
1125        %319 = OpLoad %18 %208
1126        %320 = OpSGreaterThanEqual %50 %319 %19
1127               OpSelectionMerge %322 None
1128               OpBranchConditional %320 %321 %322
1129        %321 = OpLabel
1130        %323 = OpAccessChain %41 %62 %28
1131        %324 = OpLoad %18 %323
1132        %325 = OpSLessThan %50 %324 %119
1133               OpBranch %322
1134        %322 = OpLabel
1135        %326 = OpPhi %50 %320 %289 %325 %321
1136               OpSelectionMerge %328 None
1137               OpBranchConditional %326 %327 %328
1138        %327 = OpLabel
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
1149               OpBranch %328
1150        %328 = OpLabel
1151        %339 = OpPhi %50 %326 %322 %338 %327
1152               OpSelectionMerge %341 None
1153               OpBranchConditional %339 %340 %341
1154        %340 = OpLabel
1155        %342 = OpLoad %18 %208
1156        %343 = OpISub %18 %342 %60
1157               OpStore %208 %343
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
1165               OpStore %350 %60
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
1174               OpStore %358 %60
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
1183               OpStore %366 %60
1184        %367 = OpAccessChain %41 %62 %28
1185        %368 = OpLoad %18 %367
1186        %369 = OpIAdd %18 %368 %82
1187        %370 = OpAccessChain %41 %62 %28
1188               OpStore %370 %369
1189               OpBranch %341
1190        %341 = OpLabel
1191        %371 = OpLoad %18 %208
1192        %372 = OpSGreaterThanEqual %50 %371 %19
1193               OpSelectionMerge %374 None
1194               OpBranchConditional %372 %373 %374
1195        %373 = OpLabel
1196        %375 = OpAccessChain %41 %62 %35
1197        %376 = OpLoad %18 %375
1198        %377 = OpSLessThan %50 %376 %119
1199               OpBranch %374
1200        %374 = OpLabel
1201        %378 = OpPhi %50 %372 %341 %377 %373
1202               OpSelectionMerge %380 None
1203               OpBranchConditional %378 %379 %380
1204        %379 = OpLabel
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
1215               OpBranch %380
1216        %380 = OpLabel
1217        %391 = OpPhi %50 %378 %374 %390 %379
1218               OpSelectionMerge %393 None
1219               OpBranchConditional %391 %392 %393
1220        %392 = OpLabel
1221        %394 = OpLoad %18 %208
1222        %395 = OpISub %18 %394 %60
1223               OpStore %208 %395
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
1231               OpStore %402 %60
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
1240               OpStore %410 %60
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
1249               OpStore %418 %60
1250        %419 = OpAccessChain %41 %62 %35
1251        %420 = OpLoad %18 %419
1252        %421 = OpIAdd %18 %420 %82
1253        %422 = OpAccessChain %41 %62 %35
1254               OpStore %422 %421
1255               OpBranch %393
1256        %393 = OpLabel
1257               OpBranch %161
1258        %161 = OpLabel
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
1270        %432 = OpLabel
1271               OpStore %435 %437
1272               OpReturn
1273        %433 = OpLabel
1274               OpBranch %71
1275         %71 = OpLabel
1276        %439 = OpLoad %50 %65
1277        %976 = OpCopyObject %41 %67
1278               OpBranchConditional %439 %68 %70
1279         %70 = OpLabel
1280        %728 = OpCopyObject %41 %171
1281        %977 = OpCopyObject %41 %976
1282               OpStore %435 %441
1283               OpReturn
1284               OpFunctionEnd
1285END
1286
1287# uniforms for variant
1288
1289# resolution
1290BUFFER variant_resolution DATA_TYPE vec2<float> DATA
1291 256.0 256.0
1292END
1293
1294BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
1295
1296PIPELINE graphics variant_pipeline
1297  ATTACH variant_vertex_shader
1298  ATTACH variant_fragment_shader
1299  FRAMEBUFFER_SIZE 256 256
1300  BIND BUFFER variant_framebuffer AS color LOCATION 0
1301  BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
1302END
1303CLEAR_COLOR variant_pipeline 0 0 0 255
1304
1305CLEAR variant_pipeline
1306RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
1307
1308EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
1309