• 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 coverage-gap found by GraphicsFuzz.
19
20# Short description: A fragment shader that covers a specific scaled number code path.
21
22# The test passes because shader always writes red.
23
24SHADER vertex variant_vertex_shader PASSTHROUGH
25
26# variant_fragment_shader is derived from the following GLSL:
27# #version 310 es
28# precision highp float;
29# precision highp int;
30#
31# layout(location = 0) out vec4 _GLF_color;
32#
33# layout(set = 0, binding = 0) uniform buf0
34# {
35#     int one;
36# };
37#
38# void main()
39# {
40#     int a = 0;
41#
42#     for(int i0 = 0; i0 < one; i0++)
43#         for( int i1 = 0; i1 < one; i1++)
44#             for(int i2 = 0; i2 < one; i2++)
45#                 // While other loops iterate only once, this one
46#                 // does three iterations.
47#                 for(int i3 = 0; i3 < one + 2; i3++)
48#                     for(int i4 = 0; i4 < one; i4++)
49#                         for(int i5 = 0; i5 < one; i5++)
50#                         {
51#                             // Always true, but will break at the end of the loop.
52#                             while(one > 0)
53#                             {
54#                                 for( int i6 = 0; i6 < one; i6++)
55#                                     for( int i7 = 0; i7 < one; i7++)
56#                                         for( int i8 = 0; i8 < one; i8++)
57#                                             for( int i9 = 0; i9 < one; i9++)
58#                                                 a++;
59#
60#                                 break;
61#                             }
62#                         }
63#
64#     if (a == 3)
65#         _GLF_color = vec4(1, 0, 0, 1);
66#     else
67#         _GLF_color = vec4(0);
68# }
69SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
70; SPIR-V
71; Version: 1.0
72; Generator: Khronos Glslang Reference Front End; 8
73; Bound: 163
74; Schema: 0
75               OpCapability Shader
76          %1 = OpExtInstImport "GLSL.std.450"
77               OpMemoryModel Logical GLSL450
78               OpEntryPoint Fragment %4 "main" %157
79               OpExecutionMode %4 OriginUpperLeft
80               OpSource ESSL 310
81               OpName %4 "main"
82               OpName %8 "a"
83               OpName %10 "i0"
84               OpName %17 "buf0"
85               OpMemberName %17 0 "one"
86               OpName %19 ""
87               OpName %25 "i1"
88               OpName %35 "i2"
89               OpName %45 "i3"
90               OpName %57 "i4"
91               OpName %67 "i5"
92               OpName %85 "i6"
93               OpName %95 "i7"
94               OpName %105 "i8"
95               OpName %115 "i9"
96               OpName %157 "_GLF_color"
97               OpMemberDecorate %17 0 Offset 0
98               OpDecorate %17 Block
99               OpDecorate %19 DescriptorSet 0
100               OpDecorate %19 Binding 0
101               OpDecorate %157 Location 0
102          %2 = OpTypeVoid
103          %3 = OpTypeFunction %2
104          %6 = OpTypeInt 32 1
105          %7 = OpTypePointer Function %6
106          %9 = OpConstant %6 0
107         %17 = OpTypeStruct %6
108         %18 = OpTypePointer Uniform %17
109         %19 = OpVariable %18 Uniform
110         %20 = OpTypePointer Uniform %6
111         %23 = OpTypeBool
112         %54 = OpConstant %6 2
113        %126 = OpConstant %6 1
114        %150 = OpConstant %6 3
115        %154 = OpTypeFloat 32
116        %155 = OpTypeVector %154 4
117        %156 = OpTypePointer Output %155
118        %157 = OpVariable %156 Output
119        %158 = OpConstant %154 1
120        %159 = OpConstant %154 0
121        %160 = OpConstantComposite %155 %158 %159 %159 %158
122        %162 = OpConstantComposite %155 %159 %159 %159 %159
123          %4 = OpFunction %2 None %3
124          %5 = OpLabel
125          %8 = OpVariable %7 Function
126         %10 = OpVariable %7 Function
127         %25 = OpVariable %7 Function
128         %35 = OpVariable %7 Function
129         %45 = OpVariable %7 Function
130         %57 = OpVariable %7 Function
131         %67 = OpVariable %7 Function
132         %85 = OpVariable %7 Function
133         %95 = OpVariable %7 Function
134        %105 = OpVariable %7 Function
135        %115 = OpVariable %7 Function
136               OpStore %8 %9
137               OpStore %10 %9
138               OpBranch %11
139         %11 = OpLabel
140               OpLoopMerge %13 %14 None
141               OpBranch %15
142         %15 = OpLabel
143         %16 = OpLoad %6 %10
144         %21 = OpAccessChain %20 %19 %9
145         %22 = OpLoad %6 %21
146         %24 = OpSLessThan %23 %16 %22
147               OpBranchConditional %24 %12 %13
148         %12 = OpLabel
149               OpStore %25 %9
150               OpBranch %26
151         %26 = OpLabel
152               OpLoopMerge %28 %29 None
153               OpBranch %30
154         %30 = OpLabel
155         %31 = OpLoad %6 %25
156         %32 = OpAccessChain %20 %19 %9
157         %33 = OpLoad %6 %32
158         %34 = OpSLessThan %23 %31 %33
159               OpBranchConditional %34 %27 %28
160         %27 = OpLabel
161               OpStore %35 %9
162               OpBranch %36
163         %36 = OpLabel
164               OpLoopMerge %38 %39 None
165               OpBranch %40
166         %40 = OpLabel
167         %41 = OpLoad %6 %35
168         %42 = OpAccessChain %20 %19 %9
169         %43 = OpLoad %6 %42
170         %44 = OpSLessThan %23 %41 %43
171               OpBranchConditional %44 %37 %38
172         %37 = OpLabel
173               OpStore %45 %9
174               OpBranch %46
175         %46 = OpLabel
176               OpLoopMerge %48 %49 None
177               OpBranch %50
178         %50 = OpLabel
179         %51 = OpLoad %6 %45
180         %52 = OpAccessChain %20 %19 %9
181         %53 = OpLoad %6 %52
182         %55 = OpIAdd %6 %53 %54
183         %56 = OpSLessThan %23 %51 %55
184               OpBranchConditional %56 %47 %48
185         %47 = OpLabel
186               OpStore %57 %9
187               OpBranch %58
188         %58 = OpLabel
189               OpLoopMerge %60 %61 None
190               OpBranch %62
191         %62 = OpLabel
192         %63 = OpLoad %6 %57
193         %64 = OpAccessChain %20 %19 %9
194         %65 = OpLoad %6 %64
195         %66 = OpSLessThan %23 %63 %65
196               OpBranchConditional %66 %59 %60
197         %59 = OpLabel
198               OpStore %67 %9
199               OpBranch %68
200         %68 = OpLabel
201               OpLoopMerge %70 %71 None
202               OpBranch %72
203         %72 = OpLabel
204         %73 = OpLoad %6 %67
205         %74 = OpAccessChain %20 %19 %9
206         %75 = OpLoad %6 %74
207         %76 = OpSLessThan %23 %73 %75
208               OpBranchConditional %76 %69 %70
209         %69 = OpLabel
210               OpBranch %77
211         %77 = OpLabel
212               OpLoopMerge %79 %80 None
213               OpBranch %81
214         %81 = OpLabel
215         %82 = OpAccessChain %20 %19 %9
216         %83 = OpLoad %6 %82
217         %84 = OpSGreaterThan %23 %83 %9
218               OpBranchConditional %84 %78 %79
219         %78 = OpLabel
220               OpStore %85 %9
221               OpBranch %86
222         %86 = OpLabel
223               OpLoopMerge %88 %89 None
224               OpBranch %90
225         %90 = OpLabel
226         %91 = OpLoad %6 %85
227         %92 = OpAccessChain %20 %19 %9
228         %93 = OpLoad %6 %92
229         %94 = OpSLessThan %23 %91 %93
230               OpBranchConditional %94 %87 %88
231         %87 = OpLabel
232               OpStore %95 %9
233               OpBranch %96
234         %96 = OpLabel
235               OpLoopMerge %98 %99 None
236               OpBranch %100
237        %100 = OpLabel
238        %101 = OpLoad %6 %95
239        %102 = OpAccessChain %20 %19 %9
240        %103 = OpLoad %6 %102
241        %104 = OpSLessThan %23 %101 %103
242               OpBranchConditional %104 %97 %98
243         %97 = OpLabel
244               OpStore %105 %9
245               OpBranch %106
246        %106 = OpLabel
247               OpLoopMerge %108 %109 None
248               OpBranch %110
249        %110 = OpLabel
250        %111 = OpLoad %6 %105
251        %112 = OpAccessChain %20 %19 %9
252        %113 = OpLoad %6 %112
253        %114 = OpSLessThan %23 %111 %113
254               OpBranchConditional %114 %107 %108
255        %107 = OpLabel
256               OpStore %115 %9
257               OpBranch %116
258        %116 = OpLabel
259               OpLoopMerge %118 %119 None
260               OpBranch %120
261        %120 = OpLabel
262        %121 = OpLoad %6 %115
263        %122 = OpAccessChain %20 %19 %9
264        %123 = OpLoad %6 %122
265        %124 = OpSLessThan %23 %121 %123
266               OpBranchConditional %124 %117 %118
267        %117 = OpLabel
268        %125 = OpLoad %6 %8
269        %127 = OpIAdd %6 %125 %126
270               OpStore %8 %127
271               OpBranch %119
272        %119 = OpLabel
273        %128 = OpLoad %6 %115
274        %129 = OpIAdd %6 %128 %126
275               OpStore %115 %129
276               OpBranch %116
277        %118 = OpLabel
278               OpBranch %109
279        %109 = OpLabel
280        %130 = OpLoad %6 %105
281        %131 = OpIAdd %6 %130 %126
282               OpStore %105 %131
283               OpBranch %106
284        %108 = OpLabel
285               OpBranch %99
286         %99 = OpLabel
287        %132 = OpLoad %6 %95
288        %133 = OpIAdd %6 %132 %126
289               OpStore %95 %133
290               OpBranch %96
291         %98 = OpLabel
292               OpBranch %89
293         %89 = OpLabel
294        %134 = OpLoad %6 %85
295        %135 = OpIAdd %6 %134 %126
296               OpStore %85 %135
297               OpBranch %86
298         %88 = OpLabel
299               OpBranch %79
300         %80 = OpLabel
301               OpBranch %77
302         %79 = OpLabel
303               OpBranch %71
304         %71 = OpLabel
305        %137 = OpLoad %6 %67
306        %138 = OpIAdd %6 %137 %126
307               OpStore %67 %138
308               OpBranch %68
309         %70 = OpLabel
310               OpBranch %61
311         %61 = OpLabel
312        %139 = OpLoad %6 %57
313        %140 = OpIAdd %6 %139 %126
314               OpStore %57 %140
315               OpBranch %58
316         %60 = OpLabel
317               OpBranch %49
318         %49 = OpLabel
319        %141 = OpLoad %6 %45
320        %142 = OpIAdd %6 %141 %126
321               OpStore %45 %142
322               OpBranch %46
323         %48 = OpLabel
324               OpBranch %39
325         %39 = OpLabel
326        %143 = OpLoad %6 %35
327        %144 = OpIAdd %6 %143 %126
328               OpStore %35 %144
329               OpBranch %36
330         %38 = OpLabel
331               OpBranch %29
332         %29 = OpLabel
333        %145 = OpLoad %6 %25
334        %146 = OpIAdd %6 %145 %126
335               OpStore %25 %146
336               OpBranch %26
337         %28 = OpLabel
338               OpBranch %14
339         %14 = OpLabel
340        %147 = OpLoad %6 %10
341        %148 = OpIAdd %6 %147 %126
342               OpStore %10 %148
343               OpBranch %11
344         %13 = OpLabel
345        %149 = OpLoad %6 %8
346        %151 = OpIEqual %23 %149 %150
347               OpSelectionMerge %153 None
348               OpBranchConditional %151 %152 %161
349        %152 = OpLabel
350               OpStore %157 %160
351               OpBranch %153
352        %161 = OpLabel
353               OpStore %157 %162
354               OpBranch %153
355        %153 = OpLabel
356               OpReturn
357               OpFunctionEnd
358END
359
360# uniforms for variant
361
362# one
363BUFFER variant_one DATA_TYPE int32 DATA
364 1
365END
366
367BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
368
369PIPELINE graphics variant_pipeline
370  ATTACH variant_vertex_shader
371  ATTACH variant_fragment_shader
372  FRAMEBUFFER_SIZE 256 256
373  BIND BUFFER variant_framebuffer AS color LOCATION 0
374  BIND BUFFER variant_one AS uniform DESCRIPTOR_SET 0 BINDING 0
375END
376CLEAR_COLOR variant_pipeline 0 0 0 255
377
378CLEAR variant_pipeline
379RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
380
381EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
382