Fix missing dependency on sparse binds
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / data / vulkan / amber / graphicsfuzz / stable-quicksort-max-value-as-index.amber
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: A fragment shader with greater of two values as index
21
22 # The test passes because both shaders render the same image.
23
24 # reference_vertex_shader is derived from the following GLSL:
25 # #version 310 es
26 # precision highp float;
27 #
28 # precision highp int;
29 #
30 # vec4 _GLF_FragCoord;
31 #
32 # layout(location = 0) in vec4 _GLF_pos;
33 #
34 # layout(location = 0) out vec4 frag_color;
35 #
36 # layout(set = 0, binding = 0) uniform buf0
37 # {
38 #   vec2 resolution;
39 # };
40 # struct QuicksortObject
41 # {
42 #   int numbers[10];
43 # };
44 #
45 # QuicksortObject obj;
46 #
47 # void swap(int i, int j)
48 # {
49 #   int temp = obj.numbers[i];
50 #   obj.numbers[i] = obj.numbers[j];
51 #   obj.numbers[j] = temp;
52 # }
53 # int performPartition(int l, int h)
54 # {
55 #   int pivot = obj.numbers[h];
56 #   int i = (l - 1);
57 #   for (int j = l; j <= h - 1; j++)
58 #   {
59 #     if (obj.numbers[j] <= pivot)
60 #     {
61 #       i++;
62 #       swap(i, j);
63 #     }
64 #   }
65 #   swap(i + 1, h);
66 #   return (i + 1);
67 # }
68 # void quicksort()
69 # {
70 #   int l = 0, h = 9;
71 #   int stack[10];
72 #   int top = -1;
73 #   stack[++top] = l;
74 #   stack[++top] = h;
75 #   while (top >= 0)
76 #   {
77 #     h = stack[top--];
78 #     l = stack[top--];
79 #     int p = performPartition(l, h);
80 #     if (p - 1 > l)
81 #     {
82 #       stack[++top] = l;
83 #       stack[++top] = p - 1;
84 #     }
85 #     if (p + 1 < h)
86 #     {
87 #       stack[++top] = p + 1;
88 #       stack[++top] = h;
89 #     }
90 #   }
91 # }
92 # void main()
93 # {
94 #   _GLF_FragCoord = (_GLF_pos + vec4(1.0, 1.0, 0.0, 0.0)) * vec4(128.0, 128.0, 1.0, 1.0);
95 #   for (int i = 0; i < 10; i++)
96 #   {
97 #     obj.numbers[i] = (10 - i);
98 #     obj.numbers[i] = obj.numbers[i] * obj.numbers[i];
99 #   }
100 #   quicksort();
101 #   vec2 uv = _GLF_FragCoord.xy / resolution;
102 #   vec3 color = vec3(1.0, 2.0, 3.0);
103 #   color.x += float(obj.numbers[0]);
104 #   if (uv.x > (1.0 / 4.0))
105 #   {
106 #     color.x += float(obj.numbers[1]);
107 #   }
108 #   if (uv.x > (2.0 / 4.0))
109 #   {
110 #     color.y += float(obj.numbers[2]);
111 #   }
112 #   if (uv.x > (3.0 / 4.0))
113 #   {
114 #     color.z += float(obj.numbers[3]);
115 #   }
116 #   color.y += float(obj.numbers[4]);
117 #   if (uv.y > (1.0 / 4.0))
118 #   {
119 #     color.x += float(obj.numbers[5]);
120 #   }
121 #   if (uv.y > (2.0 / 4.0))
122 #   {
123 #     color.y += float(obj.numbers[6]);
124 #   }
125 #   if (uv.y > (3.0 / 4.0))
126 #   {
127 #     color.z += float(obj.numbers[7]);
128 #   }
129 #   color.z += float(obj.numbers[8]);
130 #   if (abs(uv.x - uv.y) < 0.25)
131 #   {
132 #     color.x += float(obj.numbers[9]);
133 #   }
134 #   frag_color = vec4(normalize(color), 1.0);
135 #   gl_Position = _GLF_pos;
136 # }
137 SHADER vertex reference_vertex_shader SPIRV-ASM TARGET_ENV spv1.0
138 ; SPIR-V
139 ; Version: 1.0
140 ; Generator: Khronos Glslang Reference Front End; 8
141 ; Bound: 345
142 ; Schema: 0
143                OpCapability Shader
144           %1 = OpExtInstImport "GLSL.std.450"
145                OpMemoryModel Logical GLSL450
146                OpEntryPoint Vertex %4 "main" %157 %333 %342
147                OpSource ESSL 310
148                OpName %4 "main"
149                OpName %11 "swap(i1;i1;"
150                OpName %9 "i"
151                OpName %10 "j"
152                OpName %16 "performPartition(i1;i1;"
153                OpName %14 "l"
154                OpName %15 "h"
155                OpName %18 "quicksort("
156                OpName %20 "temp"
157                OpName %24 "QuicksortObject"
158                OpMemberName %24 0 "numbers"
159                OpName %26 "obj"
160                OpName %40 "pivot"
161                OpName %44 "i"
162                OpName %48 "j"
163                OpName %69 "param"
164                OpName %71 "param"
165                OpName %78 "param"
166                OpName %79 "param"
167                OpName %86 "l"
168                OpName %87 "h"
169                OpName %89 "top"
170                OpName %92 "stack"
171                OpName %116 "p"
172                OpName %117 "param"
173                OpName %119 "param"
174                OpName %155 "_GLF_FragCoord"
175                OpName %157 "_GLF_pos"
176                OpName %166 "i"
177                OpName %193 "uv"
178                OpName %196 "buf0"
179                OpMemberName %196 0 "resolution"
180                OpName %198 ""
181                OpName %205 "color"
182                OpName %333 "frag_color"
183                OpName %340 "gl_PerVertex"
184                OpMemberName %340 0 "gl_Position"
185                OpMemberName %340 1 "gl_PointSize"
186                OpName %342 ""
187                OpDecorate %157 Location 0
188                OpMemberDecorate %196 0 Offset 0
189                OpDecorate %196 Block
190                OpDecorate %198 DescriptorSet 0
191                OpDecorate %198 Binding 0
192                OpDecorate %333 Location 0
193                OpMemberDecorate %340 0 BuiltIn Position
194                OpMemberDecorate %340 1 BuiltIn PointSize
195                OpDecorate %340 Block
196           %2 = OpTypeVoid
197           %3 = OpTypeFunction %2
198           %6 = OpTypeInt 32 1
199           %7 = OpTypePointer Function %6
200           %8 = OpTypeFunction %2 %7 %7
201          %13 = OpTypeFunction %6 %7 %7
202          %21 = OpTypeInt 32 0
203          %22 = OpConstant %21 10
204          %23 = OpTypeArray %6 %22
205          %24 = OpTypeStruct %23
206          %25 = OpTypePointer Private %24
207          %26 = OpVariable %25 Private
208          %27 = OpConstant %6 0
209          %29 = OpTypePointer Private %6
210          %46 = OpConstant %6 1
211          %58 = OpTypeBool
212          %88 = OpConstant %6 9
213          %90 = OpConstant %6 -1
214          %91 = OpTypePointer Function %23
215         %152 = OpTypeFloat 32
216         %153 = OpTypeVector %152 4
217         %154 = OpTypePointer Private %153
218         %155 = OpVariable %154 Private
219         %156 = OpTypePointer Input %153
220         %157 = OpVariable %156 Input
221         %159 = OpConstant %152 1
222         %160 = OpConstant %152 0
223         %161 = OpConstantComposite %153 %159 %159 %160 %160
224         %163 = OpConstant %152 128
225         %164 = OpConstantComposite %153 %163 %163 %159 %159
226         %173 = OpConstant %6 10
227         %191 = OpTypeVector %152 2
228         %192 = OpTypePointer Function %191
229         %196 = OpTypeStruct %191
230         %197 = OpTypePointer Uniform %196
231         %198 = OpVariable %197 Uniform
232         %199 = OpTypePointer Uniform %191
233         %203 = OpTypeVector %152 3
234         %204 = OpTypePointer Function %203
235         %206 = OpConstant %152 2
236         %207 = OpConstant %152 3
237         %208 = OpConstantComposite %203 %159 %206 %207
238         %212 = OpConstant %21 0
239         %213 = OpTypePointer Function %152
240         %220 = OpConstant %152 0.25
241         %233 = OpConstant %152 0.5
242         %237 = OpConstant %6 2
243         %241 = OpConstant %21 1
244         %248 = OpConstant %152 0.75
245         %252 = OpConstant %6 3
246         %256 = OpConstant %21 2
247         %261 = OpConstant %6 4
248         %274 = OpConstant %6 5
249         %287 = OpConstant %6 6
250         %300 = OpConstant %6 7
251         %308 = OpConstant %6 8
252         %332 = OpTypePointer Output %153
253         %333 = OpVariable %332 Output
254         %340 = OpTypeStruct %153 %152
255         %341 = OpTypePointer Output %340
256         %342 = OpVariable %341 Output
257           %4 = OpFunction %2 None %3
258           %5 = OpLabel
259         %166 = OpVariable %7 Function
260         %193 = OpVariable %192 Function
261         %205 = OpVariable %204 Function
262         %158 = OpLoad %153 %157
263         %162 = OpFAdd %153 %158 %161
264         %165 = OpFMul %153 %162 %164
265                OpStore %155 %165
266                OpStore %166 %27
267                OpBranch %167
268         %167 = OpLabel
269                OpLoopMerge %169 %170 None
270                OpBranch %171
271         %171 = OpLabel
272         %172 = OpLoad %6 %166
273         %174 = OpSLessThan %58 %172 %173
274                OpBranchConditional %174 %168 %169
275         %168 = OpLabel
276         %175 = OpLoad %6 %166
277         %176 = OpLoad %6 %166
278         %177 = OpISub %6 %173 %176
279         %178 = OpAccessChain %29 %26 %27 %175
280                OpStore %178 %177
281         %179 = OpLoad %6 %166
282         %180 = OpLoad %6 %166
283         %181 = OpAccessChain %29 %26 %27 %180
284         %182 = OpLoad %6 %181
285         %183 = OpLoad %6 %166
286         %184 = OpAccessChain %29 %26 %27 %183
287         %185 = OpLoad %6 %184
288         %186 = OpIMul %6 %182 %185
289         %187 = OpAccessChain %29 %26 %27 %179
290                OpStore %187 %186
291                OpBranch %170
292         %170 = OpLabel
293         %188 = OpLoad %6 %166
294         %189 = OpIAdd %6 %188 %46
295                OpStore %166 %189
296                OpBranch %167
297         %169 = OpLabel
298         %190 = OpFunctionCall %2 %18
299         %194 = OpLoad %153 %155
300         %195 = OpVectorShuffle %191 %194 %194 0 1
301         %200 = OpAccessChain %199 %198 %27
302         %201 = OpLoad %191 %200
303         %202 = OpFDiv %191 %195 %201
304                OpStore %193 %202
305                OpStore %205 %208
306         %209 = OpAccessChain %29 %26 %27 %27
307         %210 = OpLoad %6 %209
308         %211 = OpConvertSToF %152 %210
309         %214 = OpAccessChain %213 %205 %212
310         %215 = OpLoad %152 %214
311         %216 = OpFAdd %152 %215 %211
312         %217 = OpAccessChain %213 %205 %212
313                OpStore %217 %216
314         %218 = OpAccessChain %213 %193 %212
315         %219 = OpLoad %152 %218
316         %221 = OpFOrdGreaterThan %58 %219 %220
317                OpSelectionMerge %223 None
318                OpBranchConditional %221 %222 %223
319         %222 = OpLabel
320         %224 = OpAccessChain %29 %26 %27 %46
321         %225 = OpLoad %6 %224
322         %226 = OpConvertSToF %152 %225
323         %227 = OpAccessChain %213 %205 %212
324         %228 = OpLoad %152 %227
325         %229 = OpFAdd %152 %228 %226
326         %230 = OpAccessChain %213 %205 %212
327                OpStore %230 %229
328                OpBranch %223
329         %223 = OpLabel
330         %231 = OpAccessChain %213 %193 %212
331         %232 = OpLoad %152 %231
332         %234 = OpFOrdGreaterThan %58 %232 %233
333                OpSelectionMerge %236 None
334                OpBranchConditional %234 %235 %236
335         %235 = OpLabel
336         %238 = OpAccessChain %29 %26 %27 %237
337         %239 = OpLoad %6 %238
338         %240 = OpConvertSToF %152 %239
339         %242 = OpAccessChain %213 %205 %241
340         %243 = OpLoad %152 %242
341         %244 = OpFAdd %152 %243 %240
342         %245 = OpAccessChain %213 %205 %241
343                OpStore %245 %244
344                OpBranch %236
345         %236 = OpLabel
346         %246 = OpAccessChain %213 %193 %212
347         %247 = OpLoad %152 %246
348         %249 = OpFOrdGreaterThan %58 %247 %248
349                OpSelectionMerge %251 None
350                OpBranchConditional %249 %250 %251
351         %250 = OpLabel
352         %253 = OpAccessChain %29 %26 %27 %252
353         %254 = OpLoad %6 %253
354         %255 = OpConvertSToF %152 %254
355         %257 = OpAccessChain %213 %205 %256
356         %258 = OpLoad %152 %257
357         %259 = OpFAdd %152 %258 %255
358         %260 = OpAccessChain %213 %205 %256
359                OpStore %260 %259
360                OpBranch %251
361         %251 = OpLabel
362         %262 = OpAccessChain %29 %26 %27 %261
363         %263 = OpLoad %6 %262
364         %264 = OpConvertSToF %152 %263
365         %265 = OpAccessChain %213 %205 %241
366         %266 = OpLoad %152 %265
367         %267 = OpFAdd %152 %266 %264
368         %268 = OpAccessChain %213 %205 %241
369                OpStore %268 %267
370         %269 = OpAccessChain %213 %193 %241
371         %270 = OpLoad %152 %269
372         %271 = OpFOrdGreaterThan %58 %270 %220
373                OpSelectionMerge %273 None
374                OpBranchConditional %271 %272 %273
375         %272 = OpLabel
376         %275 = OpAccessChain %29 %26 %27 %274
377         %276 = OpLoad %6 %275
378         %277 = OpConvertSToF %152 %276
379         %278 = OpAccessChain %213 %205 %212
380         %279 = OpLoad %152 %278
381         %280 = OpFAdd %152 %279 %277
382         %281 = OpAccessChain %213 %205 %212
383                OpStore %281 %280
384                OpBranch %273
385         %273 = OpLabel
386         %282 = OpAccessChain %213 %193 %241
387         %283 = OpLoad %152 %282
388         %284 = OpFOrdGreaterThan %58 %283 %233
389                OpSelectionMerge %286 None
390                OpBranchConditional %284 %285 %286
391         %285 = OpLabel
392         %288 = OpAccessChain %29 %26 %27 %287
393         %289 = OpLoad %6 %288
394         %290 = OpConvertSToF %152 %289
395         %291 = OpAccessChain %213 %205 %241
396         %292 = OpLoad %152 %291
397         %293 = OpFAdd %152 %292 %290
398         %294 = OpAccessChain %213 %205 %241
399                OpStore %294 %293
400                OpBranch %286
401         %286 = OpLabel
402         %295 = OpAccessChain %213 %193 %241
403         %296 = OpLoad %152 %295
404         %297 = OpFOrdGreaterThan %58 %296 %248
405                OpSelectionMerge %299 None
406                OpBranchConditional %297 %298 %299
407         %298 = OpLabel
408         %301 = OpAccessChain %29 %26 %27 %300
409         %302 = OpLoad %6 %301
410         %303 = OpConvertSToF %152 %302
411         %304 = OpAccessChain %213 %205 %256
412         %305 = OpLoad %152 %304
413         %306 = OpFAdd %152 %305 %303
414         %307 = OpAccessChain %213 %205 %256
415                OpStore %307 %306
416                OpBranch %299
417         %299 = OpLabel
418         %309 = OpAccessChain %29 %26 %27 %308
419         %310 = OpLoad %6 %309
420         %311 = OpConvertSToF %152 %310
421         %312 = OpAccessChain %213 %205 %256
422         %313 = OpLoad %152 %312
423         %314 = OpFAdd %152 %313 %311
424         %315 = OpAccessChain %213 %205 %256
425                OpStore %315 %314
426         %316 = OpAccessChain %213 %193 %212
427         %317 = OpLoad %152 %316
428         %318 = OpAccessChain %213 %193 %241
429         %319 = OpLoad %152 %318
430         %320 = OpFSub %152 %317 %319
431         %321 = OpExtInst %152 %1 FAbs %320
432         %322 = OpFOrdLessThan %58 %321 %220
433                OpSelectionMerge %324 None
434                OpBranchConditional %322 %323 %324
435         %323 = OpLabel
436         %325 = OpAccessChain %29 %26 %27 %88
437         %326 = OpLoad %6 %325
438         %327 = OpConvertSToF %152 %326
439         %328 = OpAccessChain %213 %205 %212
440         %329 = OpLoad %152 %328
441         %330 = OpFAdd %152 %329 %327
442         %331 = OpAccessChain %213 %205 %212
443                OpStore %331 %330
444                OpBranch %324
445         %324 = OpLabel
446         %334 = OpLoad %203 %205
447         %335 = OpExtInst %203 %1 Normalize %334
448         %336 = OpCompositeExtract %152 %335 0
449         %337 = OpCompositeExtract %152 %335 1
450         %338 = OpCompositeExtract %152 %335 2
451         %339 = OpCompositeConstruct %153 %336 %337 %338 %159
452                OpStore %333 %339
453         %343 = OpLoad %153 %157
454         %344 = OpAccessChain %332 %342 %27
455                OpStore %344 %343
456                OpReturn
457                OpFunctionEnd
458          %11 = OpFunction %2 None %8
459           %9 = OpFunctionParameter %7
460          %10 = OpFunctionParameter %7
461          %12 = OpLabel
462          %20 = OpVariable %7 Function
463          %28 = OpLoad %6 %9
464          %30 = OpAccessChain %29 %26 %27 %28
465          %31 = OpLoad %6 %30
466                OpStore %20 %31
467          %32 = OpLoad %6 %9
468          %33 = OpLoad %6 %10
469          %34 = OpAccessChain %29 %26 %27 %33
470          %35 = OpLoad %6 %34
471          %36 = OpAccessChain %29 %26 %27 %32
472                OpStore %36 %35
473          %37 = OpLoad %6 %10
474          %38 = OpLoad %6 %20
475          %39 = OpAccessChain %29 %26 %27 %37
476                OpStore %39 %38
477                OpReturn
478                OpFunctionEnd
479          %16 = OpFunction %6 None %13
480          %14 = OpFunctionParameter %7
481          %15 = OpFunctionParameter %7
482          %17 = OpLabel
483          %40 = OpVariable %7 Function
484          %44 = OpVariable %7 Function
485          %48 = OpVariable %7 Function
486          %69 = OpVariable %7 Function
487          %71 = OpVariable %7 Function
488          %78 = OpVariable %7 Function
489          %79 = OpVariable %7 Function
490          %41 = OpLoad %6 %15
491          %42 = OpAccessChain %29 %26 %27 %41
492          %43 = OpLoad %6 %42
493                OpStore %40 %43
494          %45 = OpLoad %6 %14
495          %47 = OpISub %6 %45 %46
496                OpStore %44 %47
497          %49 = OpLoad %6 %14
498                OpStore %48 %49
499                OpBranch %50
500          %50 = OpLabel
501                OpLoopMerge %52 %53 None
502                OpBranch %54
503          %54 = OpLabel
504          %55 = OpLoad %6 %48
505          %56 = OpLoad %6 %15
506          %57 = OpISub %6 %56 %46
507          %59 = OpSLessThanEqual %58 %55 %57
508                OpBranchConditional %59 %51 %52
509          %51 = OpLabel
510          %60 = OpLoad %6 %48
511          %61 = OpAccessChain %29 %26 %27 %60
512          %62 = OpLoad %6 %61
513          %63 = OpLoad %6 %40
514          %64 = OpSLessThanEqual %58 %62 %63
515                OpSelectionMerge %66 None
516                OpBranchConditional %64 %65 %66
517          %65 = OpLabel
518          %67 = OpLoad %6 %44
519          %68 = OpIAdd %6 %67 %46
520                OpStore %44 %68
521          %70 = OpLoad %6 %44
522                OpStore %69 %70
523          %72 = OpLoad %6 %48
524                OpStore %71 %72
525          %73 = OpFunctionCall %2 %11 %69 %71
526                OpBranch %66
527          %66 = OpLabel
528                OpBranch %53
529          %53 = OpLabel
530          %74 = OpLoad %6 %48
531          %75 = OpIAdd %6 %74 %46
532                OpStore %48 %75
533                OpBranch %50
534          %52 = OpLabel
535          %76 = OpLoad %6 %44
536          %77 = OpIAdd %6 %76 %46
537                OpStore %78 %77
538          %80 = OpLoad %6 %15
539                OpStore %79 %80
540          %81 = OpFunctionCall %2 %11 %78 %79
541          %82 = OpLoad %6 %44
542          %83 = OpIAdd %6 %82 %46
543                OpReturnValue %83
544                OpFunctionEnd
545          %18 = OpFunction %2 None %3
546          %19 = OpLabel
547          %86 = OpVariable %7 Function
548          %87 = OpVariable %7 Function
549          %89 = OpVariable %7 Function
550          %92 = OpVariable %91 Function
551         %116 = OpVariable %7 Function
552         %117 = OpVariable %7 Function
553         %119 = OpVariable %7 Function
554                OpStore %86 %27
555                OpStore %87 %88
556                OpStore %89 %90
557          %93 = OpLoad %6 %89
558          %94 = OpIAdd %6 %93 %46
559                OpStore %89 %94
560          %95 = OpLoad %6 %86
561          %96 = OpAccessChain %7 %92 %94
562                OpStore %96 %95
563          %97 = OpLoad %6 %89
564          %98 = OpIAdd %6 %97 %46
565                OpStore %89 %98
566          %99 = OpLoad %6 %87
567         %100 = OpAccessChain %7 %92 %98
568                OpStore %100 %99
569                OpBranch %101
570         %101 = OpLabel
571                OpLoopMerge %103 %104 None
572                OpBranch %105
573         %105 = OpLabel
574         %106 = OpLoad %6 %89
575         %107 = OpSGreaterThanEqual %58 %106 %27
576                OpBranchConditional %107 %102 %103
577         %102 = OpLabel
578         %108 = OpLoad %6 %89
579         %109 = OpISub %6 %108 %46
580                OpStore %89 %109
581         %110 = OpAccessChain %7 %92 %108
582         %111 = OpLoad %6 %110
583                OpStore %87 %111
584         %112 = OpLoad %6 %89
585         %113 = OpISub %6 %112 %46
586                OpStore %89 %113
587         %114 = OpAccessChain %7 %92 %112
588         %115 = OpLoad %6 %114
589                OpStore %86 %115
590         %118 = OpLoad %6 %86
591                OpStore %117 %118
592         %120 = OpLoad %6 %87
593                OpStore %119 %120
594         %121 = OpFunctionCall %6 %16 %117 %119
595                OpStore %116 %121
596         %122 = OpLoad %6 %116
597         %123 = OpISub %6 %122 %46
598         %124 = OpLoad %6 %86
599         %125 = OpSGreaterThan %58 %123 %124
600                OpSelectionMerge %127 None
601                OpBranchConditional %125 %126 %127
602         %126 = OpLabel
603         %128 = OpLoad %6 %89
604         %129 = OpIAdd %6 %128 %46
605                OpStore %89 %129
606         %130 = OpLoad %6 %86
607         %131 = OpAccessChain %7 %92 %129
608                OpStore %131 %130
609         %132 = OpLoad %6 %89
610         %133 = OpIAdd %6 %132 %46
611                OpStore %89 %133
612         %134 = OpLoad %6 %116
613         %135 = OpISub %6 %134 %46
614         %136 = OpAccessChain %7 %92 %133
615                OpStore %136 %135
616                OpBranch %127
617         %127 = OpLabel
618         %137 = OpLoad %6 %116
619         %138 = OpIAdd %6 %137 %46
620         %139 = OpLoad %6 %87
621         %140 = OpSLessThan %58 %138 %139
622                OpSelectionMerge %142 None
623                OpBranchConditional %140 %141 %142
624         %141 = OpLabel
625         %143 = OpLoad %6 %89
626         %144 = OpIAdd %6 %143 %46
627                OpStore %89 %144
628         %145 = OpLoad %6 %116
629         %146 = OpIAdd %6 %145 %46
630         %147 = OpAccessChain %7 %92 %144
631                OpStore %147 %146
632         %148 = OpLoad %6 %89
633         %149 = OpIAdd %6 %148 %46
634                OpStore %89 %149
635         %150 = OpLoad %6 %87
636         %151 = OpAccessChain %7 %92 %149
637                OpStore %151 %150
638                OpBranch %142
639         %142 = OpLabel
640                OpBranch %104
641         %104 = OpLabel
642                OpBranch %101
643         %103 = OpLabel
644                OpReturn
645                OpFunctionEnd
646 END
647
648 # reference_fragment_shader is derived from the following GLSL:
649 # #version 310 es
650 # precision highp float;
651 #
652 # layout(location = 0) out vec4 _GLF_color;
653 #
654 # layout(location = 0) in vec4 frag_color;
655 #
656 # void main()
657 # {
658 #  _GLF_color = frag_color;
659 # }
660 SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
661 ; SPIR-V
662 ; Version: 1.0
663 ; Generator: Khronos Glslang Reference Front End; 8
664 ; Bound: 13
665 ; Schema: 0
666                OpCapability Shader
667           %1 = OpExtInstImport "GLSL.std.450"
668                OpMemoryModel Logical GLSL450
669                OpEntryPoint Fragment %4 "main" %9 %11
670                OpExecutionMode %4 OriginUpperLeft
671                OpSource ESSL 310
672                OpName %4 "main"
673                OpName %9 "_GLF_color"
674                OpName %11 "frag_color"
675                OpDecorate %9 Location 0
676                OpDecorate %11 Location 0
677           %2 = OpTypeVoid
678           %3 = OpTypeFunction %2
679           %6 = OpTypeFloat 32
680           %7 = OpTypeVector %6 4
681           %8 = OpTypePointer Output %7
682           %9 = OpVariable %8 Output
683          %10 = OpTypePointer Input %7
684          %11 = OpVariable %10 Input
685           %4 = OpFunction %2 None %3
686           %5 = OpLabel
687          %12 = OpLoad %7 %11
688                OpStore %9 %12
689                OpReturn
690                OpFunctionEnd
691 END
692
693 # uniforms for reference
694
695 # resolution
696 BUFFER reference_resolution DATA_TYPE vec2<float> DATA
697  256.0 256.0
698 END
699
700 BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
701
702 PIPELINE graphics reference_pipeline
703   ATTACH reference_vertex_shader
704   ATTACH reference_fragment_shader
705   FRAMEBUFFER_SIZE 256 256
706   BIND BUFFER reference_framebuffer AS color LOCATION 0
707   BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
708 END
709 CLEAR_COLOR reference_pipeline 0 0 0 255
710
711 CLEAR reference_pipeline
712 RUN reference_pipeline DRAW_GRID POS 0 0 SIZE 256 256 CELLS 8 8
713
714
715 # variant_vertex_shader is derived from the following GLSL:
716 # #version 310 es
717 # precision highp float;
718 #
719 # precision highp int;
720 #
721 # layout(set = 0, binding = 0) uniform buf0
722 # {
723 #   highp vec2 injectionSwitch;
724 # };
725 # vec4 _GLF_FragCoord;
726 #
727 # layout(location = 0) in vec4 _GLF_pos;
728 #
729 # layout(location = 0) out vec4 frag_color;
730 #
731 # layout(set = 0, binding = 1) uniform buf1
732 # {
733 #   vec2 resolution;
734 # };
735 # struct QuicksortObject
736 # {
737 #   int numbers[10];
738 # };
739 #
740 # QuicksortObject obj;
741 #
742 # void swap(int i, int j)
743 # {
744 #   int temp = obj.numbers[i];
745 #   obj.numbers[i] = obj.numbers[j];
746 #   obj.numbers[j] = temp;
747 # }
748 # int performPartition(int l, int h)
749 # {
750 #   int pivot = obj.numbers[h];
751 #   int i = (l - 1);
752 #   for (int j = l; j <= h - 1; j++)
753 #   {
754 #     if (obj.numbers[j] <= pivot)
755 #     {
756 #       i++;
757 #       swap(i, j);
758 #     }
759 #   }
760 #   swap(i + 1, h);
761 #   return (i + 1);
762 # }
763 # void quicksort()
764 # {
765 #   int l = 0, h = 9;
766 #   int stack[10];
767 #   int top = -1;
768 #   stack[++top] = l;
769 #   stack[++top] = h;
770 #   while (top >= 0)
771 #   {
772 #     h = stack[top--];
773 #     l = stack[top--];
774 #     int p = performPartition(l, h);
775 #     if (p - 1 > l)
776 #     {
777 #       stack[++top] = l;
778 #       stack[++top] = p - 1;
779 #     }
780 #     if (p + 1 < h)
781 #     {
782 #       stack[++top] = p + 1;
783 #       stack[++top] = h;
784 #     }
785 #   }
786 # }
787 # void main()
788 # {
789 #   _GLF_FragCoord = (_GLF_pos + vec4(1.0, 1.0, 0.0, 0.0)) * vec4(128.0, 128.0, 1.0, 1.0);
790 #   for (int i = 0; i < 10; i++)
791 #   {
792 #     obj.numbers[i] = (10 - i);
793 #     obj.numbers[i] = obj.numbers[i] * obj.numbers[i];
794 #   }
795 #   quicksort();
796 #   vec2 uv = _GLF_FragCoord.xy / resolution;
797 #   vec3 color = vec3(1.0, 2.0, 3.0);
798 #   color.x += float(obj.numbers[0]);
799 #   if (uv.x > (1.0 / 4.0))
800 #   {
801 #     color.x += float(obj.numbers[1]);
802 #   }
803 #   if (uv.x > (2.0 / 4.0))
804 #   {
805 #     // Assigned value for color.y is set by float(obj.numbers[2]); below.
806 #     // Therefore it is the same as reference shader and should not affect the output.
807 #     //                             [            max((2*1 = 2), 2)         ]                    [            max((2*1 = 2), 2)         ]
808 #     color.y += max(float(obj.numbers[max((2) * int((injectionSwitch.y)), 2)]), float(obj.numbers[max((2) * int((injectionSwitch.y)), 2)]));
809 #   }
810 #   if (uv.x > (3.0 / 4.0))
811 #   {
812 #     color.z += float(obj.numbers[3]);
813 #   }
814 #   color.y += float(obj.numbers[4]);
815 #   if (uv.y > (1.0 / 4.0))
816 #   {
817 #     color.x += float(obj.numbers[5]);
818 #   }
819 #   if (uv.y > (2.0 / 4.0))
820 #   {
821 #     color.y += float(obj.numbers[6]);
822 #   }
823 #   if (uv.y > (3.0 / 4.0))
824 #   {
825 #     color.z += float(obj.numbers[7]);
826 #   }
827 #   color.z += float(obj.numbers[8]);
828 #   if (abs(uv.x - uv.y) < 0.25)
829 #   {
830 #     color.x += float(obj.numbers[9]);
831 #   }
832 #   frag_color = vec4(normalize(color), 1.0);
833 #   gl_Position = _GLF_pos;
834 # }
835 SHADER vertex variant_vertex_shader SPIRV-ASM TARGET_ENV spv1.0
836 ; SPIR-V
837 ; Version: 1.0
838 ; Generator: Khronos Glslang Reference Front End; 8
839 ; Bound: 363
840 ; Schema: 0
841                OpCapability Shader
842           %1 = OpExtInstImport "GLSL.std.450"
843                OpMemoryModel Logical GLSL450
844                OpEntryPoint Vertex %4 "main" %157 %351 %360
845                OpSource ESSL 310
846                OpName %4 "main"
847                OpName %11 "swap(i1;i1;"
848                OpName %9 "i"
849                OpName %10 "j"
850                OpName %16 "performPartition(i1;i1;"
851                OpName %14 "l"
852                OpName %15 "h"
853                OpName %18 "quicksort("
854                OpName %20 "temp"
855                OpName %24 "QuicksortObject"
856                OpMemberName %24 0 "numbers"
857                OpName %26 "obj"
858                OpName %40 "pivot"
859                OpName %44 "i"
860                OpName %48 "j"
861                OpName %69 "param"
862                OpName %71 "param"
863                OpName %78 "param"
864                OpName %79 "param"
865                OpName %86 "l"
866                OpName %87 "h"
867                OpName %89 "top"
868                OpName %92 "stack"
869                OpName %116 "p"
870                OpName %117 "param"
871                OpName %119 "param"
872                OpName %155 "_GLF_FragCoord"
873                OpName %157 "_GLF_pos"
874                OpName %166 "i"
875                OpName %193 "uv"
876                OpName %196 "buf1"
877                OpMemberName %196 0 "resolution"
878                OpName %198 ""
879                OpName %205 "color"
880                OpName %238 "buf0"
881                OpMemberName %238 0 "injectionSwitch"
882                OpName %240 ""
883                OpName %351 "frag_color"
884                OpName %358 "gl_PerVertex"
885                OpMemberName %358 0 "gl_Position"
886                OpMemberName %358 1 "gl_PointSize"
887                OpName %360 ""
888                OpDecorate %157 Location 0
889                OpMemberDecorate %196 0 Offset 0
890                OpDecorate %196 Block
891                OpDecorate %198 DescriptorSet 0
892                OpDecorate %198 Binding 1
893                OpMemberDecorate %238 0 Offset 0
894                OpDecorate %238 Block
895                OpDecorate %240 DescriptorSet 0
896                OpDecorate %240 Binding 0
897                OpDecorate %351 Location 0
898                OpMemberDecorate %358 0 BuiltIn Position
899                OpMemberDecorate %358 1 BuiltIn PointSize
900                OpDecorate %358 Block
901           %2 = OpTypeVoid
902           %3 = OpTypeFunction %2
903           %6 = OpTypeInt 32 1
904           %7 = OpTypePointer Function %6
905           %8 = OpTypeFunction %2 %7 %7
906          %13 = OpTypeFunction %6 %7 %7
907          %21 = OpTypeInt 32 0
908          %22 = OpConstant %21 10
909          %23 = OpTypeArray %6 %22
910          %24 = OpTypeStruct %23
911          %25 = OpTypePointer Private %24
912          %26 = OpVariable %25 Private
913          %27 = OpConstant %6 0
914          %29 = OpTypePointer Private %6
915          %46 = OpConstant %6 1
916          %58 = OpTypeBool
917          %88 = OpConstant %6 9
918          %90 = OpConstant %6 -1
919          %91 = OpTypePointer Function %23
920         %152 = OpTypeFloat 32
921         %153 = OpTypeVector %152 4
922         %154 = OpTypePointer Private %153
923         %155 = OpVariable %154 Private
924         %156 = OpTypePointer Input %153
925         %157 = OpVariable %156 Input
926         %159 = OpConstant %152 1
927         %160 = OpConstant %152 0
928         %161 = OpConstantComposite %153 %159 %159 %160 %160
929         %163 = OpConstant %152 128
930         %164 = OpConstantComposite %153 %163 %163 %159 %159
931         %173 = OpConstant %6 10
932         %191 = OpTypeVector %152 2
933         %192 = OpTypePointer Function %191
934         %196 = OpTypeStruct %191
935         %197 = OpTypePointer Uniform %196
936         %198 = OpVariable %197 Uniform
937         %199 = OpTypePointer Uniform %191
938         %203 = OpTypeVector %152 3
939         %204 = OpTypePointer Function %203
940         %206 = OpConstant %152 2
941         %207 = OpConstant %152 3
942         %208 = OpConstantComposite %203 %159 %206 %207
943         %212 = OpConstant %21 0
944         %213 = OpTypePointer Function %152
945         %220 = OpConstant %152 0.25
946         %233 = OpConstant %152 0.5
947         %237 = OpConstant %6 2
948         %238 = OpTypeStruct %191
949         %239 = OpTypePointer Uniform %238
950         %240 = OpVariable %239 Uniform
951         %241 = OpConstant %21 1
952         %242 = OpTypePointer Uniform %152
953         %266 = OpConstant %152 0.75
954         %270 = OpConstant %6 3
955         %274 = OpConstant %21 2
956         %279 = OpConstant %6 4
957         %292 = OpConstant %6 5
958         %305 = OpConstant %6 6
959         %318 = OpConstant %6 7
960         %326 = OpConstant %6 8
961         %350 = OpTypePointer Output %153
962         %351 = OpVariable %350 Output
963         %358 = OpTypeStruct %153 %152
964         %359 = OpTypePointer Output %358
965         %360 = OpVariable %359 Output
966           %4 = OpFunction %2 None %3
967           %5 = OpLabel
968         %166 = OpVariable %7 Function
969         %193 = OpVariable %192 Function
970         %205 = OpVariable %204 Function
971         %158 = OpLoad %153 %157
972         %162 = OpFAdd %153 %158 %161
973         %165 = OpFMul %153 %162 %164
974                OpStore %155 %165
975                OpStore %166 %27
976                OpBranch %167
977         %167 = OpLabel
978                OpLoopMerge %169 %170 None
979                OpBranch %171
980         %171 = OpLabel
981         %172 = OpLoad %6 %166
982         %174 = OpSLessThan %58 %172 %173
983                OpBranchConditional %174 %168 %169
984         %168 = OpLabel
985         %175 = OpLoad %6 %166
986         %176 = OpLoad %6 %166
987         %177 = OpISub %6 %173 %176
988         %178 = OpAccessChain %29 %26 %27 %175
989                OpStore %178 %177
990         %179 = OpLoad %6 %166
991         %180 = OpLoad %6 %166
992         %181 = OpAccessChain %29 %26 %27 %180
993         %182 = OpLoad %6 %181
994         %183 = OpLoad %6 %166
995         %184 = OpAccessChain %29 %26 %27 %183
996         %185 = OpLoad %6 %184
997         %186 = OpIMul %6 %182 %185
998         %187 = OpAccessChain %29 %26 %27 %179
999                OpStore %187 %186
1000                OpBranch %170
1001         %170 = OpLabel
1002         %188 = OpLoad %6 %166
1003         %189 = OpIAdd %6 %188 %46
1004                OpStore %166 %189
1005                OpBranch %167
1006         %169 = OpLabel
1007         %190 = OpFunctionCall %2 %18
1008         %194 = OpLoad %153 %155
1009         %195 = OpVectorShuffle %191 %194 %194 0 1
1010         %200 = OpAccessChain %199 %198 %27
1011         %201 = OpLoad %191 %200
1012         %202 = OpFDiv %191 %195 %201
1013                OpStore %193 %202
1014                OpStore %205 %208
1015         %209 = OpAccessChain %29 %26 %27 %27
1016         %210 = OpLoad %6 %209
1017         %211 = OpConvertSToF %152 %210
1018         %214 = OpAccessChain %213 %205 %212
1019         %215 = OpLoad %152 %214
1020         %216 = OpFAdd %152 %215 %211
1021         %217 = OpAccessChain %213 %205 %212
1022                OpStore %217 %216
1023         %218 = OpAccessChain %213 %193 %212
1024         %219 = OpLoad %152 %218
1025         %221 = OpFOrdGreaterThan %58 %219 %220
1026                OpSelectionMerge %223 None
1027                OpBranchConditional %221 %222 %223
1028         %222 = OpLabel
1029         %224 = OpAccessChain %29 %26 %27 %46
1030         %225 = OpLoad %6 %224
1031         %226 = OpConvertSToF %152 %225
1032         %227 = OpAccessChain %213 %205 %212
1033         %228 = OpLoad %152 %227
1034         %229 = OpFAdd %152 %228 %226
1035         %230 = OpAccessChain %213 %205 %212
1036                OpStore %230 %229
1037                OpBranch %223
1038         %223 = OpLabel
1039         %231 = OpAccessChain %213 %193 %212
1040         %232 = OpLoad %152 %231
1041         %234 = OpFOrdGreaterThan %58 %232 %233
1042                OpSelectionMerge %236 None
1043                OpBranchConditional %234 %235 %236
1044         %235 = OpLabel
1045         %243 = OpAccessChain %242 %240 %27 %241
1046         %244 = OpLoad %152 %243
1047         %245 = OpConvertFToS %6 %244
1048         %246 = OpIMul %6 %237 %245
1049         %247 = OpExtInst %6 %1 SMax %246 %237
1050         %248 = OpAccessChain %29 %26 %27 %247
1051         %249 = OpLoad %6 %248
1052         %250 = OpConvertSToF %152 %249
1053         %251 = OpAccessChain %242 %240 %27 %241
1054         %252 = OpLoad %152 %251
1055         %253 = OpConvertFToS %6 %252
1056         %254 = OpIMul %6 %237 %253
1057         %255 = OpExtInst %6 %1 SMax %254 %237
1058         %256 = OpAccessChain %29 %26 %27 %255
1059         %257 = OpLoad %6 %256
1060         %258 = OpConvertSToF %152 %257
1061         %259 = OpExtInst %152 %1 FMax %250 %258
1062         %260 = OpAccessChain %213 %205 %241
1063         %261 = OpLoad %152 %260
1064         %262 = OpFAdd %152 %261 %259
1065         %263 = OpAccessChain %213 %205 %241
1066                OpStore %263 %262
1067                OpBranch %236
1068         %236 = OpLabel
1069         %264 = OpAccessChain %213 %193 %212
1070         %265 = OpLoad %152 %264
1071         %267 = OpFOrdGreaterThan %58 %265 %266
1072                OpSelectionMerge %269 None
1073                OpBranchConditional %267 %268 %269
1074         %268 = OpLabel
1075         %271 = OpAccessChain %29 %26 %27 %270
1076         %272 = OpLoad %6 %271
1077         %273 = OpConvertSToF %152 %272
1078         %275 = OpAccessChain %213 %205 %274
1079         %276 = OpLoad %152 %275
1080         %277 = OpFAdd %152 %276 %273
1081         %278 = OpAccessChain %213 %205 %274
1082                OpStore %278 %277
1083                OpBranch %269
1084         %269 = OpLabel
1085         %280 = OpAccessChain %29 %26 %27 %279
1086         %281 = OpLoad %6 %280
1087         %282 = OpConvertSToF %152 %281
1088         %283 = OpAccessChain %213 %205 %241
1089         %284 = OpLoad %152 %283
1090         %285 = OpFAdd %152 %284 %282
1091         %286 = OpAccessChain %213 %205 %241
1092                OpStore %286 %285
1093         %287 = OpAccessChain %213 %193 %241
1094         %288 = OpLoad %152 %287
1095         %289 = OpFOrdGreaterThan %58 %288 %220
1096                OpSelectionMerge %291 None
1097                OpBranchConditional %289 %290 %291
1098         %290 = OpLabel
1099         %293 = OpAccessChain %29 %26 %27 %292
1100         %294 = OpLoad %6 %293
1101         %295 = OpConvertSToF %152 %294
1102         %296 = OpAccessChain %213 %205 %212
1103         %297 = OpLoad %152 %296
1104         %298 = OpFAdd %152 %297 %295
1105         %299 = OpAccessChain %213 %205 %212
1106                OpStore %299 %298
1107                OpBranch %291
1108         %291 = OpLabel
1109         %300 = OpAccessChain %213 %193 %241
1110         %301 = OpLoad %152 %300
1111         %302 = OpFOrdGreaterThan %58 %301 %233
1112                OpSelectionMerge %304 None
1113                OpBranchConditional %302 %303 %304
1114         %303 = OpLabel
1115         %306 = OpAccessChain %29 %26 %27 %305
1116         %307 = OpLoad %6 %306
1117         %308 = OpConvertSToF %152 %307
1118         %309 = OpAccessChain %213 %205 %241
1119         %310 = OpLoad %152 %309
1120         %311 = OpFAdd %152 %310 %308
1121         %312 = OpAccessChain %213 %205 %241
1122                OpStore %312 %311
1123                OpBranch %304
1124         %304 = OpLabel
1125         %313 = OpAccessChain %213 %193 %241
1126         %314 = OpLoad %152 %313
1127         %315 = OpFOrdGreaterThan %58 %314 %266
1128                OpSelectionMerge %317 None
1129                OpBranchConditional %315 %316 %317
1130         %316 = OpLabel
1131         %319 = OpAccessChain %29 %26 %27 %318
1132         %320 = OpLoad %6 %319
1133         %321 = OpConvertSToF %152 %320
1134         %322 = OpAccessChain %213 %205 %274
1135         %323 = OpLoad %152 %322
1136         %324 = OpFAdd %152 %323 %321
1137         %325 = OpAccessChain %213 %205 %274
1138                OpStore %325 %324
1139                OpBranch %317
1140         %317 = OpLabel
1141         %327 = OpAccessChain %29 %26 %27 %326
1142         %328 = OpLoad %6 %327
1143         %329 = OpConvertSToF %152 %328
1144         %330 = OpAccessChain %213 %205 %274
1145         %331 = OpLoad %152 %330
1146         %332 = OpFAdd %152 %331 %329
1147         %333 = OpAccessChain %213 %205 %274
1148                OpStore %333 %332
1149         %334 = OpAccessChain %213 %193 %212
1150         %335 = OpLoad %152 %334
1151         %336 = OpAccessChain %213 %193 %241
1152         %337 = OpLoad %152 %336
1153         %338 = OpFSub %152 %335 %337
1154         %339 = OpExtInst %152 %1 FAbs %338
1155         %340 = OpFOrdLessThan %58 %339 %220
1156                OpSelectionMerge %342 None
1157                OpBranchConditional %340 %341 %342
1158         %341 = OpLabel
1159         %343 = OpAccessChain %29 %26 %27 %88
1160         %344 = OpLoad %6 %343
1161         %345 = OpConvertSToF %152 %344
1162         %346 = OpAccessChain %213 %205 %212
1163         %347 = OpLoad %152 %346
1164         %348 = OpFAdd %152 %347 %345
1165         %349 = OpAccessChain %213 %205 %212
1166                OpStore %349 %348
1167                OpBranch %342
1168         %342 = OpLabel
1169         %352 = OpLoad %203 %205
1170         %353 = OpExtInst %203 %1 Normalize %352
1171         %354 = OpCompositeExtract %152 %353 0
1172         %355 = OpCompositeExtract %152 %353 1
1173         %356 = OpCompositeExtract %152 %353 2
1174         %357 = OpCompositeConstruct %153 %354 %355 %356 %159
1175                OpStore %351 %357
1176         %361 = OpLoad %153 %157
1177         %362 = OpAccessChain %350 %360 %27
1178                OpStore %362 %361
1179                OpReturn
1180                OpFunctionEnd
1181          %11 = OpFunction %2 None %8
1182           %9 = OpFunctionParameter %7
1183          %10 = OpFunctionParameter %7
1184          %12 = OpLabel
1185          %20 = OpVariable %7 Function
1186          %28 = OpLoad %6 %9
1187          %30 = OpAccessChain %29 %26 %27 %28
1188          %31 = OpLoad %6 %30
1189                OpStore %20 %31
1190          %32 = OpLoad %6 %9
1191          %33 = OpLoad %6 %10
1192          %34 = OpAccessChain %29 %26 %27 %33
1193          %35 = OpLoad %6 %34
1194          %36 = OpAccessChain %29 %26 %27 %32
1195                OpStore %36 %35
1196          %37 = OpLoad %6 %10
1197          %38 = OpLoad %6 %20
1198          %39 = OpAccessChain %29 %26 %27 %37
1199                OpStore %39 %38
1200                OpReturn
1201                OpFunctionEnd
1202          %16 = OpFunction %6 None %13
1203          %14 = OpFunctionParameter %7
1204          %15 = OpFunctionParameter %7
1205          %17 = OpLabel
1206          %40 = OpVariable %7 Function
1207          %44 = OpVariable %7 Function
1208          %48 = OpVariable %7 Function
1209          %69 = OpVariable %7 Function
1210          %71 = OpVariable %7 Function
1211          %78 = OpVariable %7 Function
1212          %79 = OpVariable %7 Function
1213          %41 = OpLoad %6 %15
1214          %42 = OpAccessChain %29 %26 %27 %41
1215          %43 = OpLoad %6 %42
1216                OpStore %40 %43
1217          %45 = OpLoad %6 %14
1218          %47 = OpISub %6 %45 %46
1219                OpStore %44 %47
1220          %49 = OpLoad %6 %14
1221                OpStore %48 %49
1222                OpBranch %50
1223          %50 = OpLabel
1224                OpLoopMerge %52 %53 None
1225                OpBranch %54
1226          %54 = OpLabel
1227          %55 = OpLoad %6 %48
1228          %56 = OpLoad %6 %15
1229          %57 = OpISub %6 %56 %46
1230          %59 = OpSLessThanEqual %58 %55 %57
1231                OpBranchConditional %59 %51 %52
1232          %51 = OpLabel
1233          %60 = OpLoad %6 %48
1234          %61 = OpAccessChain %29 %26 %27 %60
1235          %62 = OpLoad %6 %61
1236          %63 = OpLoad %6 %40
1237          %64 = OpSLessThanEqual %58 %62 %63
1238                OpSelectionMerge %66 None
1239                OpBranchConditional %64 %65 %66
1240          %65 = OpLabel
1241          %67 = OpLoad %6 %44
1242          %68 = OpIAdd %6 %67 %46
1243                OpStore %44 %68
1244          %70 = OpLoad %6 %44
1245                OpStore %69 %70
1246          %72 = OpLoad %6 %48
1247                OpStore %71 %72
1248          %73 = OpFunctionCall %2 %11 %69 %71
1249                OpBranch %66
1250          %66 = OpLabel
1251                OpBranch %53
1252          %53 = OpLabel
1253          %74 = OpLoad %6 %48
1254          %75 = OpIAdd %6 %74 %46
1255                OpStore %48 %75
1256                OpBranch %50
1257          %52 = OpLabel
1258          %76 = OpLoad %6 %44
1259          %77 = OpIAdd %6 %76 %46
1260                OpStore %78 %77
1261          %80 = OpLoad %6 %15
1262                OpStore %79 %80
1263          %81 = OpFunctionCall %2 %11 %78 %79
1264          %82 = OpLoad %6 %44
1265          %83 = OpIAdd %6 %82 %46
1266                OpReturnValue %83
1267                OpFunctionEnd
1268          %18 = OpFunction %2 None %3
1269          %19 = OpLabel
1270          %86 = OpVariable %7 Function
1271          %87 = OpVariable %7 Function
1272          %89 = OpVariable %7 Function
1273          %92 = OpVariable %91 Function
1274         %116 = OpVariable %7 Function
1275         %117 = OpVariable %7 Function
1276         %119 = OpVariable %7 Function
1277                OpStore %86 %27
1278                OpStore %87 %88
1279                OpStore %89 %90
1280          %93 = OpLoad %6 %89
1281          %94 = OpIAdd %6 %93 %46
1282                OpStore %89 %94
1283          %95 = OpLoad %6 %86
1284          %96 = OpAccessChain %7 %92 %94
1285                OpStore %96 %95
1286          %97 = OpLoad %6 %89
1287          %98 = OpIAdd %6 %97 %46
1288                OpStore %89 %98
1289          %99 = OpLoad %6 %87
1290         %100 = OpAccessChain %7 %92 %98
1291                OpStore %100 %99
1292                OpBranch %101
1293         %101 = OpLabel
1294                OpLoopMerge %103 %104 None
1295                OpBranch %105
1296         %105 = OpLabel
1297         %106 = OpLoad %6 %89
1298         %107 = OpSGreaterThanEqual %58 %106 %27
1299                OpBranchConditional %107 %102 %103
1300         %102 = OpLabel
1301         %108 = OpLoad %6 %89
1302         %109 = OpISub %6 %108 %46
1303                OpStore %89 %109
1304         %110 = OpAccessChain %7 %92 %108
1305         %111 = OpLoad %6 %110
1306                OpStore %87 %111
1307         %112 = OpLoad %6 %89
1308         %113 = OpISub %6 %112 %46
1309                OpStore %89 %113
1310         %114 = OpAccessChain %7 %92 %112
1311         %115 = OpLoad %6 %114
1312                OpStore %86 %115
1313         %118 = OpLoad %6 %86
1314                OpStore %117 %118
1315         %120 = OpLoad %6 %87
1316                OpStore %119 %120
1317         %121 = OpFunctionCall %6 %16 %117 %119
1318                OpStore %116 %121
1319         %122 = OpLoad %6 %116
1320         %123 = OpISub %6 %122 %46
1321         %124 = OpLoad %6 %86
1322         %125 = OpSGreaterThan %58 %123 %124
1323                OpSelectionMerge %127 None
1324                OpBranchConditional %125 %126 %127
1325         %126 = OpLabel
1326         %128 = OpLoad %6 %89
1327         %129 = OpIAdd %6 %128 %46
1328                OpStore %89 %129
1329         %130 = OpLoad %6 %86
1330         %131 = OpAccessChain %7 %92 %129
1331                OpStore %131 %130
1332         %132 = OpLoad %6 %89
1333         %133 = OpIAdd %6 %132 %46
1334                OpStore %89 %133
1335         %134 = OpLoad %6 %116
1336         %135 = OpISub %6 %134 %46
1337         %136 = OpAccessChain %7 %92 %133
1338                OpStore %136 %135
1339                OpBranch %127
1340         %127 = OpLabel
1341         %137 = OpLoad %6 %116
1342         %138 = OpIAdd %6 %137 %46
1343         %139 = OpLoad %6 %87
1344         %140 = OpSLessThan %58 %138 %139
1345                OpSelectionMerge %142 None
1346                OpBranchConditional %140 %141 %142
1347         %141 = OpLabel
1348         %143 = OpLoad %6 %89
1349         %144 = OpIAdd %6 %143 %46
1350                OpStore %89 %144
1351         %145 = OpLoad %6 %116
1352         %146 = OpIAdd %6 %145 %46
1353         %147 = OpAccessChain %7 %92 %144
1354                OpStore %147 %146
1355         %148 = OpLoad %6 %89
1356         %149 = OpIAdd %6 %148 %46
1357                OpStore %89 %149
1358         %150 = OpLoad %6 %87
1359         %151 = OpAccessChain %7 %92 %149
1360                OpStore %151 %150
1361                OpBranch %142
1362         %142 = OpLabel
1363                OpBranch %104
1364         %104 = OpLabel
1365                OpBranch %101
1366         %103 = OpLabel
1367                OpReturn
1368                OpFunctionEnd
1369 END
1370
1371 # variant_fragment_shader is derived from the following GLSL:
1372 # #version 310 es
1373 # precision highp float;
1374 #
1375 # layout(location = 0) out vec4 _GLF_color;
1376 #
1377 # layout(location = 0) in vec4 frag_color;
1378 #
1379 # void main()
1380 # {
1381 #  _GLF_color = frag_color;
1382 # }
1383 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
1384 ; SPIR-V
1385 ; Version: 1.0
1386 ; Generator: Khronos Glslang Reference Front End; 8
1387 ; Bound: 13
1388 ; Schema: 0
1389                OpCapability Shader
1390           %1 = OpExtInstImport "GLSL.std.450"
1391                OpMemoryModel Logical GLSL450
1392                OpEntryPoint Fragment %4 "main" %9 %11
1393                OpExecutionMode %4 OriginUpperLeft
1394                OpSource ESSL 310
1395                OpName %4 "main"
1396                OpName %9 "_GLF_color"
1397                OpName %11 "frag_color"
1398                OpDecorate %9 Location 0
1399                OpDecorate %11 Location 0
1400           %2 = OpTypeVoid
1401           %3 = OpTypeFunction %2
1402           %6 = OpTypeFloat 32
1403           %7 = OpTypeVector %6 4
1404           %8 = OpTypePointer Output %7
1405           %9 = OpVariable %8 Output
1406          %10 = OpTypePointer Input %7
1407          %11 = OpVariable %10 Input
1408           %4 = OpFunction %2 None %3
1409           %5 = OpLabel
1410          %12 = OpLoad %7 %11
1411                OpStore %9 %12
1412                OpReturn
1413                OpFunctionEnd
1414 END
1415
1416 # uniforms for variant
1417
1418 # resolution
1419 BUFFER variant_resolution DATA_TYPE vec2<float> DATA
1420  256.0 256.0
1421 END
1422 # injectionSwitch
1423 BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
1424  0.0 1.0
1425 END
1426
1427 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
1428
1429 PIPELINE graphics variant_pipeline
1430   ATTACH variant_vertex_shader
1431   ATTACH variant_fragment_shader
1432   FRAMEBUFFER_SIZE 256 256
1433   BIND BUFFER variant_framebuffer AS color LOCATION 0
1434   BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 1
1435   BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
1436 END
1437 CLEAR_COLOR variant_pipeline 0 0 0 255
1438
1439 CLEAR variant_pipeline
1440 RUN variant_pipeline DRAW_GRID POS 0 0 SIZE 256 256 CELLS 8 8
1441
1442 EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005