1e5c31af7Sopenharmony_ci#!amber
2e5c31af7Sopenharmony_ci
3e5c31af7Sopenharmony_ci# Copyright 2021 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# '--copy-propagate-arrays'
26e5c31af7Sopenharmony_ci# '--eliminate-dead-inserts'
27e5c31af7Sopenharmony_ci# '--convert-local-access-chains'
28e5c31af7Sopenharmony_ci# '--private-to-local'
29e5c31af7Sopenharmony_ci# '--redundancy-elimination'
30e5c31af7Sopenharmony_ci# '--eliminate-local-multi-store'
31e5c31af7Sopenharmony_ci# '--eliminate-local-single-block'
32e5c31af7Sopenharmony_ci# '--eliminate-dead-code-aggressive'
33e5c31af7Sopenharmony_ci# '--copy-propagate-arrays'
34e5c31af7Sopenharmony_ci# '--eliminate-dead-inserts'
35e5c31af7Sopenharmony_ci# '--redundancy-elimination'
36e5c31af7Sopenharmony_ci# '--eliminate-local-single-block'
37e5c31af7Sopenharmony_ci# '--eliminate-local-single-store'
38e5c31af7Sopenharmony_ci# '--eliminate-local-single-store'
39e5c31af7Sopenharmony_ci# '--eliminate-dead-code-aggressive'
40e5c31af7Sopenharmony_ci# '--inline-entry-points-exhaustive'
41e5c31af7Sopenharmony_ci# '--combine-access-chains'
42e5c31af7Sopenharmony_ci# '--eliminate-dead-branches'
43e5c31af7Sopenharmony_ci# '--merge-return'
44e5c31af7Sopenharmony_ci# '--eliminate-local-single-block'
45e5c31af7Sopenharmony_ci# '--eliminate-dead-branches'
46e5c31af7Sopenharmony_ci# '--reduce-load-size'
47e5c31af7Sopenharmony_ci# '--eliminate-dead-inserts'
48e5c31af7Sopenharmony_ci# '--copy-propagate-arrays'
49e5c31af7Sopenharmony_ci# '--convert-local-access-chains'
50e5c31af7Sopenharmony_ci# '--vector-dce'
51e5c31af7Sopenharmony_ci# '--redundancy-elimination'
52e5c31af7Sopenharmony_ci# '--eliminate-local-multi-store'
53e5c31af7Sopenharmony_ci# '--redundancy-elimination'
54e5c31af7Sopenharmony_ci# '--eliminate-dead-inserts'
55e5c31af7Sopenharmony_ci# '--eliminate-dead-code-aggressive'
56e5c31af7Sopenharmony_ci# spirv-opt commit hash: a0370efd589be33d5d9a85cfde2f85841b3755af
57e5c31af7Sopenharmony_ci
58e5c31af7Sopenharmony_ci
59e5c31af7Sopenharmony_ci
60e5c31af7Sopenharmony_ciSHADER vertex texgen_vert PASSTHROUGH
61e5c31af7Sopenharmony_ci
62e5c31af7Sopenharmony_ciSHADER fragment texgen_frag GLSL
63e5c31af7Sopenharmony_ci#version 430
64e5c31af7Sopenharmony_ciprecision highp float;
65e5c31af7Sopenharmony_ci
66e5c31af7Sopenharmony_cilayout(location = 0) out vec4 _GLF_color;
67e5c31af7Sopenharmony_ci
68e5c31af7Sopenharmony_civoid main()
69e5c31af7Sopenharmony_ci{
70e5c31af7Sopenharmony_ci _GLF_color = vec4(
71e5c31af7Sopenharmony_ci floor(gl_FragCoord.x) * (1.0 / 255.0),
72e5c31af7Sopenharmony_ci (int(gl_FragCoord.x) ^ int(gl_FragCoord.y)) * (1.0 / 255.0),
73e5c31af7Sopenharmony_ci floor(gl_FragCoord.y) * (1.0 / 255.0),
74e5c31af7Sopenharmony_ci 1.0);
75e5c31af7Sopenharmony_ci}
76e5c31af7Sopenharmony_ciEND
77e5c31af7Sopenharmony_ciBUFFER default_texture FORMAT B8G8R8A8_UNORM
78e5c31af7Sopenharmony_ci
79e5c31af7Sopenharmony_ciPIPELINE graphics texgen_pipeline
80e5c31af7Sopenharmony_ci  ATTACH texgen_vert
81e5c31af7Sopenharmony_ci  ATTACH texgen_frag
82e5c31af7Sopenharmony_ci  FRAMEBUFFER_SIZE 256 256
83e5c31af7Sopenharmony_ci  BIND BUFFER default_texture AS color LOCATION 0
84e5c31af7Sopenharmony_ciEND
85e5c31af7Sopenharmony_ci
86e5c31af7Sopenharmony_ciCLEAR_COLOR texgen_pipeline 0 0 0 255
87e5c31af7Sopenharmony_ciCLEAR texgen_pipeline
88e5c31af7Sopenharmony_ciRUN texgen_pipeline DRAW_RECT POS 0 0  SIZE 256 256
89e5c31af7Sopenharmony_ci
90e5c31af7Sopenharmony_ciSHADER vertex variant_vertex_shader PASSTHROUGH
91e5c31af7Sopenharmony_ci
92e5c31af7Sopenharmony_ci# variant_fragment_shader is derived from the following GLSL:
93e5c31af7Sopenharmony_ci# #version 320 es
94e5c31af7Sopenharmony_ci#
95e5c31af7Sopenharmony_ci# precision highp float;
96e5c31af7Sopenharmony_ci# precision highp int;
97e5c31af7Sopenharmony_ci#
98e5c31af7Sopenharmony_ci# const int _GLF_global_loop_bound = 10;
99e5c31af7Sopenharmony_ci# int _GLF_global_loop_count = 0;
100e5c31af7Sopenharmony_ci#
101e5c31af7Sopenharmony_ci# struct S
102e5c31af7Sopenharmony_ci# {
103e5c31af7Sopenharmony_ci#     int data;
104e5c31af7Sopenharmony_ci# };
105e5c31af7Sopenharmony_ci#
106e5c31af7Sopenharmony_ci# layout(set = 0, binding = 0) uniform sampler2D tex;
107e5c31af7Sopenharmony_ci#
108e5c31af7Sopenharmony_ci# layout(location = 0) out vec4 _GLF_color;
109e5c31af7Sopenharmony_ci#
110e5c31af7Sopenharmony_ci# void main()
111e5c31af7Sopenharmony_ci# {
112e5c31af7Sopenharmony_ci#     int a = 1;
113e5c31af7Sopenharmony_ci#     int b = 1;
114e5c31af7Sopenharmony_ci#     vec4 v = vec4(1.0);
115e5c31af7Sopenharmony_ci#     S s = S(1);
116e5c31af7Sopenharmony_ci#
117e5c31af7Sopenharmony_ci#     // Iterated once.
118e5c31af7Sopenharmony_ci#     while(v.x + 1.0 > 0.0 && s.data <= 1 && _GLF_global_loop_count < _GLF_global_loop_bound)
119e5c31af7Sopenharmony_ci#     {
120e5c31af7Sopenharmony_ci#         _GLF_global_loop_count++;
121e5c31af7Sopenharmony_ci#
122e5c31af7Sopenharmony_ci#         // Always false.
123e5c31af7Sopenharmony_ci#         if(b++ > 3)
124e5c31af7Sopenharmony_ci#         {
125e5c31af7Sopenharmony_ci#             break;
126e5c31af7Sopenharmony_ci#         }
127e5c31af7Sopenharmony_ci#
128e5c31af7Sopenharmony_ci#         // The sampled value doesn't matter because the loop will exit in any case.
129e5c31af7Sopenharmony_ci#         v = texture(tex, vec2(1.0));
130e5c31af7Sopenharmony_ci#
131e5c31af7Sopenharmony_ci#         // This will cause the loop to exit.
132e5c31af7Sopenharmony_ci#         s.data++;
133e5c31af7Sopenharmony_ci#     }
134e5c31af7Sopenharmony_ci#
135e5c31af7Sopenharmony_ci#     // Always true.
136e5c31af7Sopenharmony_ci#     if (s.data == 2)
137e5c31af7Sopenharmony_ci#         _GLF_color = vec4(float(a), 0, 0, 1);
138e5c31af7Sopenharmony_ci#     else
139e5c31af7Sopenharmony_ci#         _GLF_color = vec4(0);
140e5c31af7Sopenharmony_ci# }
141e5c31af7Sopenharmony_ciSHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
142e5c31af7Sopenharmony_ci; SPIR-V
143e5c31af7Sopenharmony_ci; Version: 1.0
144e5c31af7Sopenharmony_ci; Generator: Khronos Glslang Reference Front End; 10
145e5c31af7Sopenharmony_ci; Bound: 96
146e5c31af7Sopenharmony_ci; Schema: 0
147e5c31af7Sopenharmony_ci               OpCapability Shader
148e5c31af7Sopenharmony_ci          %1 = OpExtInstImport "GLSL.std.450"
149e5c31af7Sopenharmony_ci               OpMemoryModel Logical GLSL450
150e5c31af7Sopenharmony_ci               OpEntryPoint Fragment %4 "main" %75
151e5c31af7Sopenharmony_ci               OpExecutionMode %4 OriginUpperLeft
152e5c31af7Sopenharmony_ci               OpSource ESSL 320
153e5c31af7Sopenharmony_ci               OpName %4 "main"
154e5c31af7Sopenharmony_ci               OpName %20 "S"
155e5c31af7Sopenharmony_ci               OpMemberName %20 0 "data"
156e5c31af7Sopenharmony_ci               OpName %60 "tex"
157e5c31af7Sopenharmony_ci               OpName %75 "_GLF_color"
158e5c31af7Sopenharmony_ci               OpDecorate %60 RelaxedPrecision
159e5c31af7Sopenharmony_ci               OpDecorate %60 DescriptorSet 0
160e5c31af7Sopenharmony_ci               OpDecorate %60 Binding 0
161e5c31af7Sopenharmony_ci               OpDecorate %61 RelaxedPrecision
162e5c31af7Sopenharmony_ci               OpDecorate %64 RelaxedPrecision
163e5c31af7Sopenharmony_ci               OpDecorate %75 Location 0
164e5c31af7Sopenharmony_ci          %2 = OpTypeVoid
165e5c31af7Sopenharmony_ci          %3 = OpTypeFunction %2
166e5c31af7Sopenharmony_ci          %6 = OpTypeInt 32 1
167e5c31af7Sopenharmony_ci          %9 = OpConstant %6 0
168e5c31af7Sopenharmony_ci         %12 = OpConstant %6 1
169e5c31af7Sopenharmony_ci         %14 = OpTypeFloat 32
170e5c31af7Sopenharmony_ci         %15 = OpTypeVector %14 4
171e5c31af7Sopenharmony_ci         %18 = OpConstant %14 1
172e5c31af7Sopenharmony_ci         %19 = OpConstantComposite %15 %18 %18 %18 %18
173e5c31af7Sopenharmony_ci         %20 = OpTypeStruct %6
174e5c31af7Sopenharmony_ci         %23 = OpConstantComposite %20 %12
175e5c31af7Sopenharmony_ci         %29 = OpTypeBool
176e5c31af7Sopenharmony_ci         %36 = OpConstant %14 0
177e5c31af7Sopenharmony_ci         %45 = OpConstant %6 10
178e5c31af7Sopenharmony_ci         %52 = OpConstant %6 3
179e5c31af7Sopenharmony_ci         %57 = OpTypeImage %14 2D 0 0 0 1 Unknown
180e5c31af7Sopenharmony_ci         %58 = OpTypeSampledImage %57
181e5c31af7Sopenharmony_ci         %59 = OpTypePointer UniformConstant %58
182e5c31af7Sopenharmony_ci         %60 = OpVariable %59 UniformConstant
183e5c31af7Sopenharmony_ci         %62 = OpTypeVector %14 2
184e5c31af7Sopenharmony_ci         %63 = OpConstantComposite %62 %18 %18
185e5c31af7Sopenharmony_ci         %70 = OpConstant %6 2
186e5c31af7Sopenharmony_ci         %74 = OpTypePointer Output %15
187e5c31af7Sopenharmony_ci         %75 = OpVariable %74 Output
188e5c31af7Sopenharmony_ci         %80 = OpConstantComposite %15 %36 %36 %36 %36
189e5c31af7Sopenharmony_ci          %4 = OpFunction %2 None %3
190e5c31af7Sopenharmony_ci          %5 = OpLabel
191e5c31af7Sopenharmony_ci               OpBranch %24
192e5c31af7Sopenharmony_ci         %24 = OpLabel
193e5c31af7Sopenharmony_ci         %95 = OpPhi %20 %23 %5 %85 %27
194e5c31af7Sopenharmony_ci         %94 = OpPhi %15 %19 %5 %64 %27
195e5c31af7Sopenharmony_ci         %90 = OpPhi %6 %12 %5 %51 %27
196e5c31af7Sopenharmony_ci         %88 = OpPhi %6 %9 %5 %49 %27
197e5c31af7Sopenharmony_ci         %93 = OpPhi %6 %12 %5 %93 %27
198e5c31af7Sopenharmony_ci               OpLoopMerge %26 %27 None
199e5c31af7Sopenharmony_ci               OpBranch %28
200e5c31af7Sopenharmony_ci         %28 = OpLabel
201e5c31af7Sopenharmony_ci         %34 = OpCompositeExtract %14 %94 0
202e5c31af7Sopenharmony_ci         %35 = OpFAdd %14 %34 %18
203e5c31af7Sopenharmony_ci         %37 = OpFOrdGreaterThan %29 %35 %36
204e5c31af7Sopenharmony_ci               OpSelectionMerge %39 None
205e5c31af7Sopenharmony_ci               OpBranchConditional %37 %38 %39
206e5c31af7Sopenharmony_ci         %38 = OpLabel
207e5c31af7Sopenharmony_ci         %41 = OpCompositeExtract %6 %95 0
208e5c31af7Sopenharmony_ci         %42 = OpSLessThanEqual %29 %41 %12
209e5c31af7Sopenharmony_ci               OpBranch %39
210e5c31af7Sopenharmony_ci         %39 = OpLabel
211e5c31af7Sopenharmony_ci         %43 = OpPhi %29 %37 %28 %42 %38
212e5c31af7Sopenharmony_ci         %46 = OpSLessThan %29 %88 %45
213e5c31af7Sopenharmony_ci         %47 = OpLogicalAnd %29 %43 %46
214e5c31af7Sopenharmony_ci               OpBranchConditional %47 %25 %26
215e5c31af7Sopenharmony_ci         %25 = OpLabel
216e5c31af7Sopenharmony_ci         %49 = OpIAdd %6 %88 %12
217e5c31af7Sopenharmony_ci         %51 = OpIAdd %6 %90 %12
218e5c31af7Sopenharmony_ci         %53 = OpSGreaterThan %29 %90 %52
219e5c31af7Sopenharmony_ci               OpSelectionMerge %55 None
220e5c31af7Sopenharmony_ci               OpBranchConditional %53 %54 %55
221e5c31af7Sopenharmony_ci         %54 = OpLabel
222e5c31af7Sopenharmony_ci               OpBranch %26
223e5c31af7Sopenharmony_ci         %55 = OpLabel
224e5c31af7Sopenharmony_ci         %61 = OpLoad %58 %60
225e5c31af7Sopenharmony_ci         %64 = OpImageSampleImplicitLod %15 %61 %63
226e5c31af7Sopenharmony_ci         %66 = OpCompositeExtract %6 %95 0
227e5c31af7Sopenharmony_ci         %67 = OpIAdd %6 %66 %12
228e5c31af7Sopenharmony_ci         %85 = OpCompositeInsert %20 %67 %95 0
229e5c31af7Sopenharmony_ci               OpBranch %27
230e5c31af7Sopenharmony_ci         %27 = OpLabel
231e5c31af7Sopenharmony_ci               OpBranch %24
232e5c31af7Sopenharmony_ci         %26 = OpLabel
233e5c31af7Sopenharmony_ci         %69 = OpCompositeExtract %6 %95 0
234e5c31af7Sopenharmony_ci         %71 = OpIEqual %29 %69 %70
235e5c31af7Sopenharmony_ci               OpSelectionMerge %73 None
236e5c31af7Sopenharmony_ci               OpBranchConditional %71 %72 %79
237e5c31af7Sopenharmony_ci         %72 = OpLabel
238e5c31af7Sopenharmony_ci         %77 = OpConvertSToF %14 %93
239e5c31af7Sopenharmony_ci         %78 = OpCompositeConstruct %15 %77 %36 %36 %18
240e5c31af7Sopenharmony_ci               OpStore %75 %78
241e5c31af7Sopenharmony_ci               OpBranch %73
242e5c31af7Sopenharmony_ci         %79 = OpLabel
243e5c31af7Sopenharmony_ci               OpStore %75 %80
244e5c31af7Sopenharmony_ci               OpBranch %73
245e5c31af7Sopenharmony_ci         %73 = OpLabel
246e5c31af7Sopenharmony_ci               OpReturn
247e5c31af7Sopenharmony_ci               OpFunctionEnd
248e5c31af7Sopenharmony_ciEND
249e5c31af7Sopenharmony_ci
250e5c31af7Sopenharmony_ci# uniforms for variant
251e5c31af7Sopenharmony_ci
252e5c31af7Sopenharmony_ci# GLF_live1tex
253e5c31af7Sopenharmony_ciSAMPLER variant_GLF_live1tex
254e5c31af7Sopenharmony_ci
255e5c31af7Sopenharmony_ci
256e5c31af7Sopenharmony_ciBUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
257e5c31af7Sopenharmony_ci
258e5c31af7Sopenharmony_ciPIPELINE graphics variant_pipeline
259e5c31af7Sopenharmony_ci  ATTACH variant_vertex_shader
260e5c31af7Sopenharmony_ci  ATTACH variant_fragment_shader
261e5c31af7Sopenharmony_ci  FRAMEBUFFER_SIZE 256 256
262e5c31af7Sopenharmony_ci  BIND BUFFER variant_framebuffer AS color LOCATION 0
263e5c31af7Sopenharmony_ci  BIND BUFFER default_texture AS combined_image_sampler SAMPLER variant_GLF_live1tex DESCRIPTOR_SET 0 BINDING 0
264e5c31af7Sopenharmony_ciEND
265e5c31af7Sopenharmony_ciCLEAR_COLOR variant_pipeline 0 0 0 255
266e5c31af7Sopenharmony_ci
267e5c31af7Sopenharmony_ciCLEAR variant_pipeline
268e5c31af7Sopenharmony_ciRUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
269e5c31af7Sopenharmony_ci
270e5c31af7Sopenharmony_ciEXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
271