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