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_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_3 _GLF_uniform_int_values[3]
33 # #define _float_1_0 _GLF_uniform_float_values[0]
34 # #define _float_9_0 _GLF_uniform_float_values[1]
35 # #define _float_10_0 _GLF_uniform_float_values[2]
36 # #define _float_2_0 _GLF_uniform_float_values[3]
38 # precision highp float;
39 # precision highp int;
41 # // Contents of _GLF_uniform_int_values: [1, 0, 2, 3]
42 # layout(set = 0, binding = 0) uniform buf0
44 # int _GLF_uniform_int_values[4];
47 # // Contents of _GLF_uniform_float_values: [1.0, 9.0, 10.0, 2.0]
48 # layout(set = 0, binding = 1) uniform buf1
50 # float _GLF_uniform_float_values[4];
53 # layout(location = 0) out vec4 _GLF_color;
57 # float f = _float_2_0;
58 # mat4 m = mat4(_float_1_0);
61 # // i = 1: m[1][1] = m[1][1] - 5 * 2 = 1 - 10 = -9.
62 # // i = 2: m[1][2] = m[1][1] - 1 = -9 - 1 = -10.
63 # // i = 3: m[1][3] = m[1][1] - 1 = -9 - 1 = -10.
64 # for(int i = 1; i < 4; i ++)
67 # if(gl_FragCoord.x < 0.0)
78 # for(int j = 1; j < 6; j++)
80 # m[_int_1][i] = m[_int_1][_int_1] - f;
86 # mat4 ref = mat4(_float_1_0);
94 # _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
98 # _GLF_color = vec4(_int_0);
101 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
104 ; Generator: Khronos Glslang Reference Front End; 10
108 %1 = OpExtInstImport "GLSL.std.450"
109 OpMemoryModel Logical GLSL450
110 OpEntryPoint Fragment %4 "main" %48 %137
111 OpExecutionMode %4 OriginUpperLeft
116 OpMemberName %12 0 "_GLF_uniform_float_values"
121 OpName %48 "gl_FragCoord"
124 OpMemberName %74 0 "_GLF_uniform_int_values"
127 OpName %137 "_GLF_color"
128 OpDecorate %11 ArrayStride 16
129 OpMemberDecorate %12 0 Offset 0
131 OpDecorate %14 DescriptorSet 0
132 OpDecorate %14 Binding 1
133 OpDecorate %48 BuiltIn FragCoord
134 OpDecorate %73 ArrayStride 16
135 OpMemberDecorate %74 0 Offset 0
137 OpDecorate %76 DescriptorSet 0
138 OpDecorate %76 Binding 0
139 OpDecorate %137 Location 0
141 %3 = OpTypeFunction %2
143 %7 = OpTypePointer Function %6
145 %10 = OpConstant %9 4
146 %11 = OpTypeArray %6 %10
147 %12 = OpTypeStruct %11
148 %13 = OpTypePointer Uniform %12
149 %14 = OpVariable %13 Uniform
151 %16 = OpConstant %15 0
152 %17 = OpConstant %15 3
153 %18 = OpTypePointer Uniform %6
154 %21 = OpTypeVector %6 4
155 %22 = OpTypeMatrix %21 4
156 %23 = OpTypePointer Function %22
157 %27 = OpConstant %6 1
158 %28 = OpConstant %6 0
159 %34 = OpTypePointer Function %15
160 %36 = OpConstant %15 1
161 %44 = OpConstant %15 4
163 %47 = OpTypePointer Input %21
164 %48 = OpVariable %47 Input
165 %49 = OpConstant %9 0
166 %50 = OpTypePointer Input %6
167 %59 = OpConstant %15 5
168 %71 = OpConstant %15 6
169 %73 = OpTypeArray %15 %10
170 %74 = OpTypeStruct %73
171 %75 = OpTypePointer Uniform %74
172 %76 = OpVariable %75 Uniform
173 %77 = OpTypePointer Uniform %15
174 %104 = OpConstant %6 -9
175 %105 = OpConstant %9 1
176 %107 = OpConstant %6 -10
177 %108 = OpConstant %9 2
178 %110 = OpConstant %9 3
179 %116 = OpTypeVector %45 4
180 %136 = OpTypePointer Output %21
181 %137 = OpVariable %136 Output
182 %4 = OpFunction %2 None %3
184 %8 = OpVariable %7 Function
185 %24 = OpVariable %23 Function
186 %35 = OpVariable %34 Function
187 %37 = OpVariable %34 Function
188 %64 = OpVariable %34 Function
189 %96 = OpVariable %23 Function
190 %19 = OpAccessChain %18 %14 %16 %17
193 %25 = OpAccessChain %18 %14 %16 %16
195 %29 = OpCompositeConstruct %21 %26 %28 %28 %28
196 %30 = OpCompositeConstruct %21 %28 %26 %28 %28
197 %31 = OpCompositeConstruct %21 %28 %28 %26 %28
198 %32 = OpCompositeConstruct %21 %28 %28 %28 %26
199 %33 = OpCompositeConstruct %22 %29 %30 %31 %32
205 OpLoopMerge %40 %41 None
209 %46 = OpSLessThan %45 %43 %44
210 OpBranchConditional %46 %39 %40
212 %51 = OpAccessChain %50 %48 %49
214 %53 = OpFOrdLessThan %45 %52 %28
215 OpSelectionMerge %55 None
216 OpBranchConditional %53 %54 %55
221 %58 = OpIAdd %15 %57 %36
223 %60 = OpSGreaterThanEqual %45 %57 %59
224 OpSelectionMerge %62 None
225 OpBranchConditional %60 %61 %62
232 OpLoopMerge %67 %68 None
236 %72 = OpSLessThan %45 %70 %71
237 OpBranchConditional %72 %66 %67
239 %78 = OpAccessChain %77 %76 %16 %16
242 %81 = OpAccessChain %77 %76 %16 %16
244 %83 = OpAccessChain %77 %76 %16 %16
246 %85 = OpAccessChain %7 %24 %82 %84
249 %88 = OpFSub %6 %86 %87
250 %89 = OpAccessChain %7 %24 %79 %80
255 %91 = OpIAdd %15 %90 %36
259 %92 = OpAccessChain %18 %14 %16 %16
265 %95 = OpIAdd %15 %94 %36
269 %97 = OpAccessChain %18 %14 %16 %16
271 %99 = OpCompositeConstruct %21 %98 %28 %28 %28
272 %100 = OpCompositeConstruct %21 %28 %98 %28 %28
273 %101 = OpCompositeConstruct %21 %28 %28 %98 %28
274 %102 = OpCompositeConstruct %21 %28 %28 %28 %98
275 %103 = OpCompositeConstruct %22 %99 %100 %101 %102
277 %106 = OpAccessChain %7 %96 %36 %105
279 %109 = OpAccessChain %7 %96 %36 %108
281 %111 = OpAccessChain %7 %96 %36 %110
283 %112 = OpLoad %22 %24
284 %113 = OpLoad %22 %96
285 %114 = OpCompositeExtract %21 %112 0
286 %115 = OpCompositeExtract %21 %113 0
287 %117 = OpFOrdEqual %116 %114 %115
288 %118 = OpAll %45 %117
289 %119 = OpCompositeExtract %21 %112 1
290 %120 = OpCompositeExtract %21 %113 1
291 %121 = OpFOrdEqual %116 %119 %120
292 %122 = OpAll %45 %121
293 %123 = OpLogicalAnd %45 %118 %122
294 %124 = OpCompositeExtract %21 %112 2
295 %125 = OpCompositeExtract %21 %113 2
296 %126 = OpFOrdEqual %116 %124 %125
297 %127 = OpAll %45 %126
298 %128 = OpLogicalAnd %45 %123 %127
299 %129 = OpCompositeExtract %21 %112 3
300 %130 = OpCompositeExtract %21 %113 3
301 %131 = OpFOrdEqual %116 %129 %130
302 %132 = OpAll %45 %131
303 %133 = OpLogicalAnd %45 %128 %132
304 OpSelectionMerge %135 None
305 OpBranchConditional %133 %134 %151
307 %138 = OpAccessChain %77 %76 %16 %16
308 %139 = OpLoad %15 %138
309 %140 = OpConvertSToF %6 %139
310 %141 = OpAccessChain %77 %76 %16 %36
311 %142 = OpLoad %15 %141
312 %143 = OpConvertSToF %6 %142
313 %144 = OpAccessChain %77 %76 %16 %36
314 %145 = OpLoad %15 %144
315 %146 = OpConvertSToF %6 %145
316 %147 = OpAccessChain %77 %76 %16 %16
317 %148 = OpLoad %15 %147
318 %149 = OpConvertSToF %6 %148
319 %150 = OpCompositeConstruct %21 %140 %143 %146 %149
323 %152 = OpAccessChain %77 %76 %16 %36
324 %153 = OpLoad %15 %152
325 %154 = OpConvertSToF %6 %153
326 %155 = OpCompositeConstruct %21 %154 %154 %154 %154
334 # uniforms for variant
336 # _GLF_uniform_float_values
337 BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
340 # _GLF_uniform_int_values
341 BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
345 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
347 PIPELINE graphics variant_pipeline
348 ATTACH variant_vertex_shader
349 ATTACH variant_fragment_shader
350 FRAMEBUFFER_SIZE 32 32
351 BIND BUFFER variant_framebuffer AS color LOCATION 0
352 BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
353 BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
355 CLEAR_COLOR variant_pipeline 0 0 0 255
357 CLEAR variant_pipeline
358 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 32 32
360 EXPECT variant_framebuffer IDX 0 0 SIZE 32 32 EQ_RGBA 255 0 0 255