3 # Copyright 2021 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_9 _GLF_uniform_int_values[3]
33 # #define _int_20 _GLF_uniform_int_values[4]
34 # #define _int_29 _GLF_uniform_int_values[5]
36 # precision highp float;
37 # precision highp int;
39 # // Contents of _GLF_uniform_int_values: [1, 0, 2, 9, 20, 29]
40 # layout(set = 0, binding = 0) uniform buf0
42 # int _GLF_uniform_int_values[6];
44 # layout(location = 0) out vec4 _GLF_color;
46 # // A void function that only touches local variables and returns.
53 # int a = int[10](_int_1, _int_2, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1)[index];
57 # // Executed during the second iteration.
68 # for(int i = _int_0; i < _int_20; i ++)
70 # // Doesn't have any effect.
74 # int arr[9] = int[9](_int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1);
76 # // The array is never read so we don't care if the elements get incremented or not.
77 # // The loop increments a by 10 in total.
78 # for(int j = 0; j < 10; j ++)
80 # arr[clamp(a, _int_0, 8)] = _int_1;
85 # arr[clamp(a, 0, 8)]++;
87 # arr[clamp(a, 0, 8)]++;
96 # _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
100 # _GLF_color = vec4(_int_0);
103 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
106 ; Generator: Khronos Glslang Reference Front End; 10
110 %1 = OpExtInstImport "GLSL.std.450"
111 OpMemoryModel Logical GLSL450
112 OpEntryPoint Fragment %4 "main" %157
113 OpExecutionMode %4 OriginUpperLeft
119 OpMemberName %14 0 "_GLF_uniform_int_values"
122 OpName %56 "indexable"
127 OpName %157 "_GLF_color"
128 OpDecorate %13 ArrayStride 16
129 OpMemberDecorate %14 0 Offset 0
131 OpDecorate %16 DescriptorSet 0
132 OpDecorate %16 Binding 0
133 OpDecorate %157 Location 0
135 %3 = OpTypeFunction %2
137 %9 = OpTypePointer Function %8
139 %12 = OpConstant %11 6
140 %13 = OpTypeArray %8 %12
141 %14 = OpTypeStruct %13
142 %15 = OpTypePointer Uniform %14
143 %16 = OpVariable %15 Uniform
144 %17 = OpConstant %8 0
145 %18 = OpConstant %8 1
146 %19 = OpTypePointer Uniform %8
148 %28 = OpConstantTrue %27
149 %32 = OpConstant %8 2
150 %51 = OpConstant %11 10
151 %52 = OpTypeArray %8 %51
152 %55 = OpTypePointer Function %52
153 %80 = OpConstant %8 4
154 %86 = OpConstant %11 9
155 %87 = OpTypeArray %8 %86
156 %88 = OpTypePointer Function %87
157 %116 = OpConstant %8 10
158 %121 = OpConstant %8 8
159 %148 = OpConstant %8 5
160 %154 = OpTypeFloat 32
161 %155 = OpTypeVector %154 4
162 %156 = OpTypePointer Output %155
163 %157 = OpVariable %156 Output
164 %4 = OpFunction %2 None %3
166 %68 = OpVariable %9 Function
167 %71 = OpVariable %9 Function
168 %89 = OpVariable %88 Function
169 %109 = OpVariable %9 Function
170 %69 = OpAccessChain %19 %16 %17 %18
173 %72 = OpAccessChain %19 %16 %17 %18
178 OpLoopMerge %76 %77 None
182 %81 = OpAccessChain %19 %16 %17 %80
184 %83 = OpSLessThan %27 %79 %82
185 OpBranchConditional %83 %75 %76
187 %84 = OpFunctionCall %2 %6
190 %90 = OpAccessChain %19 %16 %17 %17
192 %92 = OpAccessChain %19 %16 %17 %17
194 %94 = OpAccessChain %19 %16 %17 %17
196 %96 = OpAccessChain %19 %16 %17 %17
198 %98 = OpAccessChain %19 %16 %17 %17
200 %100 = OpAccessChain %19 %16 %17 %17
201 %101 = OpLoad %8 %100
202 %102 = OpAccessChain %19 %16 %17 %17
203 %103 = OpLoad %8 %102
204 %104 = OpAccessChain %19 %16 %17 %17
205 %105 = OpLoad %8 %104
206 %106 = OpAccessChain %19 %16 %17 %17
207 %107 = OpLoad %8 %106
208 %108 = OpCompositeConstruct %87 %91 %93 %95 %97 %99 %101 %103 %105 %107
213 OpLoopMerge %112 %113 None
216 %115 = OpLoad %8 %109
217 %117 = OpSLessThan %27 %115 %116
218 OpBranchConditional %117 %111 %112
221 %119 = OpAccessChain %19 %16 %17 %18
222 %120 = OpLoad %8 %119
223 %122 = OpExtInst %8 %1 SClamp %118 %120 %121
224 %123 = OpAccessChain %19 %16 %17 %17
225 %124 = OpLoad %8 %123
226 %125 = OpAccessChain %9 %89 %122
229 OpSelectionMerge %129 None
230 OpSwitch %126 %129 0 %127 8 %128
233 %131 = OpExtInst %8 %1 SClamp %130 %17 %121
234 %132 = OpAccessChain %9 %89 %131
235 %133 = OpLoad %8 %132
236 %134 = OpIAdd %8 %133 %18
241 %136 = OpExtInst %8 %1 SClamp %135 %17 %121
242 %137 = OpAccessChain %9 %89 %136
243 %138 = OpLoad %8 %137
244 %139 = OpIAdd %8 %138 %18
249 %142 = OpIAdd %8 %141 %18
253 %143 = OpLoad %8 %109
254 %144 = OpIAdd %8 %143 %18
261 %146 = OpIAdd %8 %145 %18
266 %149 = OpAccessChain %19 %16 %17 %148
267 %150 = OpLoad %8 %149
268 %151 = OpIEqual %27 %147 %150
269 OpSelectionMerge %153 None
270 OpBranchConditional %151 %152 %171
272 %158 = OpAccessChain %19 %16 %17 %17
273 %159 = OpLoad %8 %158
274 %160 = OpConvertSToF %154 %159
275 %161 = OpAccessChain %19 %16 %17 %18
276 %162 = OpLoad %8 %161
277 %163 = OpConvertSToF %154 %162
278 %164 = OpAccessChain %19 %16 %17 %18
279 %165 = OpLoad %8 %164
280 %166 = OpConvertSToF %154 %165
281 %167 = OpAccessChain %19 %16 %17 %17
282 %168 = OpLoad %8 %167
283 %169 = OpConvertSToF %154 %168
284 %170 = OpCompositeConstruct %155 %160 %163 %166 %169
288 %172 = OpAccessChain %19 %16 %17 %18
289 %173 = OpLoad %8 %172
290 %174 = OpConvertSToF %154 %173
291 %175 = OpCompositeConstruct %155 %174 %174 %174 %174
297 %6 = OpFunction %2 None %3
299 %10 = OpVariable %9 Function
300 %29 = OpVariable %9 Function
301 %56 = OpVariable %55 Function
302 %20 = OpAccessChain %19 %16 %17 %18
307 OpLoopMerge %24 %25 None
310 OpBranchConditional %28 %23 %24
312 %30 = OpAccessChain %19 %16 %17 %17
314 %33 = OpAccessChain %19 %16 %17 %32
316 %35 = OpAccessChain %19 %16 %17 %17
318 %37 = OpAccessChain %19 %16 %17 %17
320 %39 = OpAccessChain %19 %16 %17 %17
322 %41 = OpAccessChain %19 %16 %17 %17
324 %43 = OpAccessChain %19 %16 %17 %17
326 %45 = OpAccessChain %19 %16 %17 %17
328 %47 = OpAccessChain %19 %16 %17 %17
330 %49 = OpAccessChain %19 %16 %17 %17
332 %53 = OpCompositeConstruct %52 %31 %34 %36 %38 %40 %42 %44 %46 %48 %50
335 %57 = OpAccessChain %9 %56 %54
339 %60 = OpAccessChain %19 %16 %17 %32
341 %62 = OpIEqual %27 %59 %61
342 OpSelectionMerge %64 None
343 OpBranchConditional %62 %63 %64
347 %66 = OpAccessChain %19 %16 %17 %17
358 # uniforms for variant
360 # _GLF_uniform_int_values
361 BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
365 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
367 PIPELINE graphics variant_pipeline
368 ATTACH variant_vertex_shader
369 ATTACH variant_fragment_shader
370 FRAMEBUFFER_SIZE 16 16
371 BIND BUFFER variant_framebuffer AS color LOCATION 0
372 BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
374 CLEAR_COLOR variant_pipeline 0 0 0 255
376 CLEAR variant_pipeline
377 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
379 EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255