3 # Copyright 2020 Google LLC
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
9 # http://www.apache.org/licenses/LICENSE-2.0
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.
18 # A test for a coverage-gap found by GraphicsFuzz.
20 # Short description: A fragment shader that covers a specific scaled number code path.
22 # The test passes because shader always writes red.
24 SHADER vertex variant_vertex_shader PASSTHROUGH
26 # variant_fragment_shader is derived from the following GLSL:
28 # precision highp float;
29 # precision highp int;
31 # layout(location = 0) out vec4 _GLF_color;
33 # layout(set = 0, binding = 0) uniform buf0
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++)
51 # // Always true, but will break at the end of the loop.
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++)
65 # _GLF_color = vec4(1, 0, 0, 1);
67 # _GLF_color = vec4(0);
69 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
72 ; Generator: Khronos Glslang Reference Front End; 8
76 %1 = OpExtInstImport "GLSL.std.450"
77 OpMemoryModel Logical GLSL450
78 OpEntryPoint Fragment %4 "main" %157
79 OpExecutionMode %4 OriginUpperLeft
85 OpMemberName %17 0 "one"
96 OpName %157 "_GLF_color"
97 OpMemberDecorate %17 0 Offset 0
99 OpDecorate %19 DescriptorSet 0
100 OpDecorate %19 Binding 0
101 OpDecorate %157 Location 0
103 %3 = OpTypeFunction %2
105 %7 = OpTypePointer Function %6
107 %17 = OpTypeStruct %6
108 %18 = OpTypePointer Uniform %17
109 %19 = OpVariable %18 Uniform
110 %20 = OpTypePointer Uniform %6
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
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
140 OpLoopMerge %13 %14 None
144 %21 = OpAccessChain %20 %19 %9
146 %24 = OpSLessThan %23 %16 %22
147 OpBranchConditional %24 %12 %13
152 OpLoopMerge %28 %29 None
156 %32 = OpAccessChain %20 %19 %9
158 %34 = OpSLessThan %23 %31 %33
159 OpBranchConditional %34 %27 %28
164 OpLoopMerge %38 %39 None
168 %42 = OpAccessChain %20 %19 %9
170 %44 = OpSLessThan %23 %41 %43
171 OpBranchConditional %44 %37 %38
176 OpLoopMerge %48 %49 None
180 %52 = OpAccessChain %20 %19 %9
182 %55 = OpIAdd %6 %53 %54
183 %56 = OpSLessThan %23 %51 %55
184 OpBranchConditional %56 %47 %48
189 OpLoopMerge %60 %61 None
193 %64 = OpAccessChain %20 %19 %9
195 %66 = OpSLessThan %23 %63 %65
196 OpBranchConditional %66 %59 %60
201 OpLoopMerge %70 %71 None
205 %74 = OpAccessChain %20 %19 %9
207 %76 = OpSLessThan %23 %73 %75
208 OpBranchConditional %76 %69 %70
212 OpLoopMerge %79 %80 None
215 %82 = OpAccessChain %20 %19 %9
217 %84 = OpSGreaterThan %23 %83 %9
218 OpBranchConditional %84 %78 %79
223 OpLoopMerge %88 %89 None
227 %92 = OpAccessChain %20 %19 %9
229 %94 = OpSLessThan %23 %91 %93
230 OpBranchConditional %94 %87 %88
235 OpLoopMerge %98 %99 None
239 %102 = OpAccessChain %20 %19 %9
240 %103 = OpLoad %6 %102
241 %104 = OpSLessThan %23 %101 %103
242 OpBranchConditional %104 %97 %98
247 OpLoopMerge %108 %109 None
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
259 OpLoopMerge %118 %119 None
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
269 %127 = OpIAdd %6 %125 %126
273 %128 = OpLoad %6 %115
274 %129 = OpIAdd %6 %128 %126
280 %130 = OpLoad %6 %105
281 %131 = OpIAdd %6 %130 %126
288 %133 = OpIAdd %6 %132 %126
295 %135 = OpIAdd %6 %134 %126
306 %138 = OpIAdd %6 %137 %126
313 %140 = OpIAdd %6 %139 %126
320 %142 = OpIAdd %6 %141 %126
327 %144 = OpIAdd %6 %143 %126
334 %146 = OpIAdd %6 %145 %126
341 %148 = OpIAdd %6 %147 %126
346 %151 = OpIEqual %23 %149 %150
347 OpSelectionMerge %153 None
348 OpBranchConditional %151 %152 %161
360 # uniforms for variant
363 BUFFER variant_one DATA_TYPE int32 DATA
367 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
369 PIPELINE graphics variant_pipeline
370 ATTACH variant_vertex_shader
371 ATTACH variant_fragment_shader
372 FRAMEBUFFER_SIZE 16 16
373 BIND BUFFER variant_framebuffer AS color LOCATION 0
374 BIND BUFFER variant_one AS uniform DESCRIPTOR_SET 0 BINDING 0
376 CLEAR_COLOR variant_pipeline 0 0 0 255
378 CLEAR variant_pipeline
379 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
381 EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255