• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!amber
2
3# Copyright 2022 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 coverage-gap found by the GraphicsFuzz project.
19
20# Short description: A fragment shader that covers specific LLVM code paths
21
22# The test passes because the shader always writes red.
23
24SHADER vertex variant_vertex_shader PASSTHROUGH
25
26# variant_fragment_shader is derived from the following GLSL:
27# #version 320 es
28#
29# #define _int_1 _GLF_uniform_int_values[0]
30# #define _int_0 _GLF_uniform_int_values[1]
31# #define _int_100 _GLF_uniform_int_values[2]
32# #define _int_30 _GLF_uniform_int_values[3]
33# #define _int_6 _GLF_uniform_int_values[4]
34# #define _int_35 _GLF_uniform_int_values[5]
35# #define _int_8 _GLF_uniform_int_values[6]
36# #define _float_1_0 _GLF_uniform_float_values[0]
37# #define _float_0_0 _GLF_uniform_float_values[1]
38#
39# precision highp float;
40# precision highp int;
41#
42# // Contents of _GLF_uniform_float_values: [1.0, 0.0]
43# layout(set = 0, binding = 0) uniform buf0
44# {
45#     float _GLF_uniform_float_values[2];
46# };
47#
48# // Contents of _GLF_uniform_int_values: [1, 0, 100, 30, 6, 35, 8]
49# layout(set = 0, binding = 1) uniform buf1
50# {
51#     int _GLF_uniform_int_values[7];
52# };
53#
54# // Contents of injectionSwitch: [0.0, 1.0]
55# layout(set = 0, binding = 2) uniform buf2
56# {
57#     vec2 injectionSwitch;
58# };
59#
60# layout(location = 0) out vec4 _GLF_color;
61#
62# int arr[10] = int[10](1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
63#
64# void func0(int x)
65# {
66#     int a = _int_1;
67#
68#     for(int i = 0; i < 4; i ++)
69#     {
70#         // Always false.
71#         if(x == 1)
72#         {
73#             return;
74#         }
75#
76#         // a stays at value one.
77#         a = arr[a];
78#
79#         // Always false.
80#         if(injectionSwitch.x > injectionSwitch.y)
81#         {
82#             frexp(1.0, x);
83#
84#             for(int j = _int_8; a < 10; j ++)
85#             {
86#                 if(float[10](_float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0)[a] > _float_0_0)
87#                 {
88#                     a = j;
89#                 }
90#             }
91#         }
92#     }
93# }
94#
95# // This value never changes.
96# float f = 1.0;
97#
98# // This function always returns vec3(1, 1, 1).
99# vec3 func1(vec2 v)
100# {
101#     if(v.x > _float_1_0)
102#     {
103#         return vec3(_int_1);
104#     }
105#
106#     if(v.y < _float_1_0)
107#     {
108#         // f stays at value one.
109#         f = min(_float_1_0, f);
110#
111#         return vec3(_int_1, _int_1, f);
112#     }
113#
114#     if(v.y > _float_1_0)
115#     {
116#         // f stays at value one.
117#         f = clamp(_float_1_0, _float_1_0, f);
118#     }
119#
120#     return vec3(_int_1);
121# }
122#
123# // This function is always called with a zero matrix
124# // and always returns vec3(1, 1, 1).
125# vec3 func2(mat2 m)
126# {
127#     func0(_int_6);
128#     func0(30);
129#
130#     // v0 = vec2(0, 0).
131#     vec2 v0 = vec2(_float_1_0) * m;
132#     vec3 v1 = vec3(_float_1_0);
133#
134#     for(int i = _int_0; i < _int_35; i ++)
135#     {
136#         // v2 = vec3(1, 1, 1);
137#         vec3 v2 = func1(v0);
138#
139#         // Always false.
140#         if(length(v2) <= _float_1_0)
141#         {
142#             continue;
143#         }
144#
145#         // v1 stays at value (1, 1, 1).
146#         v1 = v2;
147#     }
148#
149#
150#     return v1;
151# }
152#
153# void main()
154# {
155#     // Always false.
156#     if(injectionSwitch.x > injectionSwitch.y)
157#     {
158#         return;
159#     }
160#
161#     // v = vec3(1, 1, 1).
162#     vec3 v = func2(mat2(_float_0_0, cos(_float_0_0), _float_0_0, _float_0_0));
163#     func2(mat2(_int_0));
164#     func0(_int_100);
165#     func0(_int_30);
166#     func2(mat2(_int_0));
167#
168#     // Always true.
169#     if(f == _float_1_0)
170#     {
171#         _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
172#     }
173#     else
174#     {
175#         _GLF_color = vec4(v, _int_0);
176#     }
177# }
178SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
179; SPIR-V
180; Version: 1.0
181; Generator: Khronos Glslang Reference Front End; 10
182; Bound: 318
183; Schema: 0
184               OpCapability Shader
185          %1 = OpExtInstImport "GLSL.std.450"
186               OpMemoryModel Logical GLSL450
187               OpEntryPoint Fragment %4 "main" %295
188               OpExecutionMode %4 OriginUpperLeft
189               OpSource ESSL 320
190               OpName %4 "main"
191               OpName %10 "func0(i1;"
192               OpName %9 "x"
193               OpName %18 "func1(vf2;"
194               OpName %17 "v"
195               OpName %24 "func2(mf22;"
196               OpName %23 "m"
197               OpName %30 "arr"
198               OpName %34 "f"
199               OpName %36 "a"
200               OpName %39 "buf1"
201               OpMemberName %39 0 "_GLF_uniform_int_values"
202               OpName %41 ""
203               OpName %46 "i"
204               OpName %65 "buf2"
205               OpMemberName %65 0 "injectionSwitch"
206               OpName %67 ""
207               OpName %78 "ResType"
208               OpName %82 "j"
209               OpName %96 "buf0"
210               OpMemberName %96 0 "_GLF_uniform_float_values"
211               OpName %98 ""
212               OpName %123 "indexable"
213               OpName %188 "param"
214               OpName %193 "param"
215               OpName %195 "v0"
216               OpName %202 "v1"
217               OpName %206 "i"
218               OpName %219 "v2"
219               OpName %220 "param"
220               OpName %245 "v"
221               OpName %259 "param"
222               OpName %267 "param"
223               OpName %270 "param"
224               OpName %275 "param"
225               OpName %285 "param"
226               OpName %295 "_GLF_color"
227               OpDecorate %38 ArrayStride 16
228               OpMemberDecorate %39 0 Offset 0
229               OpDecorate %39 Block
230               OpDecorate %41 DescriptorSet 0
231               OpDecorate %41 Binding 1
232               OpMemberDecorate %65 0 Offset 0
233               OpDecorate %65 Block
234               OpDecorate %67 DescriptorSet 0
235               OpDecorate %67 Binding 2
236               OpDecorate %95 ArrayStride 16
237               OpMemberDecorate %96 0 Offset 0
238               OpDecorate %96 Block
239               OpDecorate %98 DescriptorSet 0
240               OpDecorate %98 Binding 0
241               OpDecorate %295 Location 0
242          %2 = OpTypeVoid
243          %3 = OpTypeFunction %2
244          %6 = OpTypeInt 32 1
245          %7 = OpTypePointer Function %6
246          %8 = OpTypeFunction %2 %7
247         %12 = OpTypeFloat 32
248         %13 = OpTypeVector %12 2
249         %14 = OpTypePointer Function %13
250         %15 = OpTypeVector %12 3
251         %16 = OpTypeFunction %15 %14
252         %20 = OpTypeMatrix %13 2
253         %21 = OpTypePointer Function %20
254         %22 = OpTypeFunction %15 %21
255         %26 = OpTypeInt 32 0
256         %27 = OpConstant %26 10
257         %28 = OpTypeArray %6 %27
258         %29 = OpTypePointer Private %28
259         %30 = OpVariable %29 Private
260         %31 = OpConstant %6 1
261         %32 = OpConstantComposite %28 %31 %31 %31 %31 %31 %31 %31 %31 %31 %31
262         %33 = OpTypePointer Private %12
263         %34 = OpVariable %33 Private
264         %35 = OpConstant %12 1
265         %37 = OpConstant %26 7
266         %38 = OpTypeArray %6 %37
267         %39 = OpTypeStruct %38
268         %40 = OpTypePointer Uniform %39
269         %41 = OpVariable %40 Uniform
270         %42 = OpConstant %6 0
271         %43 = OpTypePointer Uniform %6
272         %53 = OpConstant %6 4
273         %54 = OpTypeBool
274         %62 = OpTypePointer Private %6
275         %65 = OpTypeStruct %13
276         %66 = OpTypePointer Uniform %65
277         %67 = OpVariable %66 Uniform
278         %68 = OpConstant %26 0
279         %69 = OpTypePointer Uniform %12
280         %72 = OpConstant %26 1
281         %78 = OpTypeStruct %12 %6
282         %83 = OpConstant %6 6
283         %92 = OpConstant %6 10
284         %94 = OpConstant %26 2
285         %95 = OpTypeArray %12 %94
286         %96 = OpTypeStruct %95
287         %97 = OpTypePointer Uniform %96
288         %98 = OpVariable %97 Uniform
289        %119 = OpTypeArray %12 %27
290        %122 = OpTypePointer Function %119
291        %124 = OpTypePointer Function %12
292        %192 = OpConstant %6 30
293        %201 = OpTypePointer Function %15
294        %215 = OpConstant %6 5
295        %255 = OpConstant %12 0
296        %269 = OpConstant %6 2
297        %274 = OpConstant %6 3
298        %293 = OpTypeVector %12 4
299        %294 = OpTypePointer Output %293
300        %295 = OpVariable %294 Output
301          %4 = OpFunction %2 None %3
302          %5 = OpLabel
303        %245 = OpVariable %201 Function
304        %259 = OpVariable %21 Function
305        %267 = OpVariable %21 Function
306        %270 = OpVariable %7 Function
307        %275 = OpVariable %7 Function
308        %285 = OpVariable %21 Function
309               OpStore %30 %32
310               OpStore %34 %35
311        %237 = OpAccessChain %69 %67 %42 %68
312        %238 = OpLoad %12 %237
313        %239 = OpAccessChain %69 %67 %42 %72
314        %240 = OpLoad %12 %239
315        %241 = OpFOrdGreaterThan %54 %238 %240
316               OpSelectionMerge %243 None
317               OpBranchConditional %241 %242 %243
318        %242 = OpLabel
319               OpReturn
320        %243 = OpLabel
321        %246 = OpAccessChain %69 %98 %42 %31
322        %247 = OpLoad %12 %246
323        %248 = OpAccessChain %69 %98 %42 %31
324        %249 = OpLoad %12 %248
325        %250 = OpExtInst %12 %1 Cos %249
326        %251 = OpAccessChain %69 %98 %42 %31
327        %252 = OpLoad %12 %251
328        %253 = OpAccessChain %69 %98 %42 %31
329        %254 = OpLoad %12 %253
330        %256 = OpCompositeConstruct %13 %247 %250
331        %257 = OpCompositeConstruct %13 %252 %254
332        %258 = OpCompositeConstruct %20 %256 %257
333               OpStore %259 %258
334        %260 = OpFunctionCall %15 %24 %259
335               OpStore %245 %260
336        %261 = OpAccessChain %43 %41 %42 %31
337        %262 = OpLoad %6 %261
338        %263 = OpConvertSToF %12 %262
339        %264 = OpCompositeConstruct %13 %263 %255
340        %265 = OpCompositeConstruct %13 %255 %263
341        %266 = OpCompositeConstruct %20 %264 %265
342               OpStore %267 %266
343        %268 = OpFunctionCall %15 %24 %267
344        %271 = OpAccessChain %43 %41 %42 %269
345        %272 = OpLoad %6 %271
346               OpStore %270 %272
347        %273 = OpFunctionCall %2 %10 %270
348        %276 = OpAccessChain %43 %41 %42 %274
349        %277 = OpLoad %6 %276
350               OpStore %275 %277
351        %278 = OpFunctionCall %2 %10 %275
352        %279 = OpAccessChain %43 %41 %42 %31
353        %280 = OpLoad %6 %279
354        %281 = OpConvertSToF %12 %280
355        %282 = OpCompositeConstruct %13 %281 %255
356        %283 = OpCompositeConstruct %13 %255 %281
357        %284 = OpCompositeConstruct %20 %282 %283
358               OpStore %285 %284
359        %286 = OpFunctionCall %15 %24 %285
360        %287 = OpLoad %12 %34
361        %288 = OpAccessChain %69 %98 %42 %42
362        %289 = OpLoad %12 %288
363        %290 = OpFOrdEqual %54 %287 %289
364               OpSelectionMerge %292 None
365               OpBranchConditional %290 %291 %309
366        %291 = OpLabel
367        %296 = OpAccessChain %43 %41 %42 %42
368        %297 = OpLoad %6 %296
369        %298 = OpConvertSToF %12 %297
370        %299 = OpAccessChain %43 %41 %42 %31
371        %300 = OpLoad %6 %299
372        %301 = OpConvertSToF %12 %300
373        %302 = OpAccessChain %43 %41 %42 %31
374        %303 = OpLoad %6 %302
375        %304 = OpConvertSToF %12 %303
376        %305 = OpAccessChain %43 %41 %42 %42
377        %306 = OpLoad %6 %305
378        %307 = OpConvertSToF %12 %306
379        %308 = OpCompositeConstruct %293 %298 %301 %304 %307
380               OpStore %295 %308
381               OpBranch %292
382        %309 = OpLabel
383        %310 = OpLoad %15 %245
384        %311 = OpAccessChain %43 %41 %42 %31
385        %312 = OpLoad %6 %311
386        %313 = OpConvertSToF %12 %312
387        %314 = OpCompositeExtract %12 %310 0
388        %315 = OpCompositeExtract %12 %310 1
389        %316 = OpCompositeExtract %12 %310 2
390        %317 = OpCompositeConstruct %293 %314 %315 %316 %313
391               OpStore %295 %317
392               OpBranch %292
393        %292 = OpLabel
394               OpReturn
395               OpFunctionEnd
396         %10 = OpFunction %2 None %8
397          %9 = OpFunctionParameter %7
398         %11 = OpLabel
399         %36 = OpVariable %7 Function
400         %46 = OpVariable %7 Function
401         %82 = OpVariable %7 Function
402        %123 = OpVariable %122 Function
403         %44 = OpAccessChain %43 %41 %42 %42
404         %45 = OpLoad %6 %44
405               OpStore %36 %45
406               OpStore %46 %42
407               OpBranch %47
408         %47 = OpLabel
409               OpLoopMerge %49 %50 None
410               OpBranch %51
411         %51 = OpLabel
412         %52 = OpLoad %6 %46
413         %55 = OpSLessThan %54 %52 %53
414               OpBranchConditional %55 %48 %49
415         %48 = OpLabel
416         %56 = OpLoad %6 %9
417         %57 = OpIEqual %54 %56 %31
418               OpSelectionMerge %59 None
419               OpBranchConditional %57 %58 %59
420         %58 = OpLabel
421               OpReturn
422         %59 = OpLabel
423         %61 = OpLoad %6 %36
424         %63 = OpAccessChain %62 %30 %61
425         %64 = OpLoad %6 %63
426               OpStore %36 %64
427         %70 = OpAccessChain %69 %67 %42 %68
428         %71 = OpLoad %12 %70
429         %73 = OpAccessChain %69 %67 %42 %72
430         %74 = OpLoad %12 %73
431         %75 = OpFOrdGreaterThan %54 %71 %74
432               OpSelectionMerge %77 None
433               OpBranchConditional %75 %76 %77
434         %76 = OpLabel
435         %79 = OpExtInst %78 %1 FrexpStruct %35
436         %80 = OpCompositeExtract %6 %79 1
437               OpStore %9 %80
438         %81 = OpCompositeExtract %12 %79 0
439         %84 = OpAccessChain %43 %41 %42 %83
440         %85 = OpLoad %6 %84
441               OpStore %82 %85
442               OpBranch %86
443         %86 = OpLabel
444               OpLoopMerge %88 %89 None
445               OpBranch %90
446         %90 = OpLabel
447         %91 = OpLoad %6 %36
448         %93 = OpSLessThan %54 %91 %92
449               OpBranchConditional %93 %87 %88
450         %87 = OpLabel
451         %99 = OpAccessChain %69 %98 %42 %42
452        %100 = OpLoad %12 %99
453        %101 = OpAccessChain %69 %98 %42 %42
454        %102 = OpLoad %12 %101
455        %103 = OpAccessChain %69 %98 %42 %42
456        %104 = OpLoad %12 %103
457        %105 = OpAccessChain %69 %98 %42 %42
458        %106 = OpLoad %12 %105
459        %107 = OpAccessChain %69 %98 %42 %42
460        %108 = OpLoad %12 %107
461        %109 = OpAccessChain %69 %98 %42 %42
462        %110 = OpLoad %12 %109
463        %111 = OpAccessChain %69 %98 %42 %42
464        %112 = OpLoad %12 %111
465        %113 = OpAccessChain %69 %98 %42 %42
466        %114 = OpLoad %12 %113
467        %115 = OpAccessChain %69 %98 %42 %42
468        %116 = OpLoad %12 %115
469        %117 = OpAccessChain %69 %98 %42 %42
470        %118 = OpLoad %12 %117
471        %120 = OpCompositeConstruct %119 %100 %102 %104 %106 %108 %110 %112 %114 %116 %118
472        %121 = OpLoad %6 %36
473               OpStore %123 %120
474        %125 = OpAccessChain %124 %123 %121
475        %126 = OpLoad %12 %125
476        %127 = OpAccessChain %69 %98 %42 %31
477        %128 = OpLoad %12 %127
478        %129 = OpFOrdGreaterThan %54 %126 %128
479               OpSelectionMerge %131 None
480               OpBranchConditional %129 %130 %131
481        %130 = OpLabel
482        %132 = OpLoad %6 %82
483               OpStore %36 %132
484               OpBranch %131
485        %131 = OpLabel
486               OpBranch %89
487         %89 = OpLabel
488        %133 = OpLoad %6 %82
489        %134 = OpIAdd %6 %133 %31
490               OpStore %82 %134
491               OpBranch %86
492         %88 = OpLabel
493               OpBranch %77
494         %77 = OpLabel
495               OpBranch %50
496         %50 = OpLabel
497        %135 = OpLoad %6 %46
498        %136 = OpIAdd %6 %135 %31
499               OpStore %46 %136
500               OpBranch %47
501         %49 = OpLabel
502               OpReturn
503               OpFunctionEnd
504         %18 = OpFunction %15 None %16
505         %17 = OpFunctionParameter %14
506         %19 = OpLabel
507        %137 = OpAccessChain %124 %17 %68
508        %138 = OpLoad %12 %137
509        %139 = OpAccessChain %69 %98 %42 %42
510        %140 = OpLoad %12 %139
511        %141 = OpFOrdGreaterThan %54 %138 %140
512               OpSelectionMerge %143 None
513               OpBranchConditional %141 %142 %143
514        %142 = OpLabel
515        %144 = OpAccessChain %43 %41 %42 %42
516        %145 = OpLoad %6 %144
517        %146 = OpConvertSToF %12 %145
518        %147 = OpCompositeConstruct %15 %146 %146 %146
519               OpReturnValue %147
520        %143 = OpLabel
521        %149 = OpAccessChain %124 %17 %72
522        %150 = OpLoad %12 %149
523        %151 = OpAccessChain %69 %98 %42 %42
524        %152 = OpLoad %12 %151
525        %153 = OpFOrdLessThan %54 %150 %152
526               OpSelectionMerge %155 None
527               OpBranchConditional %153 %154 %155
528        %154 = OpLabel
529        %156 = OpAccessChain %69 %98 %42 %42
530        %157 = OpLoad %12 %156
531        %158 = OpLoad %12 %34
532        %159 = OpExtInst %12 %1 FMin %157 %158
533               OpStore %34 %159
534        %160 = OpAccessChain %43 %41 %42 %42
535        %161 = OpLoad %6 %160
536        %162 = OpConvertSToF %12 %161
537        %163 = OpAccessChain %43 %41 %42 %42
538        %164 = OpLoad %6 %163
539        %165 = OpConvertSToF %12 %164
540        %166 = OpLoad %12 %34
541        %167 = OpCompositeConstruct %15 %162 %165 %166
542               OpReturnValue %167
543        %155 = OpLabel
544        %169 = OpAccessChain %124 %17 %72
545        %170 = OpLoad %12 %169
546        %171 = OpAccessChain %69 %98 %42 %42
547        %172 = OpLoad %12 %171
548        %173 = OpFOrdGreaterThan %54 %170 %172
549               OpSelectionMerge %175 None
550               OpBranchConditional %173 %174 %175
551        %174 = OpLabel
552        %176 = OpAccessChain %69 %98 %42 %42
553        %177 = OpLoad %12 %176
554        %178 = OpAccessChain %69 %98 %42 %42
555        %179 = OpLoad %12 %178
556        %180 = OpLoad %12 %34
557        %181 = OpExtInst %12 %1 FClamp %177 %179 %180
558               OpStore %34 %181
559               OpBranch %175
560        %175 = OpLabel
561        %182 = OpAccessChain %43 %41 %42 %42
562        %183 = OpLoad %6 %182
563        %184 = OpConvertSToF %12 %183
564        %185 = OpCompositeConstruct %15 %184 %184 %184
565               OpReturnValue %185
566               OpFunctionEnd
567         %24 = OpFunction %15 None %22
568         %23 = OpFunctionParameter %21
569         %25 = OpLabel
570        %188 = OpVariable %7 Function
571        %193 = OpVariable %7 Function
572        %195 = OpVariable %14 Function
573        %202 = OpVariable %201 Function
574        %206 = OpVariable %7 Function
575        %219 = OpVariable %201 Function
576        %220 = OpVariable %14 Function
577        %189 = OpAccessChain %43 %41 %42 %53
578        %190 = OpLoad %6 %189
579               OpStore %188 %190
580        %191 = OpFunctionCall %2 %10 %188
581               OpStore %193 %192
582        %194 = OpFunctionCall %2 %10 %193
583        %196 = OpAccessChain %69 %98 %42 %42
584        %197 = OpLoad %12 %196
585        %198 = OpCompositeConstruct %13 %197 %197
586        %199 = OpLoad %20 %23
587        %200 = OpVectorTimesMatrix %13 %198 %199
588               OpStore %195 %200
589        %203 = OpAccessChain %69 %98 %42 %42
590        %204 = OpLoad %12 %203
591        %205 = OpCompositeConstruct %15 %204 %204 %204
592               OpStore %202 %205
593        %207 = OpAccessChain %43 %41 %42 %31
594        %208 = OpLoad %6 %207
595               OpStore %206 %208
596               OpBranch %209
597        %209 = OpLabel
598               OpLoopMerge %211 %212 None
599               OpBranch %213
600        %213 = OpLabel
601        %214 = OpLoad %6 %206
602        %216 = OpAccessChain %43 %41 %42 %215
603        %217 = OpLoad %6 %216
604        %218 = OpSLessThan %54 %214 %217
605               OpBranchConditional %218 %210 %211
606        %210 = OpLabel
607        %221 = OpLoad %13 %195
608               OpStore %220 %221
609        %222 = OpFunctionCall %15 %18 %220
610               OpStore %219 %222
611        %223 = OpLoad %15 %219
612        %224 = OpExtInst %12 %1 Length %223
613        %225 = OpAccessChain %69 %98 %42 %42
614        %226 = OpLoad %12 %225
615        %227 = OpFOrdLessThanEqual %54 %224 %226
616               OpSelectionMerge %229 None
617               OpBranchConditional %227 %228 %229
618        %228 = OpLabel
619               OpBranch %212
620        %229 = OpLabel
621        %231 = OpLoad %15 %219
622               OpStore %202 %231
623               OpBranch %212
624        %212 = OpLabel
625        %232 = OpLoad %6 %206
626        %233 = OpIAdd %6 %232 %31
627               OpStore %206 %233
628               OpBranch %209
629        %211 = OpLabel
630        %234 = OpLoad %15 %202
631               OpReturnValue %234
632               OpFunctionEnd
633END
634
635# uniforms for variant
636
637# injectionSwitch
638BUFFER variant_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
639 0.0 1.0
640END
641# _GLF_uniform_int_values
642BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
643 1 0 100 30 6 35 8
644END
645# _GLF_uniform_float_values
646BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
647 1.0 0.0
648END
649
650BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
651
652PIPELINE graphics variant_pipeline
653  ATTACH variant_vertex_shader
654  ATTACH variant_fragment_shader
655  FRAMEBUFFER_SIZE 32 32
656  BIND BUFFER variant_framebuffer AS color LOCATION 0
657  BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 2
658  BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
659  BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
660END
661CLEAR_COLOR variant_pipeline 0 0 0 255
662
663CLEAR variant_pipeline
664RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 32 32
665
666EXPECT variant_framebuffer IDX 0 0 SIZE 32 32 EQ_RGBA 255 0 0 255
667