• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!amber
2
3# Copyright 2022 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# #define _int_1 _GLF_uniform_int_values[0]
29# #define _int_0 _GLF_uniform_int_values[1]
30# #define _int_2 _GLF_uniform_int_values[2]
31# #define _float_1_0 _GLF_uniform_float_values[0]
32# #define _float_0_0 _GLF_uniform_float_values[1]
33#
34# precision highp float;
35# precision highp int;
36#
37# // Contents of _GLF_uniform_int_values: [1, 0, 2]
38# layout(set = 0, binding = 0) uniform buf0
39# {
40#     int _GLF_uniform_int_values[3];
41# };
42#
43# // Contents of _GLF_uniform_float_values: [1.0, 0.0]
44# layout(set = 0, binding = 1) uniform buf1
45# {
46#     float _GLF_uniform_float_values[2];
47# };
48#
49# // Contents of one: 1
50# layout(push_constant) uniform buf_push
51# {
52#     int one;
53# };
54#
55# layout(location = 0) out vec4 _GLF_color;
56#
57# int func(float x)
58# {
59#     vec2 v = vec2(_float_1_0);
60#
61#     // Always true.
62#     while(one >= 1)
63#     {
64#         // Always true.
65#         if(v.x > _float_0_0)
66#         {
67#             int a = 1;
68#
69#             // Iterates twice.
70#             for(int i = _int_0; i < _int_2; i++)
71#             {
72#                 // Iterates once.
73#                 for(int j = _int_1; j != (_int_1 ^ one); j--)
74#                 {
75#                     // Iterates twice when this block is first executed.
76#                     while(a >= 0)
77#                     {
78#                         x = _float_1_0;
79#                         a--;
80#                     }
81#                 }
82#             }
83#
84#             // Always true.
85#             if (a == -1)
86#                 return 1;
87#
88#             // Never executed.
89#             v = vec2(x);
90#         }
91#     }
92#
93#     // Never executed.
94#     return _int_0;
95# }
96#
97# void main()
98# {
99#     int a = _int_0;
100#     int b = func(_float_0_0);
101#     _GLF_color = vec4(b, a, a, b);
102# }
103SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
104; SPIR-V
105; Version: 1.0
106; Generator: Khronos Glslang Reference Front End; 10
107; Bound: 132
108; Schema: 0
109               OpCapability Shader
110          %1 = OpExtInstImport "GLSL.std.450"
111               OpMemoryModel Logical GLSL450
112               OpEntryPoint Fragment %4 "main" %122
113               OpExecutionMode %4 OriginUpperLeft
114               OpSource ESSL 320
115               OpName %4 "main"
116               OpName %11 "func(f1;"
117               OpName %10 "x"
118               OpName %15 "v"
119               OpName %19 "buf1"
120               OpMemberName %19 0 "_GLF_uniform_float_values"
121               OpName %21 ""
122               OpName %32 "buf_push"
123               OpMemberName %32 0 "one"
124               OpName %34 ""
125               OpName %50 "a"
126               OpName %51 "i"
127               OpName %54 "buf0"
128               OpMemberName %54 0 "_GLF_uniform_int_values"
129               OpName %56 ""
130               OpName %70 "j"
131               OpName %112 "a"
132               OpName %115 "b"
133               OpName %116 "param"
134               OpName %122 "_GLF_color"
135               OpDecorate %18 ArrayStride 16
136               OpMemberDecorate %19 0 Offset 0
137               OpDecorate %19 Block
138               OpDecorate %21 DescriptorSet 0
139               OpDecorate %21 Binding 1
140               OpMemberDecorate %32 0 Offset 0
141               OpDecorate %32 Block
142               OpDecorate %53 ArrayStride 16
143               OpMemberDecorate %54 0 Offset 0
144               OpDecorate %54 Block
145               OpDecorate %56 DescriptorSet 0
146               OpDecorate %56 Binding 0
147               OpDecorate %122 Location 0
148          %2 = OpTypeVoid
149          %3 = OpTypeFunction %2
150          %6 = OpTypeFloat 32
151          %7 = OpTypePointer Function %6
152          %8 = OpTypeInt 32 1
153          %9 = OpTypeFunction %8 %7
154         %13 = OpTypeVector %6 2
155         %14 = OpTypePointer Function %13
156         %16 = OpTypeInt 32 0
157         %17 = OpConstant %16 2
158         %18 = OpTypeArray %6 %17
159         %19 = OpTypeStruct %18
160         %20 = OpTypePointer Uniform %19
161         %21 = OpVariable %20 Uniform
162         %22 = OpConstant %8 0
163         %23 = OpTypePointer Uniform %6
164         %32 = OpTypeStruct %8
165         %33 = OpTypePointer PushConstant %32
166         %34 = OpVariable %33 PushConstant
167         %35 = OpTypePointer PushConstant %8
168         %38 = OpConstant %8 1
169         %39 = OpTypeBool
170         %41 = OpConstant %16 0
171         %49 = OpTypePointer Function %8
172         %52 = OpConstant %16 3
173         %53 = OpTypeArray %8 %52
174         %54 = OpTypeStruct %53
175         %55 = OpTypePointer Uniform %54
176         %56 = OpVariable %55 Uniform
177         %57 = OpTypePointer Uniform %8
178         %66 = OpConstant %8 2
179        %101 = OpConstant %8 -1
180        %120 = OpTypeVector %6 4
181        %121 = OpTypePointer Output %120
182        %122 = OpVariable %121 Output
183          %4 = OpFunction %2 None %3
184          %5 = OpLabel
185        %112 = OpVariable %49 Function
186        %115 = OpVariable %49 Function
187        %116 = OpVariable %7 Function
188        %113 = OpAccessChain %57 %56 %22 %38
189        %114 = OpLoad %8 %113
190               OpStore %112 %114
191        %117 = OpAccessChain %23 %21 %22 %38
192        %118 = OpLoad %6 %117
193               OpStore %116 %118
194        %119 = OpFunctionCall %8 %11 %116
195               OpStore %115 %119
196        %123 = OpLoad %8 %115
197        %124 = OpConvertSToF %6 %123
198        %125 = OpLoad %8 %112
199        %126 = OpConvertSToF %6 %125
200        %127 = OpLoad %8 %112
201        %128 = OpConvertSToF %6 %127
202        %129 = OpLoad %8 %115
203        %130 = OpConvertSToF %6 %129
204        %131 = OpCompositeConstruct %120 %124 %126 %128 %130
205               OpStore %122 %131
206               OpReturn
207               OpFunctionEnd
208         %11 = OpFunction %8 None %9
209         %10 = OpFunctionParameter %7
210         %12 = OpLabel
211         %15 = OpVariable %14 Function
212         %50 = OpVariable %49 Function
213         %51 = OpVariable %49 Function
214         %70 = OpVariable %49 Function
215         %24 = OpAccessChain %23 %21 %22 %22
216         %25 = OpLoad %6 %24
217         %26 = OpCompositeConstruct %13 %25 %25
218               OpStore %15 %26
219               OpBranch %27
220         %27 = OpLabel
221               OpLoopMerge %29 %30 None
222               OpBranch %31
223         %31 = OpLabel
224         %36 = OpAccessChain %35 %34 %22
225         %37 = OpLoad %8 %36
226         %40 = OpSGreaterThanEqual %39 %37 %38
227               OpBranchConditional %40 %28 %29
228         %28 = OpLabel
229         %42 = OpAccessChain %7 %15 %41
230         %43 = OpLoad %6 %42
231         %44 = OpAccessChain %23 %21 %22 %38
232         %45 = OpLoad %6 %44
233         %46 = OpFOrdGreaterThan %39 %43 %45
234               OpSelectionMerge %48 None
235               OpBranchConditional %46 %47 %48
236         %47 = OpLabel
237               OpStore %50 %38
238         %58 = OpAccessChain %57 %56 %22 %38
239         %59 = OpLoad %8 %58
240               OpStore %51 %59
241               OpBranch %60
242         %60 = OpLabel
243               OpLoopMerge %62 %63 None
244               OpBranch %64
245         %64 = OpLabel
246         %65 = OpLoad %8 %51
247         %67 = OpAccessChain %57 %56 %22 %66
248         %68 = OpLoad %8 %67
249         %69 = OpSLessThan %39 %65 %68
250               OpBranchConditional %69 %61 %62
251         %61 = OpLabel
252         %71 = OpAccessChain %57 %56 %22 %22
253         %72 = OpLoad %8 %71
254               OpStore %70 %72
255               OpBranch %73
256         %73 = OpLabel
257               OpLoopMerge %75 %76 None
258               OpBranch %77
259         %77 = OpLabel
260         %78 = OpLoad %8 %70
261         %79 = OpAccessChain %57 %56 %22 %22
262         %80 = OpLoad %8 %79
263         %81 = OpAccessChain %35 %34 %22
264         %82 = OpLoad %8 %81
265         %83 = OpBitwiseXor %8 %80 %82
266         %84 = OpINotEqual %39 %78 %83
267               OpBranchConditional %84 %74 %75
268         %74 = OpLabel
269               OpBranch %85
270         %85 = OpLabel
271               OpLoopMerge %87 %88 None
272               OpBranch %89
273         %89 = OpLabel
274         %90 = OpLoad %8 %50
275         %91 = OpSGreaterThanEqual %39 %90 %22
276               OpBranchConditional %91 %86 %87
277         %86 = OpLabel
278         %92 = OpAccessChain %23 %21 %22 %22
279         %93 = OpLoad %6 %92
280               OpStore %10 %93
281         %94 = OpLoad %8 %50
282         %95 = OpISub %8 %94 %38
283               OpStore %50 %95
284               OpBranch %88
285         %88 = OpLabel
286               OpBranch %85
287         %87 = OpLabel
288               OpBranch %76
289         %76 = OpLabel
290         %96 = OpLoad %8 %70
291         %97 = OpISub %8 %96 %38
292               OpStore %70 %97
293               OpBranch %73
294         %75 = OpLabel
295               OpBranch %63
296         %63 = OpLabel
297         %98 = OpLoad %8 %51
298         %99 = OpIAdd %8 %98 %38
299               OpStore %51 %99
300               OpBranch %60
301         %62 = OpLabel
302        %100 = OpLoad %8 %50
303        %102 = OpIEqual %39 %100 %101
304               OpSelectionMerge %104 None
305               OpBranchConditional %102 %103 %104
306        %103 = OpLabel
307               OpReturnValue %38
308        %104 = OpLabel
309        %106 = OpLoad %6 %10
310        %107 = OpCompositeConstruct %13 %106 %106
311               OpStore %15 %107
312               OpBranch %48
313         %48 = OpLabel
314               OpBranch %30
315         %30 = OpLabel
316               OpBranch %27
317         %29 = OpLabel
318        %108 = OpAccessChain %57 %56 %22 %38
319        %109 = OpLoad %8 %108
320               OpReturnValue %109
321               OpFunctionEnd
322END
323
324# uniforms for variant
325
326# one
327BUFFER variant_one DATA_TYPE int32 STD140 DATA
328 1
329END
330# _GLF_uniform_float_values
331BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
332 1.0 0.0
333END
334# _GLF_uniform_int_values
335BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
336 1 0 2
337END
338
339BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
340
341PIPELINE graphics variant_pipeline
342  ATTACH variant_vertex_shader
343  ATTACH variant_fragment_shader
344  FRAMEBUFFER_SIZE 32 32
345  BIND BUFFER variant_framebuffer AS color LOCATION 0
346  BIND BUFFER variant_one AS push_constant
347  BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
348  BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
349END
350CLEAR_COLOR variant_pipeline 0 0 0 255
351
352CLEAR variant_pipeline
353RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 32 32
354
355EXPECT variant_framebuffer IDX 0 0 SIZE 32 32 EQ_RGBA 255 0 0 255
356