1#!amber
2
3# Copyright 2021 Google LLC
4#
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
8#
9#     http://www.apache.org/licenses/LICENSE-2.0
10#
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.
16
17
18# A test for a coverage-gap found by the GraphicsFuzz project.
19
20# Short description: A fragment shader that covers specific LLVM code paths
21
22# The test passes because the shader always writes red.
23
24SHADER vertex variant_vertex_shader PASSTHROUGH
25
26# variant_fragment_shader is derived from the following GLSL:
27# #version 320 es
28#
29# #define _int_1 _GLF_uniform_int_values[0]
30# #define _int_0 _GLF_uniform_int_values[1]
31# #define _float_0_0 _GLF_uniform_float_values[0]
32# #define _float_0_01 _GLF_uniform_float_values[1]
33# #define _float_0_2 _GLF_uniform_float_values[2]
34# #define _float_0_1 _GLF_uniform_float_values[3]
35# #define _float_0_3 _GLF_uniform_float_values[4]
36#
37# precision highp float;
38# precision highp int;
39#
40# // Contents of _GLF_uniform_int_values: [1, 0]
41# layout(set = 0, binding = 0) uniform buf0
42# {
43#     int _GLF_uniform_int_values[2];
44# };
45# // Contents of _GLF_uniform_float_values: [0.0, 0.01, 0.2, 0.1, 0.3]
46# layout(set = 0, binding = 1) uniform buf1
47# {
48#     float _GLF_uniform_float_values[5];
49# };
50# // Contents of zeroVec: [0.0, 0.0]
51# layout(set = 0, binding = 2) uniform buf2
52# {
53#     vec2 zeroVec;
54# };
55# // Contents of oneVec: [1.0, 1.0]
56# layout(set = 0, binding = 3) uniform buf3
57# {
58#     vec2 oneVec;
59# };
60# layout(location = 0) out vec4 _GLF_color;
61#
62# struct S
63# {
64#     float numbers[3];
65# };
66#
67# void main()
68# {
69#     S obj = S(float[3](_float_0_1, _float_0_2, _float_0_3));
70#     // obj becomes [0.0, 0.2, 0.3].
71#     obj.numbers[int(zeroVec.x)] = _float_0_0;
72#     // a becomes 1.0.
73#     float a = ((zeroVec.x > _float_0_0) ? zeroVec : oneVec).y;
74#     // b becomes 0.2.
75#     float b = mix(_float_0_0, a, obj.numbers[_int_1]);
76#
77#     // Always true.
78#     if(distance(b, _float_0_2) < _float_0_01)
79#     {
80#         _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
81#     }
82#     else
83#     {
84#         _GLF_color = vec4(_int_0);
85#     }
86# }
87SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
88; SPIR-V
89; Version: 1.0
90; Generator: Khronos Glslang Reference Front End; 10
91; Bound: 113
92; Schema: 0
93               OpCapability Shader
94          %1 = OpExtInstImport "GLSL.std.450"
95               OpMemoryModel Logical GLSL450
96               OpEntryPoint Fragment %4 "main" %94
97               OpExecutionMode %4 OriginUpperLeft
98               OpSource ESSL 320
99               OpName %4 "main"
100               OpName %10 "S"
101               OpMemberName %10 0 "numbers"
102               OpName %12 "obj"
103               OpName %15 "buf1"
104               OpMemberName %15 0 "_GLF_uniform_float_values"
105               OpName %17 ""
106               OpName %33 "buf2"
107               OpMemberName %33 0 "zeroVec"
108               OpName %35 ""
109               OpName %44 "a"
110               OpName %59 "buf3"
111               OpMemberName %59 0 "oneVec"
112               OpName %61 ""
113               OpName %67 "b"
114               OpName %73 "buf0"
115               OpMemberName %73 0 "_GLF_uniform_int_values"
116               OpName %75 ""
117               OpName %94 "_GLF_color"
118               OpDecorate %14 ArrayStride 16
119               OpMemberDecorate %15 0 Offset 0
120               OpDecorate %15 Block
121               OpDecorate %17 DescriptorSet 0
122               OpDecorate %17 Binding 1
123               OpMemberDecorate %33 0 Offset 0
124               OpDecorate %33 Block
125               OpDecorate %35 DescriptorSet 0
126               OpDecorate %35 Binding 2
127               OpMemberDecorate %59 0 Offset 0
128               OpDecorate %59 Block
129               OpDecorate %61 DescriptorSet 0
130               OpDecorate %61 Binding 3
131               OpDecorate %72 ArrayStride 16
132               OpMemberDecorate %73 0 Offset 0
133               OpDecorate %73 Block
134               OpDecorate %75 DescriptorSet 0
135               OpDecorate %75 Binding 0
136               OpDecorate %94 Location 0
137          %2 = OpTypeVoid
138          %3 = OpTypeFunction %2
139          %6 = OpTypeFloat 32
140          %7 = OpTypeInt 32 0
141          %8 = OpConstant %7 3
142          %9 = OpTypeArray %6 %8
143         %10 = OpTypeStruct %9
144         %11 = OpTypePointer Function %10
145         %13 = OpConstant %7 5
146         %14 = OpTypeArray %6 %13
147         %15 = OpTypeStruct %14
148         %16 = OpTypePointer Uniform %15
149         %17 = OpVariable %16 Uniform
150         %18 = OpTypeInt 32 1
151         %19 = OpConstant %18 0
152         %20 = OpConstant %18 3
153         %21 = OpTypePointer Uniform %6
154         %24 = OpConstant %18 2
155         %27 = OpConstant %18 4
156         %32 = OpTypeVector %6 2
157         %33 = OpTypeStruct %32
158         %34 = OpTypePointer Uniform %33
159         %35 = OpVariable %34 Uniform
160         %36 = OpConstant %7 0
161         %42 = OpTypePointer Function %6
162         %49 = OpTypeBool
163         %51 = OpTypePointer Function %32
164         %55 = OpTypePointer Uniform %32
165         %59 = OpTypeStruct %32
166         %60 = OpTypePointer Uniform %59
167         %61 = OpVariable %60 Uniform
168         %64 = OpConstant %7 1
169         %71 = OpConstant %7 2
170         %72 = OpTypeArray %18 %71
171         %73 = OpTypeStruct %72
172         %74 = OpTypePointer Uniform %73
173         %75 = OpVariable %74 Uniform
174         %76 = OpTypePointer Uniform %18
175         %86 = OpConstant %18 1
176         %92 = OpTypeVector %6 4
177         %93 = OpTypePointer Output %92
178         %94 = OpVariable %93 Output
179          %4 = OpFunction %2 None %3
180          %5 = OpLabel
181         %12 = OpVariable %11 Function
182         %44 = OpVariable %42 Function
183         %52 = OpVariable %51 Function
184         %67 = OpVariable %42 Function
185         %22 = OpAccessChain %21 %17 %19 %20
186         %23 = OpLoad %6 %22
187         %25 = OpAccessChain %21 %17 %19 %24
188         %26 = OpLoad %6 %25
189         %28 = OpAccessChain %21 %17 %19 %27
190         %29 = OpLoad %6 %28
191         %30 = OpCompositeConstruct %9 %23 %26 %29
192         %31 = OpCompositeConstruct %10 %30
193               OpStore %12 %31
194         %37 = OpAccessChain %21 %35 %19 %36
195         %38 = OpLoad %6 %37
196         %39 = OpConvertFToS %18 %38
197         %40 = OpAccessChain %21 %17 %19 %19
198         %41 = OpLoad %6 %40
199         %43 = OpAccessChain %42 %12 %19 %39
200               OpStore %43 %41
201         %45 = OpAccessChain %21 %35 %19 %36
202         %46 = OpLoad %6 %45
203         %47 = OpAccessChain %21 %17 %19 %19
204         %48 = OpLoad %6 %47
205         %50 = OpFOrdGreaterThan %49 %46 %48
206               OpSelectionMerge %54 None
207               OpBranchConditional %50 %53 %58
208         %53 = OpLabel
209         %56 = OpAccessChain %55 %35 %19
210         %57 = OpLoad %32 %56
211               OpStore %52 %57
212               OpBranch %54
213         %58 = OpLabel
214         %62 = OpAccessChain %55 %61 %19
215         %63 = OpLoad %32 %62
216               OpStore %52 %63
217               OpBranch %54
218         %54 = OpLabel
219         %65 = OpAccessChain %42 %52 %64
220         %66 = OpLoad %6 %65
221               OpStore %44 %66
222         %68 = OpAccessChain %21 %17 %19 %19
223         %69 = OpLoad %6 %68
224         %70 = OpLoad %6 %44
225         %77 = OpAccessChain %76 %75 %19 %19
226         %78 = OpLoad %18 %77
227         %79 = OpAccessChain %42 %12 %19 %78
228         %80 = OpLoad %6 %79
229         %81 = OpExtInst %6 %1 FMix %69 %70 %80
230               OpStore %67 %81
231         %82 = OpLoad %6 %67
232         %83 = OpAccessChain %21 %17 %19 %24
233         %84 = OpLoad %6 %83
234         %85 = OpExtInst %6 %1 Distance %82 %84
235         %87 = OpAccessChain %21 %17 %19 %86
236         %88 = OpLoad %6 %87
237         %89 = OpFOrdLessThan %49 %85 %88
238               OpSelectionMerge %91 None
239               OpBranchConditional %89 %90 %108
240         %90 = OpLabel
241         %95 = OpAccessChain %76 %75 %19 %19
242         %96 = OpLoad %18 %95
243         %97 = OpConvertSToF %6 %96
244         %98 = OpAccessChain %76 %75 %19 %86
245         %99 = OpLoad %18 %98
246        %100 = OpConvertSToF %6 %99
247        %101 = OpAccessChain %76 %75 %19 %86
248        %102 = OpLoad %18 %101
249        %103 = OpConvertSToF %6 %102
250        %104 = OpAccessChain %76 %75 %19 %19
251        %105 = OpLoad %18 %104
252        %106 = OpConvertSToF %6 %105
253        %107 = OpCompositeConstruct %92 %97 %100 %103 %106
254               OpStore %94 %107
255               OpBranch %91
256        %108 = OpLabel
257        %109 = OpAccessChain %76 %75 %19 %86
258        %110 = OpLoad %18 %109
259        %111 = OpConvertSToF %6 %110
260        %112 = OpCompositeConstruct %92 %111 %111 %111 %111
261               OpStore %94 %112
262               OpBranch %91
263         %91 = OpLabel
264               OpReturn
265               OpFunctionEnd
266END
267
268# uniforms for variant
269
270# zeroVec
271BUFFER variant_zeroVec DATA_TYPE vec2<float> STD140 DATA
272 0.0 0.0
273END
274# oneVec
275BUFFER variant_oneVec DATA_TYPE vec2<float> STD140 DATA
276 1.0 1.0
277END
278# _GLF_uniform_float_values
279BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
280 0.0 0.01 0.2 0.1 0.3
281END
282# _GLF_uniform_int_values
283BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
284 1 0
285END
286
287BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
288
289PIPELINE graphics variant_pipeline
290  ATTACH variant_vertex_shader
291  ATTACH variant_fragment_shader
292  FRAMEBUFFER_SIZE 256 256
293  BIND BUFFER variant_framebuffer AS color LOCATION 0
294  BIND BUFFER variant_zeroVec AS uniform DESCRIPTOR_SET 0 BINDING 2
295  BIND BUFFER variant_oneVec AS uniform DESCRIPTOR_SET 0 BINDING 3
296  BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
297  BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
298END
299CLEAR_COLOR variant_pipeline 0 0 0 255
300
301CLEAR variant_pipeline
302RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
303
304EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
305