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 with a dead break and an Unroll annotation
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: 761
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        %551 = OpTypeMatrix %10 2
746        %555 = OpTypePointer Private %551
747        %556 = OpConstantComposite %10 %440 %440 %440 %440
748        %557 = OpConstantComposite %551 %556 %556
749        %558 = OpVariable %555 Private %557
750        %760 = OpConstantNull %50
751          %4 = OpFunction %2 None %3
752          %5 = OpLabel
753          %9 = OpVariable %8 Function
754         %26 = OpVariable %25 Function
755         %42 = OpVariable %41 Function
756         %62 = OpVariable %25 Function
757         %65 = OpVariable %64 Function
758         %67 = OpVariable %41 Function
759         %74 = OpVariable %41 Function
760        %171 = OpVariable %41 Function
761        %208 = OpVariable %41 Function
762         %13 = OpLoad %10 %12
763         %14 = OpVectorShuffle %7 %13 %13 0 1
764        %564 = OpISub %18 %49 %119
765         %21 = OpAccessChain %20 %17 %19
766         %22 = OpLoad %7 %21
767        %566 = OpSNegate %18 %564
768         %23 = OpFDiv %7 %14 %22
769               OpStore %9 %23
770         %30 = OpAccessChain %29 %9 %28
771         %31 = OpLoad %6 %30
772         %33 = OpFMul %6 %31 %32
773         %34 = OpConvertFToS %18 %33
774         %36 = OpAccessChain %29 %9 %35
775         %37 = OpLoad %6 %36
776         %38 = OpFMul %6 %37 %32
777         %39 = OpConvertFToS %18 %38
778         %40 = OpCompositeConstruct %24 %34 %39
779               OpStore %26 %40
780               OpStore %42 %19
781               OpBranch %43
782         %43 = OpLabel
783               OpLoopMerge %45 %46 None
784               OpBranch %47
785         %47 = OpLabel
786         %48 = OpLoad %18 %42
787         %51 = OpSLessThan %50 %48 %49
788               OpBranchConditional %51 %44 %45
789         %44 = OpLabel
790         %56 = OpLoad %18 %42
791         %58 = OpAccessChain %57 %55 %56
792               OpStore %58 %19
793               OpBranch %46
794         %46 = OpLabel
795         %59 = OpLoad %18 %42
796         %61 = OpIAdd %18 %59 %60
797               OpStore %42 %61
798               OpBranch %43
799         %45 = OpLabel
800               OpStore %62 %63
801               OpStore %65 %66
802               OpStore %67 %19
803               OpBranch %68
804         %68 = OpLabel
805               OpLoopMerge %70 %71 None
806               OpBranch %69
807         %69 = OpLabel
808         %72 = OpLoad %18 %67
809         %73 = OpIAdd %18 %72 %60
810               OpStore %67 %73
811               OpStore %74 %19
812         %75 = OpAccessChain %41 %62 %28
813         %76 = OpLoad %18 %75
814         %77 = OpSGreaterThan %50 %76 %19
815               OpSelectionMerge %79 None
816               OpBranchConditional %77 %78 %79
817         %78 = OpLabel
818         %80 = OpAccessChain %41 %62 %28
819         %81 = OpLoad %18 %80
820         %83 = OpISub %18 %81 %82
821         %84 = OpAccessChain %41 %62 %35
822         %85 = OpLoad %18 %84
823         %87 = OpIMul %18 %85 %86
824         %88 = OpIAdd %18 %83 %87
825         %89 = OpAccessChain %57 %55 %88
826         %90 = OpLoad %18 %89
827         %91 = OpIEqual %50 %90 %19
828               OpBranch %79
829         %79 = OpLabel
830         %92 = OpPhi %50 %77 %69 %91 %78
831               OpSelectionMerge %94 None
832               OpBranchConditional %92 %93 %94
833         %93 = OpLabel
834         %95 = OpLoad %18 %74
835         %96 = OpIAdd %18 %95 %60
836               OpStore %74 %96
837               OpBranch %94
838         %94 = OpLabel
839         %97 = OpAccessChain %41 %62 %35
840         %98 = OpLoad %18 %97
841         %99 = OpSGreaterThan %50 %98 %19
842               OpSelectionMerge %101 None
843               OpBranchConditional %99 %100 %101
844        %100 = OpLabel
845        %102 = OpAccessChain %41 %62 %28
846        %103 = OpLoad %18 %102
847        %104 = OpAccessChain %41 %62 %35
848        %105 = OpLoad %18 %104
849        %106 = OpISub %18 %105 %82
850        %107 = OpIMul %18 %106 %86
851        %108 = OpIAdd %18 %103 %107
852        %109 = OpAccessChain %57 %55 %108
853        %110 = OpLoad %18 %109
854        %111 = OpIEqual %50 %110 %19
855               OpBranch %101
856        %101 = OpLabel
857        %112 = OpPhi %50 %99 %94 %111 %100
858               OpSelectionMerge %114 None
859               OpBranchConditional %112 %113 %114
860        %113 = OpLabel
861        %115 = OpLoad %18 %74
862        %116 = OpIAdd %18 %115 %60
863               OpStore %74 %116
864               OpBranch %114
865        %114 = OpLabel
866        %117 = OpAccessChain %41 %62 %28
867        %118 = OpLoad %18 %117
868        %120 = OpSLessThan %50 %118 %119
869               OpSelectionMerge %122 None
870               OpBranchConditional %120 %121 %122
871        %121 = OpLabel
872        %123 = OpAccessChain %41 %62 %28
873        %124 = OpLoad %18 %123
874        %125 = OpIAdd %18 %124 %82
875        %126 = OpAccessChain %41 %62 %35
876        %127 = OpLoad %18 %126
877        %128 = OpIMul %18 %127 %86
878        %129 = OpIAdd %18 %125 %128
879        %130 = OpAccessChain %57 %55 %129
880        %131 = OpLoad %18 %130
881        %132 = OpIEqual %50 %131 %19
882               OpBranch %122
883        %122 = OpLabel
884        %133 = OpPhi %50 %120 %114 %132 %121
885               OpSelectionMerge %135 None
886               OpBranchConditional %133 %134 %135
887        %134 = OpLabel
888        %136 = OpLoad %18 %74
889        %137 = OpIAdd %18 %136 %60
890               OpStore %74 %137
891               OpBranch %135
892        %135 = OpLabel
893        %594 = OpISub %18 %49 %566
894        %138 = OpAccessChain %41 %62 %35
895        %139 = OpLoad %18 %138
896        %140 = OpSLessThan %50 %139 %119
897               OpSelectionMerge %142 None
898               OpBranchConditional %140 %141 %142
899        %141 = OpLabel
900        %143 = OpAccessChain %41 %62 %28
901        %144 = OpLoad %18 %143
902        %145 = OpAccessChain %41 %62 %35
903        %146 = OpLoad %18 %145
904        %147 = OpIAdd %18 %146 %82
905        %148 = OpIMul %18 %147 %86
906        %149 = OpIAdd %18 %144 %148
907        %150 = OpAccessChain %57 %55 %149
908        %151 = OpLoad %18 %150
909        %152 = OpIEqual %50 %151 %19
910               OpBranch %142
911        %142 = OpLabel
912        %153 = OpPhi %50 %140 %135 %152 %141
913               OpSelectionMerge %155 None
914               OpBranchConditional %153 %154 %155
915        %154 = OpLabel
916        %156 = OpLoad %18 %74
917        %157 = OpIAdd %18 %156 %60
918               OpStore %74 %157
919               OpBranch %155
920        %155 = OpLabel
921        %158 = OpLoad %18 %74
922        %159 = OpIEqual %50 %158 %19
923               OpSelectionMerge %161 None
924               OpBranchConditional %159 %160 %207
925        %160 = OpLabel
926               OpStore %65 %162
927               OpStore %42 %19
928               OpBranch %163
929        %163 = OpLabel
930               OpLoopMerge %165 %166 None
931               OpBranch %167
932        %167 = OpLabel
933        %168 = OpLoad %18 %42
934        %170 = OpSLessThan %50 %168 %169
935               OpBranchConditional %170 %164 %165
936        %164 = OpLabel
937               OpStore %171 %19
938        %609 = OpISub %18 %594 %168
939               OpStore %558 %557
940               OpBranchConditional %760 %166 %172
941        %172 = OpLabel
942               OpLoopMerge %174 %175 Unroll
943               OpBranch %176
944        %176 = OpLabel
945        %177 = OpLoad %18 %171
946        %178 = OpSLessThan %50 %177 %169
947               OpBranchConditional %178 %173 %174
948        %173 = OpLabel
949        %179 = OpLoad %18 %171
950        %180 = OpIMul %18 %179 %82
951        %181 = OpLoad %18 %42
952        %182 = OpIMul %18 %181 %82
953        %183 = OpIMul %18 %182 %86
954        %184 = OpIAdd %18 %180 %183
955        %185 = OpAccessChain %57 %55 %184
956        %186 = OpLoad %18 %185
957        %187 = OpIEqual %50 %186 %19
958               OpSelectionMerge %189 None
959               OpBranchConditional %187 %188 %189
960        %188 = OpLabel
961        %190 = OpLoad %18 %171
962        %191 = OpIMul %18 %190 %82
963        %192 = OpAccessChain %41 %62 %28
964               OpStore %192 %191
965        %193 = OpLoad %18 %42
966        %194 = OpIMul %18 %193 %82
967        %195 = OpAccessChain %41 %62 %35
968               OpStore %195 %194
969               OpStore %65 %66
970               OpBranch %189
971        %189 = OpLabel
972               OpBranch %175
973        %175 = OpLabel
974        %196 = OpLoad %18 %171
975        %197 = OpIAdd %18 %196 %60
976               OpStore %171 %197
977               OpBranch %172
978        %174 = OpLabel
979               OpBranch %166
980        %166 = OpLabel
981        %198 = OpLoad %18 %42
982        %199 = OpIAdd %18 %198 %60
983               OpStore %42 %199
984               OpBranch %163
985        %165 = OpLabel
986        %200 = OpAccessChain %41 %62 %28
987        %201 = OpLoad %18 %200
988        %202 = OpAccessChain %41 %62 %35
989        %203 = OpLoad %18 %202
990        %204 = OpIMul %18 %203 %86
991        %205 = OpIAdd %18 %201 %204
992        %206 = OpAccessChain %57 %55 %205
993               OpStore %206 %60
994               OpBranch %161
995        %207 = OpLabel
996        %209 = OpLoad %18 %67
997        %210 = OpLoad %18 %74
998        %211 = OpSMod %18 %209 %210
999               OpStore %208 %211
1000        %212 = OpLoad %18 %74
1001        %213 = OpLoad %18 %67
1002        %214 = OpIAdd %18 %213 %212
1003               OpStore %67 %214
1004        %215 = OpLoad %18 %208
1005        %216 = OpSGreaterThanEqual %50 %215 %19
1006               OpSelectionMerge %218 None
1007               OpBranchConditional %216 %217 %218
1008        %217 = OpLabel
1009        %219 = OpAccessChain %41 %62 %28
1010        %220 = OpLoad %18 %219
1011        %221 = OpSGreaterThan %50 %220 %19
1012               OpBranch %218
1013        %218 = OpLabel
1014        %222 = OpPhi %50 %216 %207 %221 %217
1015               OpSelectionMerge %224 None
1016               OpBranchConditional %222 %223 %224
1017        %223 = OpLabel
1018        %225 = OpAccessChain %41 %62 %28
1019        %226 = OpLoad %18 %225
1020        %227 = OpISub %18 %226 %82
1021        %228 = OpAccessChain %41 %62 %35
1022        %229 = OpLoad %18 %228
1023        %230 = OpIMul %18 %229 %86
1024        %231 = OpIAdd %18 %227 %230
1025        %232 = OpAccessChain %57 %55 %231
1026        %233 = OpLoad %18 %232
1027        %234 = OpIEqual %50 %233 %19
1028               OpBranch %224
1029        %224 = OpLabel
1030        %235 = OpPhi %50 %222 %218 %234 %223
1031               OpSelectionMerge %237 None
1032               OpBranchConditional %235 %236 %237
1033        %236 = OpLabel
1034        %238 = OpLoad %18 %208
1035        %239 = OpISub %18 %238 %60
1036               OpStore %208 %239
1037        %240 = OpAccessChain %41 %62 %28
1038        %241 = OpLoad %18 %240
1039        %242 = OpAccessChain %41 %62 %35
1040        %243 = OpLoad %18 %242
1041        %244 = OpIMul %18 %243 %86
1042        %245 = OpIAdd %18 %241 %244
1043        %246 = OpAccessChain %57 %55 %245
1044               OpStore %246 %60
1045        %247 = OpAccessChain %41 %62 %28
1046        %248 = OpLoad %18 %247
1047        %249 = OpISub %18 %248 %60
1048        %250 = OpAccessChain %41 %62 %35
1049        %251 = OpLoad %18 %250
1050        %252 = OpIMul %18 %251 %86
1051        %253 = OpIAdd %18 %249 %252
1052        %254 = OpAccessChain %57 %55 %253
1053               OpStore %254 %60
1054        %255 = OpAccessChain %41 %62 %28
1055        %256 = OpLoad %18 %255
1056        %257 = OpISub %18 %256 %82
1057        %258 = OpAccessChain %41 %62 %35
1058        %259 = OpLoad %18 %258
1059        %260 = OpIMul %18 %259 %86
1060        %261 = OpIAdd %18 %257 %260
1061        %262 = OpAccessChain %57 %55 %261
1062               OpStore %262 %60
1063        %263 = OpAccessChain %41 %62 %28
1064        %264 = OpLoad %18 %263
1065        %265 = OpISub %18 %264 %82
1066        %266 = OpAccessChain %41 %62 %28
1067               OpStore %266 %265
1068               OpBranch %237
1069        %237 = OpLabel
1070        %267 = OpLoad %18 %208
1071        %268 = OpSGreaterThanEqual %50 %267 %19
1072               OpSelectionMerge %270 None
1073               OpBranchConditional %268 %269 %270
1074        %269 = OpLabel
1075        %271 = OpAccessChain %41 %62 %35
1076        %272 = OpLoad %18 %271
1077        %273 = OpSGreaterThan %50 %272 %19
1078               OpBranch %270
1079        %270 = OpLabel
1080        %274 = OpPhi %50 %268 %237 %273 %269
1081               OpSelectionMerge %276 None
1082               OpBranchConditional %274 %275 %276
1083        %275 = OpLabel
1084        %277 = OpAccessChain %41 %62 %28
1085        %278 = OpLoad %18 %277
1086        %279 = OpAccessChain %41 %62 %35
1087        %280 = OpLoad %18 %279
1088        %281 = OpISub %18 %280 %82
1089        %282 = OpIMul %18 %281 %86
1090        %283 = OpIAdd %18 %278 %282
1091        %284 = OpAccessChain %57 %55 %283
1092        %285 = OpLoad %18 %284
1093        %286 = OpIEqual %50 %285 %19
1094               OpBranch %276
1095        %276 = OpLabel
1096        %287 = OpPhi %50 %274 %270 %286 %275
1097               OpSelectionMerge %289 None
1098               OpBranchConditional %287 %288 %289
1099        %288 = OpLabel
1100        %290 = OpLoad %18 %208
1101        %291 = OpISub %18 %290 %60
1102               OpStore %208 %291
1103        %292 = OpAccessChain %41 %62 %28
1104        %293 = OpLoad %18 %292
1105        %294 = OpAccessChain %41 %62 %35
1106        %295 = OpLoad %18 %294
1107        %296 = OpIMul %18 %295 %86
1108        %297 = OpIAdd %18 %293 %296
1109        %298 = OpAccessChain %57 %55 %297
1110               OpStore %298 %60
1111        %299 = OpAccessChain %41 %62 %28
1112        %300 = OpLoad %18 %299
1113        %301 = OpAccessChain %41 %62 %35
1114        %302 = OpLoad %18 %301
1115        %303 = OpISub %18 %302 %60
1116        %304 = OpIMul %18 %303 %86
1117        %305 = OpIAdd %18 %300 %304
1118        %306 = OpAccessChain %57 %55 %305
1119               OpStore %306 %60
1120        %307 = OpAccessChain %41 %62 %28
1121        %308 = OpLoad %18 %307
1122        %309 = OpAccessChain %41 %62 %35
1123        %310 = OpLoad %18 %309
1124        %311 = OpISub %18 %310 %82
1125        %312 = OpIMul %18 %311 %86
1126        %313 = OpIAdd %18 %308 %312
1127        %314 = OpAccessChain %57 %55 %313
1128               OpStore %314 %60
1129        %315 = OpAccessChain %41 %62 %35
1130        %316 = OpLoad %18 %315
1131        %317 = OpISub %18 %316 %82
1132        %318 = OpAccessChain %41 %62 %35
1133               OpStore %318 %317
1134               OpBranch %289
1135        %289 = OpLabel
1136        %319 = OpLoad %18 %208
1137        %320 = OpSGreaterThanEqual %50 %319 %19
1138               OpSelectionMerge %322 None
1139               OpBranchConditional %320 %321 %322
1140        %321 = OpLabel
1141        %323 = OpAccessChain %41 %62 %28
1142        %324 = OpLoad %18 %323
1143        %325 = OpSLessThan %50 %324 %119
1144               OpBranch %322
1145        %322 = OpLabel
1146        %326 = OpPhi %50 %320 %289 %325 %321
1147               OpSelectionMerge %328 None
1148               OpBranchConditional %326 %327 %328
1149        %327 = OpLabel
1150        %329 = OpAccessChain %41 %62 %28
1151        %330 = OpLoad %18 %329
1152        %331 = OpIAdd %18 %330 %82
1153        %332 = OpAccessChain %41 %62 %35
1154        %333 = OpLoad %18 %332
1155        %334 = OpIMul %18 %333 %86
1156        %335 = OpIAdd %18 %331 %334
1157        %336 = OpAccessChain %57 %55 %335
1158        %337 = OpLoad %18 %336
1159        %338 = OpIEqual %50 %337 %19
1160               OpBranch %328
1161        %328 = OpLabel
1162        %339 = OpPhi %50 %326 %322 %338 %327
1163               OpSelectionMerge %341 None
1164               OpBranchConditional %339 %340 %341
1165        %340 = OpLabel
1166        %342 = OpLoad %18 %208
1167        %343 = OpISub %18 %342 %60
1168               OpStore %208 %343
1169        %344 = OpAccessChain %41 %62 %28
1170        %345 = OpLoad %18 %344
1171        %346 = OpAccessChain %41 %62 %35
1172        %347 = OpLoad %18 %346
1173        %348 = OpIMul %18 %347 %86
1174        %349 = OpIAdd %18 %345 %348
1175        %350 = OpAccessChain %57 %55 %349
1176               OpStore %350 %60
1177        %351 = OpAccessChain %41 %62 %28
1178        %352 = OpLoad %18 %351
1179        %353 = OpIAdd %18 %352 %60
1180        %354 = OpAccessChain %41 %62 %35
1181        %355 = OpLoad %18 %354
1182        %356 = OpIMul %18 %355 %86
1183        %357 = OpIAdd %18 %353 %356
1184        %358 = OpAccessChain %57 %55 %357
1185               OpStore %358 %60
1186        %359 = OpAccessChain %41 %62 %28
1187        %360 = OpLoad %18 %359
1188        %361 = OpIAdd %18 %360 %82
1189        %362 = OpAccessChain %41 %62 %35
1190        %363 = OpLoad %18 %362
1191        %364 = OpIMul %18 %363 %86
1192        %365 = OpIAdd %18 %361 %364
1193        %366 = OpAccessChain %57 %55 %365
1194               OpStore %366 %60
1195        %367 = OpAccessChain %41 %62 %28
1196        %368 = OpLoad %18 %367
1197        %369 = OpIAdd %18 %368 %82
1198        %370 = OpAccessChain %41 %62 %28
1199               OpStore %370 %369
1200               OpBranch %341
1201        %341 = OpLabel
1202        %371 = OpLoad %18 %208
1203        %372 = OpSGreaterThanEqual %50 %371 %19
1204               OpSelectionMerge %374 None
1205               OpBranchConditional %372 %373 %374
1206        %373 = OpLabel
1207        %375 = OpAccessChain %41 %62 %35
1208        %376 = OpLoad %18 %375
1209        %377 = OpSLessThan %50 %376 %119
1210               OpBranch %374
1211        %374 = OpLabel
1212        %378 = OpPhi %50 %372 %341 %377 %373
1213               OpSelectionMerge %380 None
1214               OpBranchConditional %378 %379 %380
1215        %379 = OpLabel
1216        %381 = OpAccessChain %41 %62 %28
1217        %382 = OpLoad %18 %381
1218        %383 = OpAccessChain %41 %62 %35
1219        %384 = OpLoad %18 %383
1220        %385 = OpIAdd %18 %384 %82
1221        %386 = OpIMul %18 %385 %86
1222        %387 = OpIAdd %18 %382 %386
1223        %388 = OpAccessChain %57 %55 %387
1224        %389 = OpLoad %18 %388
1225        %390 = OpIEqual %50 %389 %19
1226               OpBranch %380
1227        %380 = OpLabel
1228        %391 = OpPhi %50 %378 %374 %390 %379
1229               OpSelectionMerge %393 None
1230               OpBranchConditional %391 %392 %393
1231        %392 = OpLabel
1232        %394 = OpLoad %18 %208
1233        %395 = OpISub %18 %394 %60
1234               OpStore %208 %395
1235        %396 = OpAccessChain %41 %62 %28
1236        %397 = OpLoad %18 %396
1237        %398 = OpAccessChain %41 %62 %35
1238        %399 = OpLoad %18 %398
1239        %400 = OpIMul %18 %399 %86
1240        %401 = OpIAdd %18 %397 %400
1241        %402 = OpAccessChain %57 %55 %401
1242               OpStore %402 %60
1243        %403 = OpAccessChain %41 %62 %28
1244        %404 = OpLoad %18 %403
1245        %405 = OpAccessChain %41 %62 %35
1246        %406 = OpLoad %18 %405
1247        %407 = OpIAdd %18 %406 %60
1248        %408 = OpIMul %18 %407 %86
1249        %409 = OpIAdd %18 %404 %408
1250        %410 = OpAccessChain %57 %55 %409
1251               OpStore %410 %60
1252        %411 = OpAccessChain %41 %62 %28
1253        %412 = OpLoad %18 %411
1254        %413 = OpAccessChain %41 %62 %35
1255        %414 = OpLoad %18 %413
1256        %415 = OpIAdd %18 %414 %82
1257        %416 = OpIMul %18 %415 %86
1258        %417 = OpIAdd %18 %412 %416
1259        %418 = OpAccessChain %57 %55 %417
1260               OpStore %418 %60
1261        %419 = OpAccessChain %41 %62 %35
1262        %420 = OpLoad %18 %419
1263        %421 = OpIAdd %18 %420 %82
1264        %422 = OpAccessChain %41 %62 %35
1265               OpStore %422 %421
1266               OpBranch %393
1267        %393 = OpLabel
1268               OpBranch %161
1269        %161 = OpLabel
1270        %423 = OpAccessChain %41 %26 %35
1271        %424 = OpLoad %18 %423
1272        %425 = OpIMul %18 %424 %86
1273        %426 = OpAccessChain %41 %26 %28
1274        %427 = OpLoad %18 %426
1275        %428 = OpIAdd %18 %425 %427
1276        %429 = OpAccessChain %57 %55 %428
1277        %430 = OpLoad %18 %429
1278        %431 = OpIEqual %50 %430 %60
1279               OpSelectionMerge %433 None
1280               OpBranchConditional %431 %432 %433
1281        %432 = OpLabel
1282               OpStore %435 %437
1283               OpReturn
1284        %433 = OpLabel
1285               OpBranch %71
1286         %71 = OpLabel
1287        %439 = OpLoad %50 %65
1288               OpBranchConditional %439 %68 %70
1289         %70 = OpLabel
1290               OpStore %435 %441
1291               OpReturn
1292               OpFunctionEnd
1293END
1294
1295# uniforms for variant
1296
1297# resolution
1298BUFFER variant_resolution DATA_TYPE vec2<float> DATA
1299 256.0 256.0
1300END
1301
1302BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
1303
1304PIPELINE graphics variant_pipeline
1305  ATTACH variant_vertex_shader
1306  ATTACH variant_fragment_shader
1307  FRAMEBUFFER_SIZE 256 256
1308  BIND BUFFER variant_framebuffer AS color LOCATION 0
1309  BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
1310END
1311CLEAR_COLOR variant_pipeline 0 0 0 255
1312
1313CLEAR variant_pipeline
1314RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
1315
1316EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
1317