1e5c31af7Sopenharmony_ci#!amber
2e5c31af7Sopenharmony_ci
3e5c31af7Sopenharmony_ci# Copyright 2022 Google LLC
4e5c31af7Sopenharmony_ci#
5e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
6e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License.
7e5c31af7Sopenharmony_ci# You may obtain a copy of the License at
8e5c31af7Sopenharmony_ci#
9e5c31af7Sopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
10e5c31af7Sopenharmony_ci#
11e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
12e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
13e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and
15e5c31af7Sopenharmony_ci# limitations under the License.
16e5c31af7Sopenharmony_ci
17e5c31af7Sopenharmony_ci
18e5c31af7Sopenharmony_ci# A test for a coverage-gap found by the GraphicsFuzz project.
19e5c31af7Sopenharmony_ci
20e5c31af7Sopenharmony_ci# Short description: A fragment shader that covers specific LLVM code paths
21e5c31af7Sopenharmony_ci
22e5c31af7Sopenharmony_ci# The test passes because the shader always writes red.
23e5c31af7Sopenharmony_ci
24e5c31af7Sopenharmony_ci# Optimized using spirv-opt with the following arguments:
25e5c31af7Sopenharmony_ci# '-O'
26e5c31af7Sopenharmony_ci# spirv-opt commit hash: a0370efd589be33d5d9a85cfde2f85841b3755af
27e5c31af7Sopenharmony_ci
28e5c31af7Sopenharmony_ci
29e5c31af7Sopenharmony_ci
30e5c31af7Sopenharmony_ciSHADER vertex variant_vertex_shader PASSTHROUGH
31e5c31af7Sopenharmony_ci
32e5c31af7Sopenharmony_ci# variant_fragment_shader is derived from the following GLSL:
33e5c31af7Sopenharmony_ci# #version 320 es
34e5c31af7Sopenharmony_ci#
35e5c31af7Sopenharmony_ci# #define _int_8 _GLF_uniform_int_values[0]
36e5c31af7Sopenharmony_ci# #define _int_2 _GLF_uniform_int_values[1]
37e5c31af7Sopenharmony_ci# #define _int_0 _GLF_uniform_int_values[2]
38e5c31af7Sopenharmony_ci# #define _int_1 _GLF_uniform_int_values[3]
39e5c31af7Sopenharmony_ci# #define _int_3 _GLF_uniform_int_values[4]
40e5c31af7Sopenharmony_ci# #define _float_0_0 _GLF_uniform_float_values[0]
41e5c31af7Sopenharmony_ci# #define _float_2_0 _GLF_uniform_float_values[1]
42e5c31af7Sopenharmony_ci#
43e5c31af7Sopenharmony_ci# precision highp float;
44e5c31af7Sopenharmony_ci# precision highp int;
45e5c31af7Sopenharmony_ci#
46e5c31af7Sopenharmony_ci# // Contents of _GLF_uniform_int_values: [8, 2, 0, 1, 3]
47e5c31af7Sopenharmony_ci# layout(set = 0, binding = 0) uniform buf0
48e5c31af7Sopenharmony_ci# {
49e5c31af7Sopenharmony_ci#     int _GLF_uniform_int_values[5];
50e5c31af7Sopenharmony_ci# };
51e5c31af7Sopenharmony_ci#
52e5c31af7Sopenharmony_ci# // Contents of _GLF_uniform_float_values: [0.0, 2.0]
53e5c31af7Sopenharmony_ci# layout(set = 0, binding = 1) uniform buf1
54e5c31af7Sopenharmony_ci# {
55e5c31af7Sopenharmony_ci#     float _GLF_uniform_float_values[2];
56e5c31af7Sopenharmony_ci# };
57e5c31af7Sopenharmony_ci#
58e5c31af7Sopenharmony_ci# // Contents of injectionSwitch: [0.0, 1.0]
59e5c31af7Sopenharmony_ci# layout(set = 0, binding = 2) uniform buf2
60e5c31af7Sopenharmony_ci# {
61e5c31af7Sopenharmony_ci#     highp vec2 injectionSwitch;
62e5c31af7Sopenharmony_ci# };
63e5c31af7Sopenharmony_ci#
64e5c31af7Sopenharmony_ci# layout(location = 0) out vec4 _GLF_color;
65e5c31af7Sopenharmony_ci#
66e5c31af7Sopenharmony_ci# // Returns true if v.y >= 2.0.
67e5c31af7Sopenharmony_ci# bool func0(vec4 v)
68e5c31af7Sopenharmony_ci# {
69e5c31af7Sopenharmony_ci#     // Always false.
70e5c31af7Sopenharmony_ci#     while(injectionSwitch.x < _float_0_0)
71e5c31af7Sopenharmony_ci#     {
72e5c31af7Sopenharmony_ci#         return false;
73e5c31af7Sopenharmony_ci#     }
74e5c31af7Sopenharmony_ci#
75e5c31af7Sopenharmony_ci#     if(v.y < _float_2_0)
76e5c31af7Sopenharmony_ci#     {
77e5c31af7Sopenharmony_ci#         return false;
78e5c31af7Sopenharmony_ci#     }
79e5c31af7Sopenharmony_ci#
80e5c31af7Sopenharmony_ci#     return true;
81e5c31af7Sopenharmony_ci# }
82e5c31af7Sopenharmony_ci#
83e5c31af7Sopenharmony_ci# // Returns 2.
84e5c31af7Sopenharmony_ci# int func1()
85e5c31af7Sopenharmony_ci# {
86e5c31af7Sopenharmony_ci#     int a = _int_0;
87e5c31af7Sopenharmony_ci#
88e5c31af7Sopenharmony_ci#     // Iterates seven times.
89e5c31af7Sopenharmony_ci#     for(int i = _int_1; i < _int_8; i++)
90e5c31af7Sopenharmony_ci#     {
91e5c31af7Sopenharmony_ci#         if(func0(vec4[8](vec4(_int_1), vec4(_int_1), vec4(_int_3), vec4(_int_1), vec4(_int_1), vec4(_int_1), vec4(_int_1), vec4(_int_1))[i]))
92e5c31af7Sopenharmony_ci#         {
93e5c31af7Sopenharmony_ci#             a = i;
94e5c31af7Sopenharmony_ci#         }
95e5c31af7Sopenharmony_ci#     }
96e5c31af7Sopenharmony_ci#
97e5c31af7Sopenharmony_ci#     return a;
98e5c31af7Sopenharmony_ci# }
99e5c31af7Sopenharmony_ci#
100e5c31af7Sopenharmony_ci# void main()
101e5c31af7Sopenharmony_ci# {
102e5c31af7Sopenharmony_ci#     // Always true.
103e5c31af7Sopenharmony_ci#     if(func1() == _int_2)
104e5c31af7Sopenharmony_ci#     {
105e5c31af7Sopenharmony_ci#         _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
106e5c31af7Sopenharmony_ci#     }
107e5c31af7Sopenharmony_ci#     else
108e5c31af7Sopenharmony_ci#     {
109e5c31af7Sopenharmony_ci#         _GLF_color = vec4(_int_0);
110e5c31af7Sopenharmony_ci#     }
111e5c31af7Sopenharmony_ci# }
112e5c31af7Sopenharmony_ciSHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
113e5c31af7Sopenharmony_ci; SPIR-V
114e5c31af7Sopenharmony_ci; Version: 1.0
115e5c31af7Sopenharmony_ci; Generator: Khronos Glslang Reference Front End; 10
116e5c31af7Sopenharmony_ci; Bound: 275
117e5c31af7Sopenharmony_ci; Schema: 0
118e5c31af7Sopenharmony_ci               OpCapability Shader
119e5c31af7Sopenharmony_ci          %1 = OpExtInstImport "GLSL.std.450"
120e5c31af7Sopenharmony_ci               OpMemoryModel Logical GLSL450
121e5c31af7Sopenharmony_ci               OpEntryPoint Fragment %4 "main" %139
122e5c31af7Sopenharmony_ci               OpExecutionMode %4 OriginUpperLeft
123e5c31af7Sopenharmony_ci               OpSource ESSL 320
124e5c31af7Sopenharmony_ci               OpName %4 "main"
125e5c31af7Sopenharmony_ci               OpName %24 "buf2"
126e5c31af7Sopenharmony_ci               OpMemberName %24 0 "injectionSwitch"
127e5c31af7Sopenharmony_ci               OpName %26 ""
128e5c31af7Sopenharmony_ci               OpName %35 "buf1"
129e5c31af7Sopenharmony_ci               OpMemberName %35 0 "_GLF_uniform_float_values"
130e5c31af7Sopenharmony_ci               OpName %37 ""
131e5c31af7Sopenharmony_ci               OpName %61 "buf0"
132e5c31af7Sopenharmony_ci               OpMemberName %61 0 "_GLF_uniform_int_values"
133e5c31af7Sopenharmony_ci               OpName %63 ""
134e5c31af7Sopenharmony_ci               OpName %139 "_GLF_color"
135e5c31af7Sopenharmony_ci               OpMemberDecorate %24 0 Offset 0
136e5c31af7Sopenharmony_ci               OpDecorate %24 Block
137e5c31af7Sopenharmony_ci               OpDecorate %26 DescriptorSet 0
138e5c31af7Sopenharmony_ci               OpDecorate %26 Binding 2
139e5c31af7Sopenharmony_ci               OpDecorate %34 ArrayStride 16
140e5c31af7Sopenharmony_ci               OpMemberDecorate %35 0 Offset 0
141e5c31af7Sopenharmony_ci               OpDecorate %35 Block
142e5c31af7Sopenharmony_ci               OpDecorate %37 DescriptorSet 0
143e5c31af7Sopenharmony_ci               OpDecorate %37 Binding 1
144e5c31af7Sopenharmony_ci               OpDecorate %60 ArrayStride 16
145e5c31af7Sopenharmony_ci               OpMemberDecorate %61 0 Offset 0
146e5c31af7Sopenharmony_ci               OpDecorate %61 Block
147e5c31af7Sopenharmony_ci               OpDecorate %63 DescriptorSet 0
148e5c31af7Sopenharmony_ci               OpDecorate %63 Binding 0
149e5c31af7Sopenharmony_ci               OpDecorate %139 Location 0
150e5c31af7Sopenharmony_ci          %2 = OpTypeVoid
151e5c31af7Sopenharmony_ci          %3 = OpTypeFunction %2
152e5c31af7Sopenharmony_ci          %6 = OpTypeFloat 32
153e5c31af7Sopenharmony_ci          %7 = OpTypeVector %6 4
154e5c31af7Sopenharmony_ci          %8 = OpTypePointer Function %7
155e5c31af7Sopenharmony_ci          %9 = OpTypeBool
156e5c31af7Sopenharmony_ci         %14 = OpTypeInt 32 1
157e5c31af7Sopenharmony_ci         %23 = OpTypeVector %6 2
158e5c31af7Sopenharmony_ci         %24 = OpTypeStruct %23
159e5c31af7Sopenharmony_ci         %25 = OpTypePointer Uniform %24
160e5c31af7Sopenharmony_ci         %26 = OpVariable %25 Uniform
161e5c31af7Sopenharmony_ci         %27 = OpConstant %14 0
162e5c31af7Sopenharmony_ci         %28 = OpTypeInt 32 0
163e5c31af7Sopenharmony_ci         %29 = OpConstant %28 0
164e5c31af7Sopenharmony_ci         %30 = OpTypePointer Uniform %6
165e5c31af7Sopenharmony_ci         %33 = OpConstant %28 2
166e5c31af7Sopenharmony_ci         %34 = OpTypeArray %6 %33
167e5c31af7Sopenharmony_ci         %35 = OpTypeStruct %34
168e5c31af7Sopenharmony_ci         %36 = OpTypePointer Uniform %35
169e5c31af7Sopenharmony_ci         %37 = OpVariable %36 Uniform
170e5c31af7Sopenharmony_ci         %41 = OpConstantFalse %9
171e5c31af7Sopenharmony_ci         %47 = OpConstant %14 1
172e5c31af7Sopenharmony_ci         %54 = OpConstantTrue %9
173e5c31af7Sopenharmony_ci         %59 = OpConstant %28 5
174e5c31af7Sopenharmony_ci         %60 = OpTypeArray %14 %59
175e5c31af7Sopenharmony_ci         %61 = OpTypeStruct %60
176e5c31af7Sopenharmony_ci         %62 = OpTypePointer Uniform %61
177e5c31af7Sopenharmony_ci         %63 = OpVariable %62 Uniform
178e5c31af7Sopenharmony_ci         %64 = OpConstant %14 2
179e5c31af7Sopenharmony_ci         %65 = OpTypePointer Uniform %14
180e5c31af7Sopenharmony_ci         %69 = OpConstant %14 3
181e5c31af7Sopenharmony_ci         %89 = OpConstant %14 4
182e5c31af7Sopenharmony_ci        %114 = OpConstant %28 8
183e5c31af7Sopenharmony_ci        %115 = OpTypeArray %7 %114
184e5c31af7Sopenharmony_ci        %119 = OpTypePointer Function %115
185e5c31af7Sopenharmony_ci        %138 = OpTypePointer Output %7
186e5c31af7Sopenharmony_ci        %139 = OpVariable %138 Output
187e5c31af7Sopenharmony_ci        %263 = OpUndef %9
188e5c31af7Sopenharmony_ci          %4 = OpFunction %2 None %3
189e5c31af7Sopenharmony_ci          %5 = OpLabel
190e5c31af7Sopenharmony_ci        %169 = OpVariable %119 Function
191e5c31af7Sopenharmony_ci        %172 = OpAccessChain %65 %63 %27 %64
192e5c31af7Sopenharmony_ci        %173 = OpLoad %14 %172
193e5c31af7Sopenharmony_ci        %174 = OpAccessChain %65 %63 %27 %69
194e5c31af7Sopenharmony_ci        %175 = OpLoad %14 %174
195e5c31af7Sopenharmony_ci               OpBranch %176
196e5c31af7Sopenharmony_ci        %176 = OpLabel
197e5c31af7Sopenharmony_ci        %262 = OpPhi %9 %263 %5 %259 %223
198e5c31af7Sopenharmony_ci        %256 = OpPhi %14 %173 %5 %274 %223
199e5c31af7Sopenharmony_ci        %255 = OpPhi %14 %175 %5 %225 %223
200e5c31af7Sopenharmony_ci        %179 = OpAccessChain %65 %63 %27 %27
201e5c31af7Sopenharmony_ci        %180 = OpLoad %14 %179
202e5c31af7Sopenharmony_ci        %181 = OpSLessThan %9 %255 %180
203e5c31af7Sopenharmony_ci               OpLoopMerge %226 %223 None
204e5c31af7Sopenharmony_ci               OpBranchConditional %181 %182 %226
205e5c31af7Sopenharmony_ci        %182 = OpLabel
206e5c31af7Sopenharmony_ci        %185 = OpConvertSToF %6 %175
207e5c31af7Sopenharmony_ci        %186 = OpCompositeConstruct %7 %185 %185 %185 %185
208e5c31af7Sopenharmony_ci        %191 = OpAccessChain %65 %63 %27 %89
209e5c31af7Sopenharmony_ci        %192 = OpLoad %14 %191
210e5c31af7Sopenharmony_ci        %193 = OpConvertSToF %6 %192
211e5c31af7Sopenharmony_ci        %194 = OpCompositeConstruct %7 %193 %193 %193 %193
212e5c31af7Sopenharmony_ci        %215 = OpCompositeConstruct %115 %186 %186 %194 %186 %186 %186 %186 %186
213e5c31af7Sopenharmony_ci               OpStore %169 %215
214e5c31af7Sopenharmony_ci        %217 = OpAccessChain %8 %169 %255
215e5c31af7Sopenharmony_ci        %218 = OpLoad %7 %217
216e5c31af7Sopenharmony_ci               OpSelectionMerge %252 None
217e5c31af7Sopenharmony_ci               OpSwitch %29 %232
218e5c31af7Sopenharmony_ci        %232 = OpLabel
219e5c31af7Sopenharmony_ci               OpBranch %233
220e5c31af7Sopenharmony_ci        %233 = OpLabel
221e5c31af7Sopenharmony_ci        %235 = OpAccessChain %30 %26 %27 %29
222e5c31af7Sopenharmony_ci        %236 = OpLoad %6 %235
223e5c31af7Sopenharmony_ci        %237 = OpAccessChain %30 %37 %27 %27
224e5c31af7Sopenharmony_ci        %238 = OpLoad %6 %237
225e5c31af7Sopenharmony_ci        %239 = OpFOrdLessThan %9 %236 %238
226e5c31af7Sopenharmony_ci               OpLoopMerge %242 %241 None
227e5c31af7Sopenharmony_ci               OpBranchConditional %239 %240 %242
228e5c31af7Sopenharmony_ci        %240 = OpLabel
229e5c31af7Sopenharmony_ci               OpBranch %242
230e5c31af7Sopenharmony_ci        %241 = OpLabel
231e5c31af7Sopenharmony_ci               OpBranch %233
232e5c31af7Sopenharmony_ci        %242 = OpLabel
233e5c31af7Sopenharmony_ci        %260 = OpPhi %9 %262 %233 %41 %240
234e5c31af7Sopenharmony_ci        %257 = OpPhi %9 %41 %233 %54 %240
235e5c31af7Sopenharmony_ci               OpSelectionMerge %244 None
236e5c31af7Sopenharmony_ci               OpBranchConditional %257 %252 %244
237e5c31af7Sopenharmony_ci        %244 = OpLabel
238e5c31af7Sopenharmony_ci        %246 = OpCompositeExtract %6 %218 1
239e5c31af7Sopenharmony_ci        %247 = OpAccessChain %30 %37 %27 %47
240e5c31af7Sopenharmony_ci        %248 = OpLoad %6 %247
241e5c31af7Sopenharmony_ci        %249 = OpFOrdLessThan %9 %246 %248
242e5c31af7Sopenharmony_ci               OpSelectionMerge %251 None
243e5c31af7Sopenharmony_ci               OpBranchConditional %249 %250 %251
244e5c31af7Sopenharmony_ci        %250 = OpLabel
245e5c31af7Sopenharmony_ci               OpBranch %252
246e5c31af7Sopenharmony_ci        %251 = OpLabel
247e5c31af7Sopenharmony_ci               OpBranch %252
248e5c31af7Sopenharmony_ci        %252 = OpLabel
249e5c31af7Sopenharmony_ci        %259 = OpPhi %9 %260 %242 %41 %250 %54 %251
250e5c31af7Sopenharmony_ci        %274 = OpSelect %14 %259 %255 %256
251e5c31af7Sopenharmony_ci               OpBranch %223
252e5c31af7Sopenharmony_ci        %223 = OpLabel
253e5c31af7Sopenharmony_ci        %225 = OpIAdd %14 %255 %47
254e5c31af7Sopenharmony_ci               OpBranch %176
255e5c31af7Sopenharmony_ci        %226 = OpLabel
256e5c31af7Sopenharmony_ci        %133 = OpAccessChain %65 %63 %27 %47
257e5c31af7Sopenharmony_ci        %134 = OpLoad %14 %133
258e5c31af7Sopenharmony_ci        %135 = OpIEqual %9 %256 %134
259e5c31af7Sopenharmony_ci               OpSelectionMerge %137 None
260e5c31af7Sopenharmony_ci               OpBranchConditional %135 %136 %153
261e5c31af7Sopenharmony_ci        %153 = OpLabel
262e5c31af7Sopenharmony_ci        %156 = OpConvertSToF %6 %173
263e5c31af7Sopenharmony_ci        %157 = OpCompositeConstruct %7 %156 %156 %156 %156
264e5c31af7Sopenharmony_ci               OpStore %139 %157
265e5c31af7Sopenharmony_ci               OpBranch %137
266e5c31af7Sopenharmony_ci        %136 = OpLabel
267e5c31af7Sopenharmony_ci        %142 = OpConvertSToF %6 %175
268e5c31af7Sopenharmony_ci        %145 = OpConvertSToF %6 %173
269e5c31af7Sopenharmony_ci        %152 = OpCompositeConstruct %7 %142 %145 %145 %142
270e5c31af7Sopenharmony_ci               OpStore %139 %152
271e5c31af7Sopenharmony_ci               OpBranch %137
272e5c31af7Sopenharmony_ci        %137 = OpLabel
273e5c31af7Sopenharmony_ci               OpReturn
274e5c31af7Sopenharmony_ci               OpFunctionEnd
275e5c31af7Sopenharmony_ciEND
276e5c31af7Sopenharmony_ci
277e5c31af7Sopenharmony_ci# uniforms for variant
278e5c31af7Sopenharmony_ci
279e5c31af7Sopenharmony_ci# injectionSwitch
280e5c31af7Sopenharmony_ciBUFFER variant_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
281e5c31af7Sopenharmony_ci 0.0 1.0
282e5c31af7Sopenharmony_ciEND
283e5c31af7Sopenharmony_ci# _GLF_uniform_float_values
284e5c31af7Sopenharmony_ciBUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
285e5c31af7Sopenharmony_ci 0.0 2.0
286e5c31af7Sopenharmony_ciEND
287e5c31af7Sopenharmony_ci# _GLF_uniform_int_values
288e5c31af7Sopenharmony_ciBUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
289e5c31af7Sopenharmony_ci 8 2 0 1 3
290e5c31af7Sopenharmony_ciEND
291e5c31af7Sopenharmony_ci
292e5c31af7Sopenharmony_ciBUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
293e5c31af7Sopenharmony_ci
294e5c31af7Sopenharmony_ciPIPELINE graphics variant_pipeline
295e5c31af7Sopenharmony_ci  ATTACH variant_vertex_shader
296e5c31af7Sopenharmony_ci  ATTACH variant_fragment_shader
297e5c31af7Sopenharmony_ci  FRAMEBUFFER_SIZE 32 32
298e5c31af7Sopenharmony_ci  BIND BUFFER variant_framebuffer AS color LOCATION 0
299e5c31af7Sopenharmony_ci  BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 2
300e5c31af7Sopenharmony_ci  BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
301e5c31af7Sopenharmony_ci  BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
302e5c31af7Sopenharmony_ciEND
303e5c31af7Sopenharmony_ciCLEAR_COLOR variant_pipeline 0 0 0 255
304e5c31af7Sopenharmony_ci
305e5c31af7Sopenharmony_ciCLEAR variant_pipeline
306e5c31af7Sopenharmony_ciRUN variant_pipeline DRAW_RECT POS 0 0 SIZE 32 32
307e5c31af7Sopenharmony_ci
308e5c31af7Sopenharmony_ciEXPECT variant_framebuffer IDX 0 0 SIZE 32 32 EQ_RGBA 255 0 0 255
309