• 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: 534
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        %533 = OpConstantTrue %31
744          %4 = OpFunction %2 None %3
745          %5 = OpLabel
746        %156 = OpVariable %7 Function
747        %225 = OpVariable %7 Function
748        %254 = OpVariable %253 Function
749        %164 = OpAccessChain %163 %161 %105 %162
750        %165 = OpLoad %157 %164
751        %166 = OpConvertFToS %6 %165
752               OpStore %156 %166
753               OpBranch %167
754        %167 = OpLabel
755               OpLoopMerge %169 %170 None
756               OpBranch %168
757        %168 = OpLabel
758        %171 = OpLoad %6 %156
759               OpSelectionMerge %182 None
760               OpSwitch %171 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
761        %172 = OpLabel
762        %183 = OpLoad %6 %156
763        %185 = OpAccessChain %43 %41 %183
764               OpStore %185 %184
765               OpBranch %182
766        %173 = OpLabel
767        %187 = OpLoad %6 %156
768        %189 = OpAccessChain %43 %41 %187
769               OpStore %189 %188
770               OpBranch %182
771        %174 = OpLabel
772        %191 = OpLoad %6 %156
773        %192 = OpAccessChain %43 %41 %191
774               OpStore %192 %136
775               OpBranch %182
776        %175 = OpLabel
777        %194 = OpLoad %6 %156
778        %195 = OpAccessChain %43 %41 %194
779               OpStore %195 %22
780               OpBranch %182
781        %176 = OpLabel
782        %197 = OpLoad %6 %156
783        %198 = OpAccessChain %43 %41 %197
784               OpStore %198 %105
785               OpBranch %182
786        %177 = OpLabel
787        %200 = OpLoad %6 %156
788        %202 = OpAccessChain %43 %41 %200
789               OpStore %202 %201
790               OpBranch %182
791        %178 = OpLabel
792        %204 = OpLoad %6 %156
793        %206 = OpAccessChain %43 %41 %204
794               OpStore %206 %205
795               OpBranch %182
796        %179 = OpLabel
797        %208 = OpLoad %6 %156
798        %210 = OpAccessChain %43 %41 %208
799               OpStore %210 %209
800               OpBranch %182
801        %180 = OpLabel
802        %212 = OpLoad %6 %156
803        %214 = OpAccessChain %43 %41 %212
804               OpStore %214 %213
805               OpBranch %182
806        %181 = OpLabel
807        %216 = OpLoad %6 %156
808        %218 = OpAccessChain %43 %41 %216
809               OpStore %218 %217
810               OpBranchConditional %533 %182 %170
811        %182 = OpLabel
812        %221 = OpLoad %6 %156
813        %222 = OpIAdd %6 %221 %22
814               OpStore %156 %222
815               OpBranchConditional %533 %170 %170
816        %170 = OpLabel
817        %223 = OpLoad %6 %156
818        %224 = OpSLessThan %31 %223 %74
819               OpBranchConditional %224 %167 %169
820        %169 = OpLabel
821               OpStore %225 %105
822               OpBranch %226
823        %226 = OpLabel
824               OpLoopMerge %228 %229 None
825               OpBranch %230
826        %230 = OpLabel
827        %231 = OpLoad %6 %225
828        %232 = OpSLessThan %31 %231 %74
829               OpBranchConditional %232 %227 %228
830        %227 = OpLabel
831        %233 = OpLoad %6 %225
832        %234 = OpLoad %6 %225
833        %235 = OpAccessChain %43 %41 %234
834        %236 = OpLoad %6 %235
835        %237 = OpAccessChain %43 %52 %233
836               OpStore %237 %236
837               OpBranch %229
838        %229 = OpLabel
839        %238 = OpLoad %6 %225
840        %239 = OpIAdd %6 %238 %22
841               OpStore %225 %239
842               OpBranch %226
843        %228 = OpLabel
844        %240 = OpFunctionCall %2 %14
845        %246 = OpAccessChain %245 %243 %244
846        %247 = OpLoad %157 %246
847        %248 = OpConvertFToS %6 %247
848        %250 = OpSLessThan %31 %248 %249
849               OpSelectionMerge %252 None
850               OpBranchConditional %250 %251 %262
851        %251 = OpLabel
852        %256 = OpAccessChain %43 %41 %105
853        %257 = OpLoad %6 %256
854        %258 = OpConvertSToF %157 %257
855        %260 = OpFDiv %157 %258 %259
856        %261 = OpFAdd %157 %255 %260
857               OpStore %254 %261
858               OpBranch %252
859        %262 = OpLabel
860        %263 = OpAccessChain %245 %243 %244
861        %264 = OpLoad %157 %263
862        %265 = OpConvertFToS %6 %264
863        %267 = OpSLessThan %31 %265 %266
864               OpSelectionMerge %269 None
865               OpBranchConditional %267 %268 %275
866        %268 = OpLabel
867        %270 = OpAccessChain %43 %41 %22
868        %271 = OpLoad %6 %270
869        %272 = OpConvertSToF %157 %271
870        %273 = OpFDiv %157 %272 %259
871        %274 = OpFAdd %157 %255 %273
872               OpStore %254 %274
873               OpBranch %269
874        %275 = OpLabel
875        %276 = OpAccessChain %245 %243 %244
876        %277 = OpLoad %157 %276
877        %278 = OpConvertFToS %6 %277
878        %280 = OpSLessThan %31 %278 %279
879               OpSelectionMerge %282 None
880               OpBranchConditional %280 %281 %288
881        %281 = OpLabel
882        %283 = OpAccessChain %43 %41 %136
883        %284 = OpLoad %6 %283
884        %285 = OpConvertSToF %157 %284
885        %286 = OpFDiv %157 %285 %259
886        %287 = OpFAdd %157 %255 %286
887               OpStore %254 %287
888               OpBranch %282
889        %288 = OpLabel
890        %289 = OpAccessChain %245 %243 %244
891        %290 = OpLoad %157 %289
892        %291 = OpConvertFToS %6 %290
893        %293 = OpSLessThan %31 %291 %292
894               OpSelectionMerge %295 None
895               OpBranchConditional %293 %294 %301
896        %294 = OpLabel
897        %296 = OpAccessChain %43 %41 %188
898        %297 = OpLoad %6 %296
899        %298 = OpConvertSToF %157 %297
900        %299 = OpFDiv %157 %298 %259
901        %300 = OpFAdd %157 %255 %299
902               OpStore %254 %300
903               OpBranch %295
904        %301 = OpLabel
905        %302 = OpAccessChain %245 %243 %244
906        %303 = OpLoad %157 %302
907        %304 = OpConvertFToS %6 %303
908        %306 = OpSLessThan %31 %304 %305
909               OpSelectionMerge %308 None
910               OpBranchConditional %306 %307 %310
911        %307 = OpLabel
912               OpKill
913        %310 = OpLabel
914        %311 = OpAccessChain %245 %243 %244
915        %312 = OpLoad %157 %311
916        %313 = OpConvertFToS %6 %312
917        %315 = OpSLessThan %31 %313 %314
918               OpSelectionMerge %317 None
919               OpBranchConditional %315 %316 %324
920        %316 = OpLabel
921        %319 = OpAccessChain %43 %41 %318
922        %320 = OpLoad %6 %319
923        %321 = OpConvertSToF %157 %320
924        %322 = OpFDiv %157 %321 %259
925        %323 = OpFAdd %157 %255 %322
926               OpStore %254 %323
927               OpBranch %317
928        %324 = OpLabel
929        %325 = OpAccessChain %245 %243 %244
930        %326 = OpLoad %157 %325
931        %327 = OpConvertFToS %6 %326
932        %329 = OpSLessThan %31 %327 %328
933               OpSelectionMerge %331 None
934               OpBranchConditional %329 %330 %338
935        %330 = OpLabel
936        %333 = OpAccessChain %43 %41 %332
937        %334 = OpLoad %6 %333
938        %335 = OpConvertSToF %157 %334
939        %336 = OpFDiv %157 %335 %259
940        %337 = OpFAdd %157 %255 %336
941               OpStore %254 %337
942               OpBranch %331
943        %338 = OpLabel
944        %339 = OpAccessChain %245 %243 %244
945        %340 = OpLoad %157 %339
946        %341 = OpConvertFToS %6 %340
947        %343 = OpSLessThan %31 %341 %342
948               OpSelectionMerge %345 None
949               OpBranchConditional %343 %344 %352
950        %344 = OpLabel
951        %347 = OpAccessChain %43 %41 %346
952        %348 = OpLoad %6 %347
953        %349 = OpConvertSToF %157 %348
954        %350 = OpFDiv %157 %349 %259
955        %351 = OpFAdd %157 %255 %350
956               OpStore %254 %351
957               OpBranch %345
958        %352 = OpLabel
959        %353 = OpAccessChain %245 %243 %244
960        %354 = OpLoad %157 %353
961        %355 = OpConvertFToS %6 %354
962        %357 = OpSLessThan %31 %355 %356
963               OpSelectionMerge %359 None
964               OpBranchConditional %357 %358 %366
965        %358 = OpLabel
966        %361 = OpAccessChain %43 %41 %360
967        %362 = OpLoad %6 %361
968        %363 = OpConvertSToF %157 %362
969        %364 = OpFDiv %157 %363 %259
970        %365 = OpFAdd %157 %255 %364
971               OpStore %254 %365
972               OpBranch %359
973        %366 = OpLabel
974               OpKill
975        %359 = OpLabel
976               OpBranch %345
977        %345 = OpLabel
978               OpBranch %331
979        %331 = OpLabel
980               OpBranch %317
981        %317 = OpLabel
982               OpBranch %308
983        %308 = OpLabel
984               OpBranch %295
985        %295 = OpLabel
986               OpBranch %282
987        %282 = OpLabel
988               OpBranch %269
989        %269 = OpLabel
990               OpBranch %252
991        %252 = OpLabel
992        %370 = OpLoad %157 %254
993        %372 = OpCompositeConstruct %371 %370 %370 %370
994        %374 = OpCompositeExtract %157 %372 0
995        %375 = OpCompositeExtract %157 %372 1
996        %376 = OpCompositeExtract %157 %372 2
997        %377 = OpCompositeConstruct %241 %374 %375 %376 %373
998               OpStore %369 %377
999               OpReturn
1000               OpFunctionEnd
1001         %12 = OpFunction %2 None %8
1002          %9 = OpFunctionParameter %7
1003         %10 = OpFunctionParameter %7
1004         %11 = OpFunctionParameter %7
1005         %13 = OpLabel
1006         %16 = OpVariable %7 Function
1007         %18 = OpVariable %7 Function
1008         %20 = OpVariable %7 Function
1009         %87 = OpVariable %7 Function
1010         %17 = OpLoad %6 %9
1011               OpStore %16 %17
1012         %19 = OpLoad %6 %9
1013               OpStore %18 %19
1014         %21 = OpLoad %6 %10
1015         %23 = OpIAdd %6 %21 %22
1016               OpStore %20 %23
1017               OpBranch %24
1018         %24 = OpLabel
1019               OpLoopMerge %26 %27 None
1020               OpBranch %28
1021         %28 = OpLabel
1022         %29 = OpLoad %6 %18
1023         %30 = OpLoad %6 %10
1024         %32 = OpSLessThanEqual %31 %29 %30
1025         %33 = OpLoad %6 %20
1026         %34 = OpLoad %6 %11
1027         %35 = OpSLessThanEqual %31 %33 %34
1028         %36 = OpLogicalAnd %31 %32 %35
1029               OpBranchConditional %36 %25 %26
1030         %25 = OpLabel
1031         %42 = OpLoad %6 %18
1032         %44 = OpAccessChain %43 %41 %42
1033         %45 = OpLoad %6 %44
1034         %46 = OpLoad %6 %20
1035         %47 = OpAccessChain %43 %41 %46
1036         %48 = OpLoad %6 %47
1037         %49 = OpSLessThan %31 %45 %48
1038               OpSelectionMerge %51 None
1039               OpBranchConditional %49 %50 %60
1040         %50 = OpLabel
1041         %53 = OpLoad %6 %16
1042         %54 = OpIAdd %6 %53 %22
1043               OpStore %16 %54
1044         %55 = OpLoad %6 %18
1045         %56 = OpIAdd %6 %55 %22
1046               OpStore %18 %56
1047         %57 = OpAccessChain %43 %41 %55
1048         %58 = OpLoad %6 %57
1049         %59 = OpAccessChain %43 %52 %53
1050               OpStore %59 %58
1051               OpBranch %51
1052         %60 = OpLabel
1053         %61 = OpLoad %6 %16
1054         %62 = OpIAdd %6 %61 %22
1055               OpStore %16 %62
1056         %63 = OpLoad %6 %20
1057         %64 = OpIAdd %6 %63 %22
1058               OpStore %20 %64
1059         %65 = OpAccessChain %43 %41 %63
1060         %66 = OpLoad %6 %65
1061         %67 = OpAccessChain %43 %52 %61
1062               OpStore %67 %66
1063               OpBranch %51
1064         %51 = OpLabel
1065               OpBranch %27
1066         %27 = OpLabel
1067               OpBranch %24
1068         %26 = OpLabel
1069               OpBranch %68
1070         %68 = OpLabel
1071               OpLoopMerge %70 %71 None
1072               OpBranch %72
1073         %72 = OpLabel
1074         %73 = OpLoad %6 %18
1075         %75 = OpSLessThan %31 %73 %74
1076         %76 = OpLoad %6 %18
1077         %77 = OpLoad %6 %10
1078         %78 = OpSLessThanEqual %31 %76 %77
1079         %79 = OpLogicalAnd %31 %75 %78
1080               OpBranchConditional %79 %69 %70
1081         %69 = OpLabel
1082         %80 = OpLoad %6 %16
1083         %81 = OpIAdd %6 %80 %22
1084               OpStore %16 %81
1085         %82 = OpLoad %6 %18
1086         %83 = OpIAdd %6 %82 %22
1087               OpStore %18 %83
1088         %84 = OpAccessChain %43 %41 %82
1089         %85 = OpLoad %6 %84
1090         %86 = OpAccessChain %43 %52 %80
1091               OpStore %86 %85
1092               OpBranch %71
1093         %71 = OpLabel
1094               OpBranch %68
1095         %70 = OpLabel
1096         %88 = OpLoad %6 %9
1097               OpStore %87 %88
1098               OpBranch %89
1099         %89 = OpLabel
1100               OpLoopMerge %91 %92 None
1101               OpBranch %93
1102         %93 = OpLabel
1103         %94 = OpLoad %6 %87
1104         %95 = OpLoad %6 %11
1105         %96 = OpSLessThanEqual %31 %94 %95
1106               OpBranchConditional %96 %90 %91
1107         %90 = OpLabel
1108         %97 = OpLoad %6 %87
1109         %98 = OpLoad %6 %87
1110         %99 = OpAccessChain %43 %52 %98
1111        %100 = OpLoad %6 %99
1112        %101 = OpAccessChain %43 %41 %97
1113               OpStore %101 %100
1114               OpBranch %92
1115         %92 = OpLabel
1116        %102 = OpLoad %6 %87
1117        %103 = OpIAdd %6 %102 %22
1118               OpStore %87 %103
1119               OpBranch %89
1120         %91 = OpLabel
1121               OpReturn
1122               OpFunctionEnd
1123         %14 = OpFunction %2 None %3
1124         %15 = OpLabel
1125        %104 = OpVariable %7 Function
1126        %106 = OpVariable %7 Function
1127        %108 = OpVariable %7 Function
1128        %117 = OpVariable %7 Function
1129        %127 = OpVariable %7 Function
1130        %129 = OpVariable %7 Function
1131        %134 = OpVariable %7 Function
1132        %143 = OpVariable %7 Function
1133        %145 = OpVariable %7 Function
1134        %147 = OpVariable %7 Function
1135               OpStore %104 %105
1136               OpStore %106 %107
1137               OpStore %108 %22
1138               OpBranch %109
1139        %109 = OpLabel
1140               OpLoopMerge %111 %112 None
1141               OpBranch %113
1142        %113 = OpLabel
1143        %114 = OpLoad %6 %108
1144        %115 = OpLoad %6 %106
1145        %116 = OpSLessThanEqual %31 %114 %115
1146               OpBranchConditional %116 %110 %111
1147        %110 = OpLabel
1148        %118 = OpLoad %6 %104
1149               OpStore %117 %118
1150               OpBranch %119
1151        %119 = OpLabel
1152               OpLoopMerge %121 %122 None
1153               OpBranch %123
1154        %123 = OpLabel
1155        %124 = OpLoad %6 %117
1156        %125 = OpLoad %6 %106
1157        %126 = OpSLessThan %31 %124 %125
1158               OpBranchConditional %126 %120 %121
1159        %120 = OpLabel
1160        %128 = OpLoad %6 %117
1161               OpStore %127 %128
1162        %130 = OpLoad %6 %117
1163        %131 = OpLoad %6 %108
1164        %132 = OpIAdd %6 %130 %131
1165        %133 = OpISub %6 %132 %22
1166               OpStore %129 %133
1167        %135 = OpLoad %6 %117
1168        %137 = OpLoad %6 %108
1169        %138 = OpIMul %6 %136 %137
1170        %139 = OpIAdd %6 %135 %138
1171        %140 = OpISub %6 %139 %22
1172        %141 = OpLoad %6 %106
1173        %142 = OpExtInst %6 %1 SMin %140 %141
1174               OpStore %134 %142
1175        %144 = OpLoad %6 %127
1176               OpStore %143 %144
1177        %146 = OpLoad %6 %129
1178               OpStore %145 %146
1179        %148 = OpLoad %6 %134
1180               OpStore %147 %148
1181        %149 = OpFunctionCall %2 %12 %143 %145 %147
1182               OpBranch %122
1183        %122 = OpLabel
1184        %150 = OpLoad %6 %108
1185        %151 = OpIMul %6 %136 %150
1186        %152 = OpLoad %6 %117
1187        %153 = OpIAdd %6 %152 %151
1188               OpStore %117 %153
1189               OpBranch %119
1190        %121 = OpLabel
1191               OpBranch %112
1192        %112 = OpLabel
1193        %154 = OpLoad %6 %108
1194        %155 = OpIMul %6 %136 %154
1195               OpStore %108 %155
1196               OpBranch %109
1197        %111 = OpLabel
1198               OpReturn
1199               OpFunctionEnd
1200END
1201
1202# uniforms for variant
1203
1204# injectionSwitch
1205BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
1206 0.0 1.0
1207END
1208# resolution
1209BUFFER variant_resolution DATA_TYPE vec2<float> DATA
1210 256.0 256.0
1211END
1212
1213BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
1214
1215PIPELINE graphics variant_pipeline
1216  ATTACH variant_vertex_shader
1217  ATTACH variant_fragment_shader
1218  FRAMEBUFFER_SIZE 256 256
1219  BIND BUFFER variant_framebuffer AS color LOCATION 0
1220  BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
1221  BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 1
1222END
1223CLEAR_COLOR variant_pipeline 0 0 0 255
1224
1225CLEAR variant_pipeline
1226RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
1227
1228EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
1229