3 # Copyright 2022 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 the GraphicsFuzz project.
20 # Short description: A fragment shader that covers specific LLVM code paths
22 # The test passes because the shader always writes red.
24 SHADER vertex variant_vertex_shader PASSTHROUGH
26 # variant_fragment_shader is derived from the following GLSL:
29 # #define _int_3 _GLF_uniform_int_values[0]
30 # #define _int_1 _GLF_uniform_int_values[1]
31 # #define _int_0 _GLF_uniform_int_values[2]
32 # #define _float_1_0 _GLF_uniform_float_values[0]
33 # #define _float_256_0 _GLF_uniform_float_values[1]
35 # precision highp float;
36 # precision highp int;
38 # // Contents of _GLF_uniform_float_values: [1.0, 256.0]
39 # layout(set = 0, binding = 0) uniform buf0
41 # float _GLF_uniform_float_values[2];
44 # // Contents of _GLF_uniform_int_values: [3, 1, 0]
45 # layout(set = 0, binding = 1) uniform buf1
47 # int _GLF_uniform_int_values[3];
50 # layout(location = 0) out vec4 _GLF_color;
55 # if(gl_FragCoord.x < 0.0)
60 # float a = _float_1_0;
61 # float b = _float_1_0;
62 # float c = _float_1_0;
63 # vec3 v = vec3(_int_0);
66 # if(gl_FragCoord.y < 0.0)
71 # // Iterates three times.
72 # for(int i = _int_0; i < _int_3; i++)
75 # if(gl_FragCoord.x < 0.0)
81 # while(gl_FragCoord.y < 0.0)
87 # if(gl_FragCoord.y < 0.0)
92 # // No effect as b is already one.
98 # // No effect: 1 * 256 = 1.
100 # // v[i] becomes 1 + 0 = 1.
105 # if(v == vec3(_int_1))
107 # _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
111 # _GLF_color = vec4(_int_0);
114 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
117 ; Generator: Khronos Glslang Reference Front End; 10
121 %1 = OpExtInstImport "GLSL.std.450"
122 OpMemoryModel Logical GLSL450
123 OpEntryPoint Fragment %4 "main" %9 %122
124 OpExecutionMode %4 OriginUpperLeft
127 OpName %9 "gl_FragCoord"
130 OpMemberName %25 0 "_GLF_uniform_float_values"
136 OpMemberName %44 0 "_GLF_uniform_int_values"
139 OpName %122 "_GLF_color"
140 OpDecorate %9 BuiltIn FragCoord
141 OpDecorate %24 ArrayStride 16
142 OpMemberDecorate %25 0 Offset 0
144 OpDecorate %27 DescriptorSet 0
145 OpDecorate %27 Binding 0
146 OpDecorate %43 ArrayStride 16
147 OpMemberDecorate %44 0 Offset 0
149 OpDecorate %46 DescriptorSet 0
150 OpDecorate %46 Binding 1
151 OpDecorate %122 Location 0
153 %3 = OpTypeFunction %2
155 %7 = OpTypeVector %6 4
156 %8 = OpTypePointer Input %7
157 %9 = OpVariable %8 Input
159 %11 = OpConstant %10 0
160 %12 = OpTypePointer Input %6
161 %15 = OpConstant %6 0
163 %21 = OpTypePointer Function %6
164 %23 = OpConstant %10 2
165 %24 = OpTypeArray %6 %23
166 %25 = OpTypeStruct %24
167 %26 = OpTypePointer Uniform %25
168 %27 = OpVariable %26 Uniform
170 %29 = OpConstant %28 0
171 %30 = OpTypePointer Uniform %6
172 %39 = OpTypeVector %6 3
173 %40 = OpTypePointer Function %39
174 %42 = OpConstant %10 3
175 %43 = OpTypeArray %28 %42
176 %44 = OpTypeStruct %43
177 %45 = OpTypePointer Uniform %44
178 %46 = OpVariable %45 Uniform
179 %47 = OpConstant %28 2
180 %48 = OpTypePointer Uniform %28
181 %53 = OpConstant %10 1
182 %60 = OpConstant %6 1
183 %62 = OpTypePointer Function %28
184 %99 = OpConstant %28 1
185 %116 = OpTypeVector %16 3
186 %121 = OpTypePointer Output %7
187 %122 = OpVariable %121 Output
188 %4 = OpFunction %2 None %3
190 %22 = OpVariable %21 Function
191 %33 = OpVariable %21 Function
192 %36 = OpVariable %21 Function
193 %41 = OpVariable %40 Function
194 %63 = OpVariable %62 Function
195 %13 = OpAccessChain %12 %9 %11
197 %17 = OpFOrdLessThan %16 %14 %15
198 OpSelectionMerge %19 None
199 OpBranchConditional %17 %18 %19
203 %31 = OpAccessChain %30 %27 %29 %29
206 %34 = OpAccessChain %30 %27 %29 %29
209 %37 = OpAccessChain %30 %27 %29 %29
212 %49 = OpAccessChain %48 %46 %29 %47
214 %51 = OpConvertSToF %6 %50
215 %52 = OpCompositeConstruct %39 %51 %51 %51
217 %54 = OpAccessChain %12 %9 %53
219 %56 = OpFOrdLessThan %16 %55 %15
220 OpSelectionMerge %58 None
221 OpBranchConditional %56 %57 %58
224 %61 = OpFAdd %6 %59 %60
228 %64 = OpAccessChain %48 %46 %29 %47
233 OpLoopMerge %68 %69 None
237 %72 = OpAccessChain %48 %46 %29 %29
239 %74 = OpSLessThan %16 %71 %73
240 OpBranchConditional %74 %67 %68
242 %75 = OpAccessChain %12 %9 %11
244 %77 = OpFOrdLessThan %16 %76 %15
245 OpSelectionMerge %79 None
246 OpBranchConditional %77 %78 %80
252 OpLoopMerge %83 %84 None
255 %86 = OpAccessChain %12 %9 %53
257 %88 = OpFOrdLessThan %16 %87 %15
258 OpBranchConditional %88 %82 %83
266 %89 = OpAccessChain %12 %9 %53
268 %91 = OpFOrdLessThan %16 %90 %15
269 OpSelectionMerge %93 None
270 OpBranchConditional %91 %92 %94
278 %96 = OpFSub %6 %60 %95
280 %98 = OpFMul %6 %97 %96
282 %100 = OpAccessChain %30 %27 %29 %99
283 %101 = OpLoad %6 %100
285 %103 = OpFMul %6 %102 %101
287 %104 = OpLoad %28 %63
290 %107 = OpFAdd %6 %105 %106
291 %108 = OpAccessChain %21 %41 %104
295 %109 = OpLoad %28 %63
296 %110 = OpIAdd %28 %109 %99
300 %111 = OpLoad %39 %41
301 %112 = OpAccessChain %48 %46 %29 %99
302 %113 = OpLoad %28 %112
303 %114 = OpConvertSToF %6 %113
304 %115 = OpCompositeConstruct %39 %114 %114 %114
305 %117 = OpFOrdEqual %116 %111 %115
306 %118 = OpAll %16 %117
307 OpSelectionMerge %120 None
308 OpBranchConditional %118 %119 %136
310 %123 = OpAccessChain %48 %46 %29 %99
311 %124 = OpLoad %28 %123
312 %125 = OpConvertSToF %6 %124
313 %126 = OpAccessChain %48 %46 %29 %47
314 %127 = OpLoad %28 %126
315 %128 = OpConvertSToF %6 %127
316 %129 = OpAccessChain %48 %46 %29 %47
317 %130 = OpLoad %28 %129
318 %131 = OpConvertSToF %6 %130
319 %132 = OpAccessChain %48 %46 %29 %99
320 %133 = OpLoad %28 %132
321 %134 = OpConvertSToF %6 %133
322 %135 = OpCompositeConstruct %7 %125 %128 %131 %134
326 %137 = OpAccessChain %48 %46 %29 %47
327 %138 = OpLoad %28 %137
328 %139 = OpConvertSToF %6 %138
329 %140 = OpCompositeConstruct %7 %139 %139 %139 %139
337 # uniforms for variant
339 # _GLF_uniform_int_values
340 BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
343 # _GLF_uniform_float_values
344 BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
348 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
350 PIPELINE graphics variant_pipeline
351 ATTACH variant_vertex_shader
352 ATTACH variant_fragment_shader
353 FRAMEBUFFER_SIZE 32 32
354 BIND BUFFER variant_framebuffer AS color LOCATION 0
355 BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
356 BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
358 CLEAR_COLOR variant_pipeline 0 0 0 255
360 CLEAR variant_pipeline
361 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 32 32
363 EXPECT variant_framebuffer IDX 0 0 SIZE 32 32 EQ_RGBA 255 0 0 255