• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 more complex branching
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 TARGET_ENV spv1.0
27; SPIR-V
28; Version: 1.0
29; Generator: Khronos Glslang Reference Front End; 7
30; Bound: 381
31; Schema: 0
32               OpCapability Shader
33          %1 = OpExtInstImport "GLSL.std.450"
34               OpMemoryModel Logical GLSL450
35               OpEntryPoint Fragment %4 "main" %243 %369
36               OpExecutionMode %4 OriginUpperLeft
37               OpSource ESSL 320
38               OpName %4 "main"
39               OpName %12 "merge(i1;i1;i1;"
40               OpName %9 "from"
41               OpName %10 "mid"
42               OpName %11 "to"
43               OpName %14 "mergeSort("
44               OpName %16 "k"
45               OpName %18 "i"
46               OpName %20 "j"
47               OpName %41 "data"
48               OpName %52 "temp"
49               OpName %87 "i"
50               OpName %104 "low"
51               OpName %106 "high"
52               OpName %108 "m"
53               OpName %117 "i"
54               OpName %127 "from"
55               OpName %129 "mid"
56               OpName %134 "to"
57               OpName %143 "param"
58               OpName %145 "param"
59               OpName %147 "param"
60               OpName %156 "i"
61               OpName %159 "buf0"
62               OpMemberName %159 0 "injectionSwitch"
63               OpName %161 ""
64               OpName %225 "j"
65               OpName %243 "gl_FragCoord"
66               OpName %254 "grey"
67               OpName %369 "_GLF_color"
68               OpName %378 "buf1"
69               OpMemberName %378 0 "resolution"
70               OpName %380 ""
71               OpMemberDecorate %159 0 Offset 0
72               OpDecorate %159 Block
73               OpDecorate %161 DescriptorSet 0
74               OpDecorate %161 Binding 0
75               OpDecorate %243 BuiltIn FragCoord
76               OpDecorate %369 Location 0
77               OpMemberDecorate %378 0 Offset 0
78               OpDecorate %378 Block
79               OpDecorate %380 DescriptorSet 0
80               OpDecorate %380 Binding 1
81          %2 = OpTypeVoid
82          %3 = OpTypeFunction %2
83          %6 = OpTypeInt 32 1
84          %7 = OpTypePointer Function %6
85          %8 = OpTypeFunction %2 %7 %7 %7
86         %22 = OpConstant %6 1
87         %31 = OpTypeBool
88         %37 = OpTypeInt 32 0
89         %38 = OpConstant %37 10
90         %39 = OpTypeArray %6 %38
91         %40 = OpTypePointer Private %39
92         %41 = OpVariable %40 Private
93         %43 = OpTypePointer Private %6
94         %52 = OpVariable %40 Private
95         %74 = OpConstant %6 10
96        %105 = OpConstant %6 0
97        %107 = OpConstant %6 9
98        %136 = OpConstant %6 2
99        %157 = OpTypeFloat 32
100        %158 = OpTypeVector %157 2
101        %159 = OpTypeStruct %158
102        %160 = OpTypePointer Uniform %159
103        %161 = OpVariable %160 Uniform
104        %162 = OpConstant %37 0
105        %163 = OpTypePointer Uniform %157
106        %184 = OpConstant %6 4
107        %188 = OpConstant %6 3
108        %201 = OpConstant %6 -1
109        %205 = OpConstant %6 -2
110        %209 = OpConstant %6 -3
111        %213 = OpConstant %6 -4
112        %217 = OpConstant %6 -5
113        %241 = OpTypeVector %157 4
114        %242 = OpTypePointer Input %241
115        %243 = OpVariable %242 Input
116        %244 = OpConstant %37 1
117        %245 = OpTypePointer Input %157
118        %249 = OpConstant %6 30
119        %253 = OpTypePointer Function %157
120        %255 = OpConstant %157 0.5
121        %259 = OpConstant %157 10
122        %266 = OpConstant %6 60
123        %279 = OpConstant %6 90
124        %292 = OpConstant %6 120
125        %305 = OpConstant %6 150
126        %314 = OpConstant %6 180
127        %318 = OpConstant %6 5
128        %328 = OpConstant %6 210
129        %332 = OpConstant %6 6
130        %342 = OpConstant %6 240
131        %346 = OpConstant %6 7
132        %356 = OpConstant %6 270
133        %360 = OpConstant %6 8
134        %368 = OpTypePointer Output %241
135        %369 = OpVariable %368 Output
136        %371 = OpTypeVector %157 3
137        %373 = OpConstant %157 1
138        %378 = OpTypeStruct %158
139        %379 = OpTypePointer Uniform %378
140        %380 = OpVariable %379 Uniform
141          %4 = OpFunction %2 None %3
142          %5 = OpLabel
143        %156 = OpVariable %7 Function
144        %225 = OpVariable %7 Function
145        %254 = OpVariable %253 Function
146        %164 = OpAccessChain %163 %161 %105 %162
147        %165 = OpLoad %157 %164
148        %166 = OpConvertFToS %6 %165
149               OpStore %156 %166
150               OpBranch %167
151        %167 = OpLabel
152               OpLoopMerge %169 %170 None
153               OpBranch %168
154        %168 = OpLabel
155        %171 = OpLoad %6 %156
156               OpSelectionMerge %182 None
157               OpSwitch %171 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
158        %172 = OpLabel
159        %183 = OpLoad %6 %156
160        %185 = OpAccessChain %43 %41 %183
161               OpStore %185 %184
162               OpBranch %182
163        %173 = OpLabel
164        %187 = OpLoad %6 %156
165        %189 = OpAccessChain %43 %41 %187
166               OpStore %189 %188
167               OpBranch %182
168        %174 = OpLabel
169        %191 = OpLoad %6 %156
170        %192 = OpAccessChain %43 %41 %191
171               OpStore %192 %136
172               OpBranch %182
173        %175 = OpLabel
174        %194 = OpLoad %6 %156
175        %195 = OpAccessChain %43 %41 %194
176               OpStore %195 %22
177               OpBranch %182
178        %176 = OpLabel
179        %197 = OpLoad %6 %156
180        %198 = OpAccessChain %43 %41 %197
181               OpStore %198 %105
182               OpBranch %182
183        %177 = OpLabel
184        %200 = OpLoad %6 %156
185        %202 = OpAccessChain %43 %41 %200
186               OpStore %202 %201
187               OpBranch %182
188        %178 = OpLabel
189        %204 = OpLoad %6 %156
190        %206 = OpAccessChain %43 %41 %204
191               OpStore %206 %205
192               OpBranch %182
193        %179 = OpLabel
194        %208 = OpLoad %6 %156
195        %210 = OpAccessChain %43 %41 %208
196               OpStore %210 %209
197               OpBranch %182
198        %180 = OpLabel
199        %212 = OpLoad %6 %156
200        %214 = OpAccessChain %43 %41 %212
201               OpStore %214 %213
202               OpBranch %182
203        %181 = OpLabel
204        %216 = OpLoad %6 %156
205        %218 = OpAccessChain %43 %41 %216
206               OpStore %218 %217
207               OpBranch %182
208        %182 = OpLabel
209        %221 = OpLoad %6 %156
210        %222 = OpIAdd %6 %221 %22
211               OpStore %156 %222
212               OpBranch %170
213        %170 = OpLabel
214        %223 = OpLoad %6 %156
215        %224 = OpSLessThan %31 %223 %74
216               OpBranchConditional %224 %167 %169
217        %169 = OpLabel
218               OpStore %225 %105
219               OpBranch %226
220        %226 = OpLabel
221               OpLoopMerge %228 %229 None
222               OpBranch %230
223        %230 = OpLabel
224        %231 = OpLoad %6 %225
225        %232 = OpSLessThan %31 %231 %74
226               OpBranchConditional %232 %227 %228
227        %227 = OpLabel
228        %233 = OpLoad %6 %225
229        %234 = OpLoad %6 %225
230        %235 = OpAccessChain %43 %41 %234
231        %236 = OpLoad %6 %235
232        %237 = OpAccessChain %43 %52 %233
233               OpStore %237 %236
234               OpBranch %229
235        %229 = OpLabel
236        %238 = OpLoad %6 %225
237        %239 = OpIAdd %6 %238 %22
238               OpStore %225 %239
239               OpBranch %226
240        %228 = OpLabel
241        %240 = OpFunctionCall %2 %14
242        %246 = OpAccessChain %245 %243 %244
243        %247 = OpLoad %157 %246
244        %248 = OpConvertFToS %6 %247
245        %250 = OpSLessThan %31 %248 %249
246               OpSelectionMerge %252 None
247               OpBranchConditional %250 %251 %262
248        %251 = OpLabel
249        %256 = OpAccessChain %43 %41 %105
250        %257 = OpLoad %6 %256
251        %258 = OpConvertSToF %157 %257
252        %260 = OpFDiv %157 %258 %259
253        %261 = OpFAdd %157 %255 %260
254               OpStore %254 %261
255               OpBranch %252
256        %262 = OpLabel
257        %263 = OpAccessChain %245 %243 %244
258        %264 = OpLoad %157 %263
259        %265 = OpConvertFToS %6 %264
260        %267 = OpSLessThan %31 %265 %266
261               OpSelectionMerge %269 None
262               OpBranchConditional %267 %268 %275
263        %268 = OpLabel
264        %270 = OpAccessChain %43 %41 %22
265        %271 = OpLoad %6 %270
266        %272 = OpConvertSToF %157 %271
267        %273 = OpFDiv %157 %272 %259
268        %274 = OpFAdd %157 %255 %273
269               OpStore %254 %274
270               OpBranch %269
271        %275 = OpLabel
272        %276 = OpAccessChain %245 %243 %244
273        %277 = OpLoad %157 %276
274        %278 = OpConvertFToS %6 %277
275        %280 = OpSLessThan %31 %278 %279
276               OpSelectionMerge %282 None
277               OpBranchConditional %280 %281 %288
278        %281 = OpLabel
279        %283 = OpAccessChain %43 %41 %136
280        %284 = OpLoad %6 %283
281        %285 = OpConvertSToF %157 %284
282        %286 = OpFDiv %157 %285 %259
283        %287 = OpFAdd %157 %255 %286
284               OpStore %254 %287
285               OpBranch %282
286        %288 = OpLabel
287        %289 = OpAccessChain %245 %243 %244
288        %290 = OpLoad %157 %289
289        %291 = OpConvertFToS %6 %290
290        %293 = OpSLessThan %31 %291 %292
291               OpSelectionMerge %295 None
292               OpBranchConditional %293 %294 %301
293        %294 = OpLabel
294        %296 = OpAccessChain %43 %41 %188
295        %297 = OpLoad %6 %296
296        %298 = OpConvertSToF %157 %297
297        %299 = OpFDiv %157 %298 %259
298        %300 = OpFAdd %157 %255 %299
299               OpStore %254 %300
300               OpBranch %295
301        %301 = OpLabel
302        %302 = OpAccessChain %245 %243 %244
303        %303 = OpLoad %157 %302
304        %304 = OpConvertFToS %6 %303
305        %306 = OpSLessThan %31 %304 %305
306               OpSelectionMerge %308 None
307               OpBranchConditional %306 %307 %310
308        %307 = OpLabel
309               OpKill
310        %310 = OpLabel
311        %311 = OpAccessChain %245 %243 %244
312        %312 = OpLoad %157 %311
313        %313 = OpConvertFToS %6 %312
314        %315 = OpSLessThan %31 %313 %314
315               OpSelectionMerge %317 None
316               OpBranchConditional %315 %316 %324
317        %316 = OpLabel
318        %319 = OpAccessChain %43 %41 %318
319        %320 = OpLoad %6 %319
320        %321 = OpConvertSToF %157 %320
321        %322 = OpFDiv %157 %321 %259
322        %323 = OpFAdd %157 %255 %322
323               OpStore %254 %323
324               OpBranch %317
325        %324 = OpLabel
326        %325 = OpAccessChain %245 %243 %244
327        %326 = OpLoad %157 %325
328        %327 = OpConvertFToS %6 %326
329        %329 = OpSLessThan %31 %327 %328
330               OpSelectionMerge %331 None
331               OpBranchConditional %329 %330 %338
332        %330 = OpLabel
333        %333 = OpAccessChain %43 %41 %332
334        %334 = OpLoad %6 %333
335        %335 = OpConvertSToF %157 %334
336        %336 = OpFDiv %157 %335 %259
337        %337 = OpFAdd %157 %255 %336
338               OpStore %254 %337
339               OpBranch %331
340        %338 = OpLabel
341        %339 = OpAccessChain %245 %243 %244
342        %340 = OpLoad %157 %339
343        %341 = OpConvertFToS %6 %340
344        %343 = OpSLessThan %31 %341 %342
345               OpSelectionMerge %345 None
346               OpBranchConditional %343 %344 %352
347        %344 = OpLabel
348        %347 = OpAccessChain %43 %41 %346
349        %348 = OpLoad %6 %347
350        %349 = OpConvertSToF %157 %348
351        %350 = OpFDiv %157 %349 %259
352        %351 = OpFAdd %157 %255 %350
353               OpStore %254 %351
354               OpBranch %345
355        %352 = OpLabel
356        %353 = OpAccessChain %245 %243 %244
357        %354 = OpLoad %157 %353
358        %355 = OpConvertFToS %6 %354
359        %357 = OpSLessThan %31 %355 %356
360               OpSelectionMerge %359 None
361               OpBranchConditional %357 %358 %366
362        %358 = OpLabel
363        %361 = OpAccessChain %43 %41 %360
364        %362 = OpLoad %6 %361
365        %363 = OpConvertSToF %157 %362
366        %364 = OpFDiv %157 %363 %259
367        %365 = OpFAdd %157 %255 %364
368               OpStore %254 %365
369               OpBranch %359
370        %366 = OpLabel
371               OpKill
372        %359 = OpLabel
373               OpBranch %345
374        %345 = OpLabel
375               OpBranch %331
376        %331 = OpLabel
377               OpBranch %317
378        %317 = OpLabel
379               OpBranch %308
380        %308 = OpLabel
381               OpBranch %295
382        %295 = OpLabel
383               OpBranch %282
384        %282 = OpLabel
385               OpBranch %269
386        %269 = OpLabel
387               OpBranch %252
388        %252 = OpLabel
389        %370 = OpLoad %157 %254
390        %372 = OpCompositeConstruct %371 %370 %370 %370
391        %374 = OpCompositeExtract %157 %372 0
392        %375 = OpCompositeExtract %157 %372 1
393        %376 = OpCompositeExtract %157 %372 2
394        %377 = OpCompositeConstruct %241 %374 %375 %376 %373
395               OpStore %369 %377
396               OpReturn
397               OpFunctionEnd
398         %12 = OpFunction %2 None %8
399          %9 = OpFunctionParameter %7
400         %10 = OpFunctionParameter %7
401         %11 = OpFunctionParameter %7
402         %13 = OpLabel
403         %16 = OpVariable %7 Function
404         %18 = OpVariable %7 Function
405         %20 = OpVariable %7 Function
406         %87 = OpVariable %7 Function
407         %17 = OpLoad %6 %9
408               OpStore %16 %17
409         %19 = OpLoad %6 %9
410               OpStore %18 %19
411         %21 = OpLoad %6 %10
412         %23 = OpIAdd %6 %21 %22
413               OpStore %20 %23
414               OpBranch %24
415         %24 = OpLabel
416               OpLoopMerge %26 %27 None
417               OpBranch %28
418         %28 = OpLabel
419         %29 = OpLoad %6 %18
420         %30 = OpLoad %6 %10
421         %32 = OpSLessThanEqual %31 %29 %30
422         %33 = OpLoad %6 %20
423         %34 = OpLoad %6 %11
424         %35 = OpSLessThanEqual %31 %33 %34
425         %36 = OpLogicalAnd %31 %32 %35
426               OpBranchConditional %36 %25 %26
427         %25 = OpLabel
428         %42 = OpLoad %6 %18
429         %44 = OpAccessChain %43 %41 %42
430         %45 = OpLoad %6 %44
431         %46 = OpLoad %6 %20
432         %47 = OpAccessChain %43 %41 %46
433         %48 = OpLoad %6 %47
434         %49 = OpSLessThan %31 %45 %48
435               OpSelectionMerge %51 None
436               OpBranchConditional %49 %50 %60
437         %50 = OpLabel
438         %53 = OpLoad %6 %16
439         %54 = OpIAdd %6 %53 %22
440               OpStore %16 %54
441         %55 = OpLoad %6 %18
442         %56 = OpIAdd %6 %55 %22
443               OpStore %18 %56
444         %57 = OpAccessChain %43 %41 %55
445         %58 = OpLoad %6 %57
446         %59 = OpAccessChain %43 %52 %53
447               OpStore %59 %58
448               OpBranch %51
449         %60 = OpLabel
450         %61 = OpLoad %6 %16
451         %62 = OpIAdd %6 %61 %22
452               OpStore %16 %62
453         %63 = OpLoad %6 %20
454         %64 = OpIAdd %6 %63 %22
455               OpStore %20 %64
456         %65 = OpAccessChain %43 %41 %63
457         %66 = OpLoad %6 %65
458         %67 = OpAccessChain %43 %52 %61
459               OpStore %67 %66
460               OpBranch %51
461         %51 = OpLabel
462               OpBranch %27
463         %27 = OpLabel
464               OpBranch %24
465         %26 = OpLabel
466               OpBranch %68
467         %68 = OpLabel
468               OpLoopMerge %70 %71 None
469               OpBranch %72
470         %72 = OpLabel
471         %73 = OpLoad %6 %18
472         %75 = OpSLessThan %31 %73 %74
473         %76 = OpLoad %6 %18
474         %77 = OpLoad %6 %10
475         %78 = OpSLessThanEqual %31 %76 %77
476         %79 = OpLogicalAnd %31 %75 %78
477               OpBranchConditional %79 %69 %70
478         %69 = OpLabel
479         %80 = OpLoad %6 %16
480         %81 = OpIAdd %6 %80 %22
481               OpStore %16 %81
482         %82 = OpLoad %6 %18
483         %83 = OpIAdd %6 %82 %22
484               OpStore %18 %83
485         %84 = OpAccessChain %43 %41 %82
486         %85 = OpLoad %6 %84
487         %86 = OpAccessChain %43 %52 %80
488               OpStore %86 %85
489               OpBranch %71
490         %71 = OpLabel
491               OpBranch %68
492         %70 = OpLabel
493         %88 = OpLoad %6 %9
494               OpStore %87 %88
495               OpBranch %89
496         %89 = OpLabel
497               OpLoopMerge %91 %92 None
498               OpBranch %93
499         %93 = OpLabel
500         %94 = OpLoad %6 %87
501         %95 = OpLoad %6 %11
502         %96 = OpSLessThanEqual %31 %94 %95
503               OpBranchConditional %96 %90 %91
504         %90 = OpLabel
505         %97 = OpLoad %6 %87
506         %98 = OpLoad %6 %87
507         %99 = OpAccessChain %43 %52 %98
508        %100 = OpLoad %6 %99
509        %101 = OpAccessChain %43 %41 %97
510               OpStore %101 %100
511               OpBranch %92
512         %92 = OpLabel
513        %102 = OpLoad %6 %87
514        %103 = OpIAdd %6 %102 %22
515               OpStore %87 %103
516               OpBranch %89
517         %91 = OpLabel
518               OpReturn
519               OpFunctionEnd
520         %14 = OpFunction %2 None %3
521         %15 = OpLabel
522        %104 = OpVariable %7 Function
523        %106 = OpVariable %7 Function
524        %108 = OpVariable %7 Function
525        %117 = OpVariable %7 Function
526        %127 = OpVariable %7 Function
527        %129 = OpVariable %7 Function
528        %134 = OpVariable %7 Function
529        %143 = OpVariable %7 Function
530        %145 = OpVariable %7 Function
531        %147 = OpVariable %7 Function
532               OpStore %104 %105
533               OpStore %106 %107
534               OpStore %108 %22
535               OpBranch %109
536        %109 = OpLabel
537               OpLoopMerge %111 %112 None
538               OpBranch %113
539        %113 = OpLabel
540        %114 = OpLoad %6 %108
541        %115 = OpLoad %6 %106
542        %116 = OpSLessThanEqual %31 %114 %115
543               OpBranchConditional %116 %110 %111
544        %110 = OpLabel
545        %118 = OpLoad %6 %104
546               OpStore %117 %118
547               OpBranch %119
548        %119 = OpLabel
549               OpLoopMerge %121 %122 None
550               OpBranch %123
551        %123 = OpLabel
552        %124 = OpLoad %6 %117
553        %125 = OpLoad %6 %106
554        %126 = OpSLessThan %31 %124 %125
555               OpBranchConditional %126 %120 %121
556        %120 = OpLabel
557        %128 = OpLoad %6 %117
558               OpStore %127 %128
559        %130 = OpLoad %6 %117
560        %131 = OpLoad %6 %108
561        %132 = OpIAdd %6 %130 %131
562        %133 = OpISub %6 %132 %22
563               OpStore %129 %133
564        %135 = OpLoad %6 %117
565        %137 = OpLoad %6 %108
566        %138 = OpIMul %6 %136 %137
567        %139 = OpIAdd %6 %135 %138
568        %140 = OpISub %6 %139 %22
569        %141 = OpLoad %6 %106
570        %142 = OpExtInst %6 %1 SMin %140 %141
571               OpStore %134 %142
572        %144 = OpLoad %6 %127
573               OpStore %143 %144
574        %146 = OpLoad %6 %129
575               OpStore %145 %146
576        %148 = OpLoad %6 %134
577               OpStore %147 %148
578        %149 = OpFunctionCall %2 %12 %143 %145 %147
579               OpBranch %122
580        %122 = OpLabel
581        %150 = OpLoad %6 %108
582        %151 = OpIMul %6 %136 %150
583        %152 = OpLoad %6 %117
584        %153 = OpIAdd %6 %152 %151
585               OpStore %117 %153
586               OpBranch %119
587        %121 = OpLabel
588               OpBranch %112
589        %112 = OpLabel
590        %154 = OpLoad %6 %108
591        %155 = OpIMul %6 %136 %154
592               OpStore %108 %155
593               OpBranch %109
594        %111 = OpLabel
595               OpReturn
596               OpFunctionEnd
597END
598
599# uniforms for reference
600
601# injectionSwitch
602BUFFER reference_injectionSwitch DATA_TYPE vec2<float> DATA
603 0.0 1.0
604END
605# resolution
606BUFFER reference_resolution DATA_TYPE vec2<float> DATA
607 256.0 256.0
608END
609
610BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
611
612PIPELINE graphics reference_pipeline
613  ATTACH reference_vertex_shader
614  ATTACH reference_fragment_shader
615  FRAMEBUFFER_SIZE 256 256
616  BIND BUFFER reference_framebuffer AS color LOCATION 0
617  BIND BUFFER reference_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
618  BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 1
619END
620CLEAR_COLOR reference_pipeline 0 0 0 255
621
622CLEAR reference_pipeline
623RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
624
625
626SHADER vertex variant_vertex_shader PASSTHROUGH
627
628SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
629; SPIR-V
630; Version: 1.0
631; Generator: Khronos Glslang Reference Front End; 7
632; Bound: 637
633; Schema: 0
634               OpCapability Shader
635          %1 = OpExtInstImport "GLSL.std.450"
636               OpMemoryModel Logical GLSL450
637               OpEntryPoint Fragment %4 "main" %243 %369
638               OpExecutionMode %4 OriginUpperLeft
639               OpSource ESSL 320
640               OpName %4 "main"
641               OpName %12 "merge(i1;i1;i1;"
642               OpName %9 "from"
643               OpName %10 "mid"
644               OpName %11 "to"
645               OpName %14 "mergeSort("
646               OpName %16 "k"
647               OpName %18 "i"
648               OpName %20 "j"
649               OpName %41 "data"
650               OpName %52 "temp"
651               OpName %87 "i"
652               OpName %104 "low"
653               OpName %106 "high"
654               OpName %108 "m"
655               OpName %117 "i"
656               OpName %127 "from"
657               OpName %129 "mid"
658               OpName %134 "to"
659               OpName %143 "param"
660               OpName %145 "param"
661               OpName %147 "param"
662               OpName %156 "i"
663               OpName %159 "buf0"
664               OpMemberName %159 0 "injectionSwitch"
665               OpName %161 ""
666               OpName %225 "j"
667               OpName %243 "gl_FragCoord"
668               OpName %254 "grey"
669               OpName %369 "_GLF_color"
670               OpName %378 "buf1"
671               OpMemberName %378 0 "resolution"
672               OpName %380 ""
673               OpMemberDecorate %159 0 Offset 0
674               OpDecorate %159 Block
675               OpDecorate %161 DescriptorSet 0
676               OpDecorate %161 Binding 0
677               OpDecorate %243 BuiltIn FragCoord
678               OpDecorate %369 Location 0
679               OpMemberDecorate %378 0 Offset 0
680               OpDecorate %378 Block
681               OpDecorate %380 DescriptorSet 0
682               OpDecorate %380 Binding 1
683          %2 = OpTypeVoid
684          %3 = OpTypeFunction %2
685          %6 = OpTypeInt 32 1
686          %7 = OpTypePointer Function %6
687          %8 = OpTypeFunction %2 %7 %7 %7
688         %22 = OpConstant %6 1
689         %31 = OpTypeBool
690         %37 = OpTypeInt 32 0
691         %38 = OpConstant %37 10
692         %39 = OpTypeArray %6 %38
693         %40 = OpTypePointer Private %39
694         %41 = OpVariable %40 Private
695         %43 = OpTypePointer Private %6
696         %52 = OpVariable %40 Private
697         %74 = OpConstant %6 10
698        %105 = OpConstant %6 0
699        %107 = OpConstant %6 9
700        %136 = OpConstant %6 2
701        %157 = OpTypeFloat 32
702        %158 = OpTypeVector %157 2
703        %159 = OpTypeStruct %158
704        %160 = OpTypePointer Uniform %159
705        %161 = OpVariable %160 Uniform
706        %162 = OpConstant %37 0
707        %163 = OpTypePointer Uniform %157
708        %184 = OpConstant %6 4
709        %188 = OpConstant %6 3
710        %201 = OpConstant %6 -1
711        %205 = OpConstant %6 -2
712        %209 = OpConstant %6 -3
713        %213 = OpConstant %6 -4
714        %217 = OpConstant %6 -5
715        %241 = OpTypeVector %157 4
716        %242 = OpTypePointer Input %241
717        %243 = OpVariable %242 Input
718        %244 = OpConstant %37 1
719        %245 = OpTypePointer Input %157
720        %249 = OpConstant %6 30
721        %253 = OpTypePointer Function %157
722        %255 = OpConstant %157 0.5
723        %259 = OpConstant %157 10
724        %266 = OpConstant %6 60
725        %279 = OpConstant %6 90
726        %292 = OpConstant %6 120
727        %305 = OpConstant %6 150
728        %314 = OpConstant %6 180
729        %318 = OpConstant %6 5
730        %328 = OpConstant %6 210
731        %332 = OpConstant %6 6
732        %342 = OpConstant %6 240
733        %346 = OpConstant %6 7
734        %356 = OpConstant %6 270
735        %360 = OpConstant %6 8
736        %368 = OpTypePointer Output %241
737        %369 = OpVariable %368 Output
738        %371 = OpTypeVector %157 3
739        %373 = OpConstant %157 1
740        %378 = OpTypeStruct %158
741        %379 = OpTypePointer Uniform %378
742        %380 = OpVariable %379 Uniform
743        %526 = OpConstantTrue %31
744        %595 = OpConstant %157 256
745          %4 = OpFunction %2 None %3
746          %5 = OpLabel
747        %156 = OpVariable %7 Function
748        %225 = OpVariable %7 Function
749        %254 = OpVariable %253 Function
750        %164 = OpAccessChain %163 %161 %105 %162
751        %165 = OpLoad %157 %164
752        %166 = OpConvertFToS %6 %165
753               OpStore %156 %166
754               OpBranch %167
755        %167 = OpLabel
756               OpLoopMerge %169 %170 None
757               OpBranch %168
758        %168 = OpLabel
759        %171 = OpLoad %6 %156
760               OpSelectionMerge %182 None
761               OpSwitch %171 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
762        %172 = OpLabel
763        %183 = OpLoad %6 %156
764        %185 = OpAccessChain %43 %41 %183
765               OpStore %185 %184
766               OpBranch %182
767        %173 = OpLabel
768        %187 = OpLoad %6 %156
769        %189 = OpAccessChain %43 %41 %187
770               OpStore %189 %188
771               OpBranch %182
772        %174 = OpLabel
773        %191 = OpLoad %6 %156
774        %192 = OpAccessChain %43 %41 %191
775               OpStore %192 %136
776               OpBranch %182
777        %175 = OpLabel
778        %194 = OpLoad %6 %156
779        %195 = OpAccessChain %43 %41 %194
780               OpStore %195 %22
781               OpBranch %182
782        %176 = OpLabel
783        %197 = OpLoad %6 %156
784        %198 = OpAccessChain %43 %41 %197
785               OpStore %198 %105
786               OpBranch %182
787        %177 = OpLabel
788        %200 = OpLoad %6 %156
789        %202 = OpAccessChain %43 %41 %200
790               OpStore %202 %201
791               OpBranch %182
792        %178 = OpLabel
793        %204 = OpLoad %6 %156
794        %206 = OpAccessChain %43 %41 %204
795               OpStore %206 %205
796               OpBranch %182
797        %179 = OpLabel
798        %208 = OpLoad %6 %156
799        %210 = OpAccessChain %43 %41 %208
800               OpStore %210 %209
801               OpBranch %182
802        %180 = OpLabel
803        %212 = OpLoad %6 %156
804        %214 = OpAccessChain %43 %41 %212
805               OpStore %214 %213
806               OpBranch %182
807        %181 = OpLabel
808        %216 = OpLoad %6 %156
809        %218 = OpAccessChain %43 %41 %216
810               OpStore %218 %217
811               OpBranch %182
812        %182 = OpLabel
813        %221 = OpLoad %6 %156
814        %222 = OpIAdd %6 %221 %22
815               OpStore %156 %222
816               OpBranch %170
817        %170 = OpLabel
818        %223 = OpLoad %6 %156
819        %224 = OpSLessThan %31 %223 %74
820               OpBranchConditional %224 %167 %169
821        %169 = OpLabel
822               OpStore %225 %105
823               OpBranch %226
824        %226 = OpLabel
825               OpLoopMerge %228 %229 None
826               OpBranch %230
827        %230 = OpLabel
828        %231 = OpLoad %6 %225
829        %232 = OpSLessThan %31 %231 %74
830               OpBranchConditional %232 %227 %228
831        %227 = OpLabel
832        %233 = OpLoad %6 %225
833        %234 = OpLoad %6 %225
834        %235 = OpAccessChain %43 %41 %234
835        %236 = OpLoad %6 %235
836        %237 = OpAccessChain %43 %52 %233
837               OpStore %237 %236
838               OpBranch %229
839        %229 = OpLabel
840        %238 = OpLoad %6 %225
841        %239 = OpIAdd %6 %238 %22
842               OpStore %225 %239
843               OpBranch %226
844        %228 = OpLabel
845        %240 = OpFunctionCall %2 %14
846        %246 = OpAccessChain %245 %243 %244
847        %247 = OpLoad %157 %246
848        %248 = OpConvertFToS %6 %247
849        %250 = OpSLessThan %31 %248 %249
850               OpSelectionMerge %252 None
851               OpBranchConditional %250 %251 %262
852        %251 = OpLabel
853        %256 = OpAccessChain %43 %41 %105
854        %257 = OpLoad %6 %256
855        %258 = OpConvertSToF %157 %257
856        %260 = OpFDiv %157 %258 %259
857        %261 = OpFAdd %157 %255 %260
858               OpStore %254 %261
859               OpBranch %252
860        %262 = OpLabel
861        %263 = OpAccessChain %245 %243 %244
862        %264 = OpLoad %157 %263
863        %265 = OpConvertFToS %6 %264
864        %267 = OpSLessThan %31 %265 %266
865               OpSelectionMerge %269 None
866               OpBranchConditional %267 %268 %275
867        %268 = OpLabel
868        %270 = OpAccessChain %43 %41 %22
869        %271 = OpLoad %6 %270
870        %272 = OpConvertSToF %157 %271
871        %273 = OpFDiv %157 %272 %259
872        %274 = OpFAdd %157 %255 %273
873               OpStore %254 %274
874               OpBranch %269
875        %275 = OpLabel
876        %276 = OpAccessChain %245 %243 %244
877        %277 = OpLoad %157 %276
878        %278 = OpConvertFToS %6 %277
879        %280 = OpSLessThan %31 %278 %279
880               OpSelectionMerge %282 None
881               OpBranchConditional %280 %281 %288
882        %281 = OpLabel
883        %283 = OpAccessChain %43 %41 %136
884        %284 = OpLoad %6 %283
885        %285 = OpConvertSToF %157 %284
886        %286 = OpFDiv %157 %285 %259
887        %287 = OpFAdd %157 %255 %286
888               OpStore %254 %287
889               OpBranch %282
890        %288 = OpLabel
891        %289 = OpAccessChain %245 %243 %244
892        %290 = OpLoad %157 %289
893        %291 = OpConvertFToS %6 %290
894        %293 = OpSLessThan %31 %291 %292
895               OpSelectionMerge %295 None
896               OpBranchConditional %293 %294 %301
897        %294 = OpLabel
898        %296 = OpAccessChain %43 %41 %188
899        %297 = OpLoad %6 %296
900        %298 = OpConvertSToF %157 %297
901        %299 = OpFDiv %157 %298 %259
902        %300 = OpFAdd %157 %255 %299
903               OpStore %254 %300
904               OpBranch %295
905        %301 = OpLabel
906        %302 = OpAccessChain %245 %243 %244
907        %303 = OpLoad %157 %302
908        %304 = OpConvertFToS %6 %303
909        %306 = OpSLessThan %31 %304 %305
910               OpSelectionMerge %308 None
911               OpBranchConditional %306 %307 %310
912        %307 = OpLabel
913               OpKill
914        %310 = OpLabel
915        %311 = OpAccessChain %245 %243 %244
916        %312 = OpLoad %157 %311
917        %313 = OpConvertFToS %6 %312
918        %315 = OpSLessThan %31 %313 %314
919               OpSelectionMerge %317 None
920               OpBranchConditional %315 %316 %324
921        %316 = OpLabel
922        %319 = OpAccessChain %43 %41 %318
923        %320 = OpLoad %6 %319
924        %321 = OpConvertSToF %157 %320
925        %322 = OpFDiv %157 %321 %259
926        %323 = OpFAdd %157 %255 %322
927               OpStore %254 %323
928               OpBranch %317
929        %324 = OpLabel
930        %325 = OpAccessChain %245 %243 %244
931        %326 = OpLoad %157 %325
932        %327 = OpConvertFToS %6 %326
933        %329 = OpSLessThan %31 %327 %328
934               OpSelectionMerge %331 None
935               OpBranchConditional %329 %330 %338
936        %330 = OpLabel
937        %333 = OpAccessChain %43 %41 %332
938        %334 = OpLoad %6 %333
939        %335 = OpConvertSToF %157 %334
940        %336 = OpFDiv %157 %335 %259
941        %337 = OpFAdd %157 %255 %336
942               OpStore %254 %337
943               OpBranch %331
944        %338 = OpLabel
945        %339 = OpAccessChain %245 %243 %244
946        %340 = OpLoad %157 %339
947        %341 = OpConvertFToS %6 %340
948        %343 = OpSLessThan %31 %341 %342
949               OpSelectionMerge %345 None
950               OpBranchConditional %343 %344 %352
951        %344 = OpLabel
952        %347 = OpAccessChain %43 %41 %346
953        %348 = OpLoad %6 %347
954        %349 = OpConvertSToF %157 %348
955        %350 = OpFDiv %157 %349 %259
956        %351 = OpFAdd %157 %255 %350
957               OpStore %254 %351
958               OpBranch %345
959        %352 = OpLabel
960        %353 = OpAccessChain %245 %243 %244
961        %354 = OpLoad %157 %353
962        %355 = OpConvertFToS %6 %354
963        %357 = OpSLessThan %31 %355 %356
964               OpSelectionMerge %359 None
965               OpBranchConditional %357 %358 %366
966        %358 = OpLabel
967        %361 = OpAccessChain %43 %41 %360
968        %362 = OpLoad %6 %361
969        %363 = OpConvertSToF %157 %362
970        %364 = OpFDiv %157 %363 %259
971        %365 = OpFAdd %157 %255 %364
972               OpStore %254 %365
973               OpBranch %359
974        %366 = OpLabel
975               OpKill
976        %359 = OpLabel
977               OpBranch %345
978        %345 = OpLabel
979               OpBranch %331
980        %331 = OpLabel
981               OpBranch %317
982        %317 = OpLabel
983               OpBranch %308
984        %308 = OpLabel
985               OpBranch %295
986        %295 = OpLabel
987               OpBranch %282
988        %282 = OpLabel
989               OpBranch %269
990        %269 = OpLabel
991               OpBranch %252
992        %252 = OpLabel
993        %370 = OpLoad %157 %254
994        %372 = OpCompositeConstruct %371 %370 %370 %370
995        %374 = OpCompositeExtract %157 %372 0
996        %375 = OpCompositeExtract %157 %372 1
997        %376 = OpCompositeExtract %157 %372 2
998        %377 = OpCompositeConstruct %241 %374 %375 %376 %373
999               OpStore %369 %377
1000               OpReturn
1001               OpFunctionEnd
1002         %12 = OpFunction %2 None %8
1003          %9 = OpFunctionParameter %7
1004         %10 = OpFunctionParameter %7
1005         %11 = OpFunctionParameter %7
1006         %13 = OpLabel
1007         %16 = OpVariable %7 Function
1008         %18 = OpVariable %7 Function
1009         %20 = OpVariable %7 Function
1010         %87 = OpVariable %7 Function
1011         %17 = OpLoad %6 %9
1012               OpStore %16 %17
1013         %19 = OpLoad %6 %9
1014               OpStore %18 %19
1015         %21 = OpLoad %6 %10
1016         %23 = OpIAdd %6 %21 %22
1017               OpStore %20 %23
1018               OpBranch %24
1019         %24 = OpLabel
1020               OpLoopMerge %26 %27 None
1021               OpBranch %28
1022         %28 = OpLabel
1023         %29 = OpLoad %6 %18
1024         %30 = OpLoad %6 %10
1025         %32 = OpSLessThanEqual %31 %29 %30
1026         %33 = OpLoad %6 %20
1027         %34 = OpLoad %6 %11
1028         %35 = OpSLessThanEqual %31 %33 %34
1029         %36 = OpLogicalAnd %31 %32 %35
1030               OpBranchConditional %36 %25 %26
1031         %25 = OpLabel
1032         %42 = OpLoad %6 %18
1033         %44 = OpAccessChain %43 %41 %42
1034         %45 = OpLoad %6 %44
1035         %46 = OpLoad %6 %20
1036         %47 = OpAccessChain %43 %41 %46
1037         %48 = OpLoad %6 %47
1038         %49 = OpSLessThan %31 %45 %48
1039               OpSelectionMerge %51 None
1040               OpBranchConditional %49 %50 %60
1041         %50 = OpLabel
1042         %53 = OpLoad %6 %16
1043         %54 = OpIAdd %6 %53 %22
1044               OpStore %16 %54
1045         %55 = OpLoad %6 %18
1046         %56 = OpIAdd %6 %55 %22
1047               OpStore %18 %56
1048         %57 = OpAccessChain %43 %41 %55
1049         %58 = OpLoad %6 %57
1050         %59 = OpAccessChain %43 %52 %53
1051               OpStore %59 %58
1052               OpBranch %51
1053         %60 = OpLabel
1054         %61 = OpLoad %6 %16
1055         %62 = OpIAdd %6 %61 %22
1056               OpStore %16 %62
1057         %63 = OpLoad %6 %20
1058         %64 = OpIAdd %6 %63 %22
1059               OpStore %20 %64
1060         %65 = OpAccessChain %43 %41 %63
1061         %66 = OpLoad %6 %65
1062         %67 = OpAccessChain %43 %52 %61
1063               OpStore %67 %66
1064               OpBranch %51
1065         %51 = OpLabel
1066               OpBranch %27
1067         %27 = OpLabel
1068               OpBranch %24
1069         %26 = OpLabel
1070               OpBranch %68
1071         %68 = OpLabel
1072        %636 = OpFUnordGreaterThanEqual %31 %595 %373
1073               OpLoopMerge %70 %71 None
1074               OpBranchConditional %636 %72 %71
1075         %72 = OpLabel
1076         %73 = OpLoad %6 %18
1077         %75 = OpSLessThan %31 %73 %74
1078         %76 = OpLoad %6 %18
1079         %77 = OpLoad %6 %10
1080         %78 = OpSLessThanEqual %31 %76 %77
1081         %79 = OpLogicalAnd %31 %75 %78
1082               OpBranchConditional %79 %69 %70
1083         %69 = OpLabel
1084               OpBranch %579
1085        %579 = OpLabel
1086         %80 = OpLoad %6 %16
1087         %81 = OpIAdd %6 %80 %22
1088               OpStore %16 %81
1089         %82 = OpLoad %6 %18
1090         %83 = OpIAdd %6 %82 %22
1091               OpStore %18 %83
1092         %84 = OpAccessChain %43 %41 %82
1093         %85 = OpLoad %6 %84
1094         %86 = OpAccessChain %43 %52 %80
1095               OpStore %86 %85
1096               OpBranchConditional %526 %71 %71
1097         %71 = OpLabel
1098               OpBranch %68
1099         %70 = OpLabel
1100         %88 = OpLoad %6 %9
1101               OpStore %87 %88
1102               OpBranch %89
1103         %89 = OpLabel
1104               OpLoopMerge %91 %92 None
1105               OpBranch %93
1106         %93 = OpLabel
1107         %94 = OpLoad %6 %87
1108         %95 = OpLoad %6 %11
1109         %96 = OpSLessThanEqual %31 %94 %95
1110               OpBranchConditional %96 %90 %91
1111         %90 = OpLabel
1112         %97 = OpLoad %6 %87
1113         %98 = OpLoad %6 %87
1114         %99 = OpAccessChain %43 %52 %98
1115        %100 = OpLoad %6 %99
1116        %101 = OpAccessChain %43 %41 %97
1117               OpStore %101 %100
1118               OpBranch %92
1119         %92 = OpLabel
1120        %102 = OpLoad %6 %87
1121        %103 = OpIAdd %6 %102 %22
1122               OpStore %87 %103
1123               OpBranch %89
1124         %91 = OpLabel
1125               OpReturn
1126               OpFunctionEnd
1127         %14 = OpFunction %2 None %3
1128         %15 = OpLabel
1129        %104 = OpVariable %7 Function
1130        %106 = OpVariable %7 Function
1131        %108 = OpVariable %7 Function
1132        %117 = OpVariable %7 Function
1133        %127 = OpVariable %7 Function
1134        %129 = OpVariable %7 Function
1135        %134 = OpVariable %7 Function
1136        %143 = OpVariable %7 Function
1137        %145 = OpVariable %7 Function
1138        %147 = OpVariable %7 Function
1139               OpStore %104 %105
1140               OpStore %106 %107
1141               OpStore %108 %22
1142               OpBranch %109
1143        %109 = OpLabel
1144               OpLoopMerge %111 %112 None
1145               OpBranch %113
1146        %113 = OpLabel
1147        %114 = OpLoad %6 %108
1148        %115 = OpLoad %6 %106
1149        %116 = OpSLessThanEqual %31 %114 %115
1150               OpBranchConditional %116 %110 %111
1151        %110 = OpLabel
1152        %118 = OpLoad %6 %104
1153               OpStore %117 %118
1154               OpBranch %119
1155        %119 = OpLabel
1156               OpLoopMerge %121 %122 None
1157               OpBranch %123
1158        %123 = OpLabel
1159        %124 = OpLoad %6 %117
1160        %125 = OpLoad %6 %106
1161        %126 = OpSLessThan %31 %124 %125
1162               OpBranchConditional %126 %120 %121
1163        %120 = OpLabel
1164        %128 = OpLoad %6 %117
1165               OpStore %127 %128
1166        %130 = OpLoad %6 %117
1167        %131 = OpLoad %6 %108
1168        %132 = OpIAdd %6 %130 %131
1169        %133 = OpISub %6 %132 %22
1170               OpStore %129 %133
1171        %135 = OpLoad %6 %117
1172        %137 = OpLoad %6 %108
1173        %138 = OpIMul %6 %136 %137
1174        %139 = OpIAdd %6 %135 %138
1175        %140 = OpISub %6 %139 %22
1176        %141 = OpLoad %6 %106
1177        %142 = OpExtInst %6 %1 SMin %140 %141
1178               OpStore %134 %142
1179        %144 = OpLoad %6 %127
1180               OpStore %143 %144
1181        %146 = OpLoad %6 %129
1182               OpStore %145 %146
1183        %148 = OpLoad %6 %134
1184               OpStore %147 %148
1185        %149 = OpFunctionCall %2 %12 %143 %145 %147
1186               OpBranch %122
1187        %122 = OpLabel
1188        %150 = OpLoad %6 %108
1189        %151 = OpIMul %6 %136 %150
1190        %152 = OpLoad %6 %117
1191        %153 = OpIAdd %6 %152 %151
1192               OpStore %117 %153
1193               OpBranch %119
1194        %121 = OpLabel
1195               OpBranch %112
1196        %112 = OpLabel
1197        %154 = OpLoad %6 %108
1198        %155 = OpIMul %6 %136 %154
1199               OpStore %108 %155
1200               OpBranch %109
1201        %111 = OpLabel
1202               OpReturn
1203               OpFunctionEnd
1204END
1205
1206# uniforms for variant
1207
1208# injectionSwitch
1209BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
1210 0.0 1.0
1211END
1212# resolution
1213BUFFER variant_resolution DATA_TYPE vec2<float> DATA
1214 256.0 256.0
1215END
1216
1217BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
1218
1219PIPELINE graphics variant_pipeline
1220  ATTACH variant_vertex_shader
1221  ATTACH variant_fragment_shader
1222  FRAMEBUFFER_SIZE 256 256
1223  BIND BUFFER variant_framebuffer AS color LOCATION 0
1224  BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
1225  BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 1
1226END
1227CLEAR_COLOR variant_pipeline 0 0 0 255
1228
1229CLEAR variant_pipeline
1230RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
1231
1232EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
1233