• 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_2 _GLF_uniform_int_values[2]
32# #define _int_4 _GLF_uniform_int_values[3]
33# #define _float_1_0 _GLF_uniform_float_values[0]
34# #define _float_0_0 _GLF_uniform_float_values[1]
35# #define _float_2_0 _GLF_uniform_float_values[2]
36#
37# precision highp float;
38# precision highp int;
39#
40# // Contents of _GLF_uniform_float_values: [1.0, 0.0, 2.0]
41# layout(set = 0, binding = 0) uniform buf0
42# {
43#     float _GLF_uniform_float_values[3];
44# };
45#
46# // Contents of _GLF_uniform_int_values: [1, 0, 2, 4]
47# layout(set = 0, binding = 1) uniform buf1
48# {
49#     int _GLF_uniform_int_values[4];
50# };
51#
52# // Contents of injectionSwitch: [0.0, 1.0]
53# layout(set = 0, binding = 2) uniform buf2
54# {
55#     highp vec2 injectionSwitch;
56# };
57#
58# layout(location = 0) out vec4 _GLF_color;
59#
60# ivec4 func()
61# {
62#     ivec4 v = ivec4(_int_1);
63#     int a = _int_1;
64#
65#     // Iterates twice.
66#     for(int b = 0; b < 2; b++)
67#     {
68#         int c = 0;
69#
70#         // Iterates three times.
71#         for(int d = _int_1; c < 3; d++)
72#         {
73#             // Always false.
74#             if(gl_FragCoord.x < _float_0_0)
75#             {
76#                 if(injectionSwitch.y > _float_0_0)
77#                 {
78#                     vec2 v0 = vec2(_float_1_0) * mat2(_float_1_0);
79#                     for(int i = _int_1; i >= 1; i--) { }
80#
81#                     vec2 v1 = vec2(_float_1_0) * mat2(_float_1_0);
82#                     for(int i = _int_1; i >= 1; i--) { }
83#
84#                     vec2 v2 = vec2(_float_1_0) * mat2(_float_1_0);
85#                     for(int i = _int_1; i >= 0; i--) { }
86#                 }
87#             }
88#             else
89#             {
90#                 c++;
91#             }
92#
93#             // Same as a += d.
94#             for(int i = _int_0; i < d; i++)
95#             {
96#                 a++;
97#             }
98#
99#             a *= _int_2;
100#
101#             // v = vec4(a);
102#             for(int i = _int_0; i < _int_4; i++)
103#             {
104#                 v[i] = a;
105#             }
106#         }
107#     }
108#
109#     return v;
110# }
111#
112# // Same as func(), but manually simplified.
113# ivec4 funcSimplified()
114# {
115#     ivec4 v = ivec4(1);
116#     int a = 1;
117#
118#     for(int b = 0; b < 2; b++)
119#     {
120#         for(int d = 1; d < 4; d++)
121#         {
122#             a = (a + d) * 2;
123#         }
124#     }
125#
126#     return ivec4(a);
127# }
128#
129# void main()
130# {
131#     // Always true.
132#     if(func() == funcSimplified())
133#     {
134#         _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
135#     }
136#     else
137#     {
138#         _GLF_color = vec4(_int_0);
139#     }
140# }
141SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
142; SPIR-V
143; Version: 1.0
144; Generator: Khronos Glslang Reference Front End; 10
145; Bound: 259
146; Schema: 0
147               OpCapability Shader
148          %1 = OpExtInstImport "GLSL.std.450"
149               OpMemoryModel Logical GLSL450
150               OpEntryPoint Fragment %4 "main" %55 %240
151               OpExecutionMode %4 OriginUpperLeft
152               OpSource ESSL 320
153               OpName %4 "main"
154               OpName %9 "func("
155               OpName %11 "funcSimplified("
156               OpName %14 "v"
157               OpName %18 "buf1"
158               OpMemberName %18 0 "_GLF_uniform_int_values"
159               OpName %20 ""
160               OpName %27 "a"
161               OpName %30 "b"
162               OpName %40 "c"
163               OpName %41 "d"
164               OpName %55 "gl_FragCoord"
165               OpName %62 "buf0"
166               OpMemberName %62 0 "_GLF_uniform_float_values"
167               OpName %64 ""
168               OpName %73 "buf2"
169               OpMemberName %73 0 "injectionSwitch"
170               OpName %75 ""
171               OpName %85 "v0"
172               OpName %98 "i"
173               OpName %110 "v1"
174               OpName %120 "i"
175               OpName %132 "v2"
176               OpName %142 "i"
177               OpName %157 "i"
178               OpName %176 "i"
179               OpName %200 "v"
180               OpName %202 "a"
181               OpName %203 "b"
182               OpName %211 "d"
183               OpName %240 "_GLF_color"
184               OpDecorate %17 ArrayStride 16
185               OpMemberDecorate %18 0 Offset 0
186               OpDecorate %18 Block
187               OpDecorate %20 DescriptorSet 0
188               OpDecorate %20 Binding 1
189               OpDecorate %55 BuiltIn FragCoord
190               OpDecorate %61 ArrayStride 16
191               OpMemberDecorate %62 0 Offset 0
192               OpDecorate %62 Block
193               OpDecorate %64 DescriptorSet 0
194               OpDecorate %64 Binding 0
195               OpMemberDecorate %73 0 Offset 0
196               OpDecorate %73 Block
197               OpDecorate %75 DescriptorSet 0
198               OpDecorate %75 Binding 2
199               OpDecorate %240 Location 0
200          %2 = OpTypeVoid
201          %3 = OpTypeFunction %2
202          %6 = OpTypeInt 32 1
203          %7 = OpTypeVector %6 4
204          %8 = OpTypeFunction %7
205         %13 = OpTypePointer Function %7
206         %15 = OpTypeInt 32 0
207         %16 = OpConstant %15 4
208         %17 = OpTypeArray %6 %16
209         %18 = OpTypeStruct %17
210         %19 = OpTypePointer Uniform %18
211         %20 = OpVariable %19 Uniform
212         %21 = OpConstant %6 0
213         %22 = OpTypePointer Uniform %6
214         %26 = OpTypePointer Function %6
215         %37 = OpConstant %6 2
216         %38 = OpTypeBool
217         %50 = OpConstant %6 3
218         %52 = OpTypeFloat 32
219         %53 = OpTypeVector %52 4
220         %54 = OpTypePointer Input %53
221         %55 = OpVariable %54 Input
222         %56 = OpConstant %15 0
223         %57 = OpTypePointer Input %52
224         %60 = OpConstant %15 3
225         %61 = OpTypeArray %52 %60
226         %62 = OpTypeStruct %61
227         %63 = OpTypePointer Uniform %62
228         %64 = OpVariable %63 Uniform
229         %65 = OpConstant %6 1
230         %66 = OpTypePointer Uniform %52
231         %72 = OpTypeVector %52 2
232         %73 = OpTypeStruct %72
233         %74 = OpTypePointer Uniform %73
234         %75 = OpVariable %74 Uniform
235         %76 = OpConstant %15 1
236         %84 = OpTypePointer Function %72
237         %91 = OpTypeMatrix %72 2
238         %92 = OpConstant %52 1
239         %93 = OpConstant %52 0
240        %201 = OpConstantComposite %7 %65 %65 %65 %65
241        %218 = OpConstant %6 4
242        %234 = OpTypeVector %38 4
243        %239 = OpTypePointer Output %53
244        %240 = OpVariable %239 Output
245          %4 = OpFunction %2 None %3
246          %5 = OpLabel
247        %232 = OpFunctionCall %7 %9
248        %233 = OpFunctionCall %7 %11
249        %235 = OpIEqual %234 %232 %233
250        %236 = OpAll %38 %235
251               OpSelectionMerge %238 None
252               OpBranchConditional %236 %237 %254
253        %237 = OpLabel
254        %241 = OpAccessChain %22 %20 %21 %21
255        %242 = OpLoad %6 %241
256        %243 = OpConvertSToF %52 %242
257        %244 = OpAccessChain %22 %20 %21 %65
258        %245 = OpLoad %6 %244
259        %246 = OpConvertSToF %52 %245
260        %247 = OpAccessChain %22 %20 %21 %65
261        %248 = OpLoad %6 %247
262        %249 = OpConvertSToF %52 %248
263        %250 = OpAccessChain %22 %20 %21 %21
264        %251 = OpLoad %6 %250
265        %252 = OpConvertSToF %52 %251
266        %253 = OpCompositeConstruct %53 %243 %246 %249 %252
267               OpStore %240 %253
268               OpBranch %238
269        %254 = OpLabel
270        %255 = OpAccessChain %22 %20 %21 %65
271        %256 = OpLoad %6 %255
272        %257 = OpConvertSToF %52 %256
273        %258 = OpCompositeConstruct %53 %257 %257 %257 %257
274               OpStore %240 %258
275               OpBranch %238
276        %238 = OpLabel
277               OpReturn
278               OpFunctionEnd
279          %9 = OpFunction %7 None %8
280         %10 = OpLabel
281         %14 = OpVariable %13 Function
282         %27 = OpVariable %26 Function
283         %30 = OpVariable %26 Function
284         %40 = OpVariable %26 Function
285         %41 = OpVariable %26 Function
286         %85 = OpVariable %84 Function
287         %98 = OpVariable %26 Function
288        %110 = OpVariable %84 Function
289        %120 = OpVariable %26 Function
290        %132 = OpVariable %84 Function
291        %142 = OpVariable %26 Function
292        %157 = OpVariable %26 Function
293        %176 = OpVariable %26 Function
294         %23 = OpAccessChain %22 %20 %21 %21
295         %24 = OpLoad %6 %23
296         %25 = OpCompositeConstruct %7 %24 %24 %24 %24
297               OpStore %14 %25
298         %28 = OpAccessChain %22 %20 %21 %21
299         %29 = OpLoad %6 %28
300               OpStore %27 %29
301               OpStore %30 %21
302               OpBranch %31
303         %31 = OpLabel
304               OpLoopMerge %33 %34 None
305               OpBranch %35
306         %35 = OpLabel
307         %36 = OpLoad %6 %30
308         %39 = OpSLessThan %38 %36 %37
309               OpBranchConditional %39 %32 %33
310         %32 = OpLabel
311               OpStore %40 %21
312         %42 = OpAccessChain %22 %20 %21 %21
313         %43 = OpLoad %6 %42
314               OpStore %41 %43
315               OpBranch %44
316         %44 = OpLabel
317               OpLoopMerge %46 %47 None
318               OpBranch %48
319         %48 = OpLabel
320         %49 = OpLoad %6 %40
321         %51 = OpSLessThan %38 %49 %50
322               OpBranchConditional %51 %45 %46
323         %45 = OpLabel
324         %58 = OpAccessChain %57 %55 %56
325         %59 = OpLoad %52 %58
326         %67 = OpAccessChain %66 %64 %21 %65
327         %68 = OpLoad %52 %67
328         %69 = OpFOrdLessThan %38 %59 %68
329               OpSelectionMerge %71 None
330               OpBranchConditional %69 %70 %154
331         %70 = OpLabel
332         %77 = OpAccessChain %66 %75 %21 %76
333         %78 = OpLoad %52 %77
334         %79 = OpAccessChain %66 %64 %21 %65
335         %80 = OpLoad %52 %79
336         %81 = OpFOrdGreaterThan %38 %78 %80
337               OpSelectionMerge %83 None
338               OpBranchConditional %81 %82 %83
339         %82 = OpLabel
340         %86 = OpAccessChain %66 %64 %21 %21
341         %87 = OpLoad %52 %86
342         %88 = OpCompositeConstruct %72 %87 %87
343         %89 = OpAccessChain %66 %64 %21 %21
344         %90 = OpLoad %52 %89
345         %94 = OpCompositeConstruct %72 %90 %93
346         %95 = OpCompositeConstruct %72 %93 %90
347         %96 = OpCompositeConstruct %91 %94 %95
348         %97 = OpVectorTimesMatrix %72 %88 %96
349               OpStore %85 %97
350         %99 = OpAccessChain %22 %20 %21 %21
351        %100 = OpLoad %6 %99
352               OpStore %98 %100
353               OpBranch %101
354        %101 = OpLabel
355               OpLoopMerge %103 %104 None
356               OpBranch %105
357        %105 = OpLabel
358        %106 = OpLoad %6 %98
359        %107 = OpSGreaterThanEqual %38 %106 %65
360               OpBranchConditional %107 %102 %103
361        %102 = OpLabel
362               OpBranch %104
363        %104 = OpLabel
364        %108 = OpLoad %6 %98
365        %109 = OpISub %6 %108 %65
366               OpStore %98 %109
367               OpBranch %101
368        %103 = OpLabel
369        %111 = OpAccessChain %66 %64 %21 %21
370        %112 = OpLoad %52 %111
371        %113 = OpCompositeConstruct %72 %112 %112
372        %114 = OpAccessChain %66 %64 %21 %21
373        %115 = OpLoad %52 %114
374        %116 = OpCompositeConstruct %72 %115 %93
375        %117 = OpCompositeConstruct %72 %93 %115
376        %118 = OpCompositeConstruct %91 %116 %117
377        %119 = OpVectorTimesMatrix %72 %113 %118
378               OpStore %110 %119
379        %121 = OpAccessChain %22 %20 %21 %21
380        %122 = OpLoad %6 %121
381               OpStore %120 %122
382               OpBranch %123
383        %123 = OpLabel
384               OpLoopMerge %125 %126 None
385               OpBranch %127
386        %127 = OpLabel
387        %128 = OpLoad %6 %120
388        %129 = OpSGreaterThanEqual %38 %128 %65
389               OpBranchConditional %129 %124 %125
390        %124 = OpLabel
391               OpBranch %126
392        %126 = OpLabel
393        %130 = OpLoad %6 %120
394        %131 = OpISub %6 %130 %65
395               OpStore %120 %131
396               OpBranch %123
397        %125 = OpLabel
398        %133 = OpAccessChain %66 %64 %21 %21
399        %134 = OpLoad %52 %133
400        %135 = OpCompositeConstruct %72 %134 %134
401        %136 = OpAccessChain %66 %64 %21 %21
402        %137 = OpLoad %52 %136
403        %138 = OpCompositeConstruct %72 %137 %93
404        %139 = OpCompositeConstruct %72 %93 %137
405        %140 = OpCompositeConstruct %91 %138 %139
406        %141 = OpVectorTimesMatrix %72 %135 %140
407               OpStore %132 %141
408        %143 = OpAccessChain %22 %20 %21 %21
409        %144 = OpLoad %6 %143
410               OpStore %142 %144
411               OpBranch %145
412        %145 = OpLabel
413               OpLoopMerge %147 %148 None
414               OpBranch %149
415        %149 = OpLabel
416        %150 = OpLoad %6 %142
417        %151 = OpSGreaterThanEqual %38 %150 %21
418               OpBranchConditional %151 %146 %147
419        %146 = OpLabel
420               OpBranch %148
421        %148 = OpLabel
422        %152 = OpLoad %6 %142
423        %153 = OpISub %6 %152 %65
424               OpStore %142 %153
425               OpBranch %145
426        %147 = OpLabel
427               OpBranch %83
428         %83 = OpLabel
429               OpBranch %71
430        %154 = OpLabel
431        %155 = OpLoad %6 %40
432        %156 = OpIAdd %6 %155 %65
433               OpStore %40 %156
434               OpBranch %71
435         %71 = OpLabel
436        %158 = OpAccessChain %22 %20 %21 %65
437        %159 = OpLoad %6 %158
438               OpStore %157 %159
439               OpBranch %160
440        %160 = OpLabel
441               OpLoopMerge %162 %163 None
442               OpBranch %164
443        %164 = OpLabel
444        %165 = OpLoad %6 %157
445        %166 = OpLoad %6 %41
446        %167 = OpSLessThan %38 %165 %166
447               OpBranchConditional %167 %161 %162
448        %161 = OpLabel
449        %168 = OpLoad %6 %27
450        %169 = OpIAdd %6 %168 %65
451               OpStore %27 %169
452               OpBranch %163
453        %163 = OpLabel
454        %170 = OpLoad %6 %157
455        %171 = OpIAdd %6 %170 %65
456               OpStore %157 %171
457               OpBranch %160
458        %162 = OpLabel
459        %172 = OpAccessChain %22 %20 %21 %37
460        %173 = OpLoad %6 %172
461        %174 = OpLoad %6 %27
462        %175 = OpIMul %6 %174 %173
463               OpStore %27 %175
464        %177 = OpAccessChain %22 %20 %21 %65
465        %178 = OpLoad %6 %177
466               OpStore %176 %178
467               OpBranch %179
468        %179 = OpLabel
469               OpLoopMerge %181 %182 None
470               OpBranch %183
471        %183 = OpLabel
472        %184 = OpLoad %6 %176
473        %185 = OpAccessChain %22 %20 %21 %50
474        %186 = OpLoad %6 %185
475        %187 = OpSLessThan %38 %184 %186
476               OpBranchConditional %187 %180 %181
477        %180 = OpLabel
478        %188 = OpLoad %6 %176
479        %189 = OpLoad %6 %27
480        %190 = OpAccessChain %26 %14 %188
481               OpStore %190 %189
482               OpBranch %182
483        %182 = OpLabel
484        %191 = OpLoad %6 %176
485        %192 = OpIAdd %6 %191 %65
486               OpStore %176 %192
487               OpBranch %179
488        %181 = OpLabel
489               OpBranch %47
490         %47 = OpLabel
491        %193 = OpLoad %6 %41
492        %194 = OpIAdd %6 %193 %65
493               OpStore %41 %194
494               OpBranch %44
495         %46 = OpLabel
496               OpBranch %34
497         %34 = OpLabel
498        %195 = OpLoad %6 %30
499        %196 = OpIAdd %6 %195 %65
500               OpStore %30 %196
501               OpBranch %31
502         %33 = OpLabel
503        %197 = OpLoad %7 %14
504               OpReturnValue %197
505               OpFunctionEnd
506         %11 = OpFunction %7 None %8
507         %12 = OpLabel
508        %200 = OpVariable %13 Function
509        %202 = OpVariable %26 Function
510        %203 = OpVariable %26 Function
511        %211 = OpVariable %26 Function
512               OpStore %200 %201
513               OpStore %202 %65
514               OpStore %203 %21
515               OpBranch %204
516        %204 = OpLabel
517               OpLoopMerge %206 %207 None
518               OpBranch %208
519        %208 = OpLabel
520        %209 = OpLoad %6 %203
521        %210 = OpSLessThan %38 %209 %37
522               OpBranchConditional %210 %205 %206
523        %205 = OpLabel
524               OpStore %211 %65
525               OpBranch %212
526        %212 = OpLabel
527               OpLoopMerge %214 %215 None
528               OpBranch %216
529        %216 = OpLabel
530        %217 = OpLoad %6 %211
531        %219 = OpSLessThan %38 %217 %218
532               OpBranchConditional %219 %213 %214
533        %213 = OpLabel
534        %220 = OpLoad %6 %202
535        %221 = OpLoad %6 %211
536        %222 = OpIAdd %6 %220 %221
537        %223 = OpIMul %6 %222 %37
538               OpStore %202 %223
539               OpBranch %215
540        %215 = OpLabel
541        %224 = OpLoad %6 %211
542        %225 = OpIAdd %6 %224 %65
543               OpStore %211 %225
544               OpBranch %212
545        %214 = OpLabel
546               OpBranch %207
547        %207 = OpLabel
548        %226 = OpLoad %6 %203
549        %227 = OpIAdd %6 %226 %65
550               OpStore %203 %227
551               OpBranch %204
552        %206 = OpLabel
553        %228 = OpLoad %6 %202
554        %229 = OpCompositeConstruct %7 %228 %228 %228 %228
555               OpReturnValue %229
556               OpFunctionEnd
557END
558
559# uniforms for variant
560
561# injectionSwitch
562BUFFER variant_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
563 0.0 1.0
564END
565# _GLF_uniform_int_values
566BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
567 1 0 2 4
568END
569# _GLF_uniform_float_values
570BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
571 1.0 0.0 2.0
572END
573
574BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
575
576PIPELINE graphics variant_pipeline
577  ATTACH variant_vertex_shader
578  ATTACH variant_fragment_shader
579  FRAMEBUFFER_SIZE 32 32
580  BIND BUFFER variant_framebuffer AS color LOCATION 0
581  BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 2
582  BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
583  BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
584END
585CLEAR_COLOR variant_pipeline 0 0 0 255
586
587CLEAR variant_pipeline
588RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 32 32
589
590EXPECT variant_framebuffer IDX 0 0 SIZE 32 32 EQ_RGBA 255 0 0 255
591