• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_0 _GLF_uniform_int_values[0]
30# #define _int_1 _GLF_uniform_int_values[1]
31# #define _int_5 _GLF_uniform_int_values[2]
32# #define _int_4 _GLF_uniform_int_values[3]
33# #define _int_3 _GLF_uniform_int_values[4]
34# #define _int_2 _GLF_uniform_int_values[5]
35#
36# precision highp float;
37# precision highp int;
38#
39# // Contents of _GLF_uniform_int_values: [0, 1, 5, 4, 3, 2]
40# layout(set = 0, binding = 0) uniform buf0
41# {
42#     int _GLF_uniform_int_values[6];
43# };
44#
45# layout(location = 0) out vec4 _GLF_color;
46#
47# void main()
48# {
49#     int a = _int_1;
50#     int b = _int_1;
51#
52#     // Iterated once.
53#     while(b >= _int_1)
54#     {
55#         b--;
56#
57#         // Iterated once with b = 0.
58#         for(int i = _int_1; i != 0; i--)
59#         {
60#             // a becomes 5 and b -1.
61#             a = int[5](_int_5, _int_4, _int_3, _int_2, _int_1)[b--];
62#         }
63#
64#         // Always true.
65#         if(a > _int_1)
66#         {
67#             // b becomes 0.
68#             b++;
69#         }
70#     }
71#
72#     // Always true.
73#     if(a == _int_5 && b == _int_0)
74#     {
75#         _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
76#     }
77#     else
78#     {
79#         _GLF_color = vec4(_int_0);
80#     }
81# }
82SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
83; SPIR-V
84; Version: 1.0
85; Generator: Khronos Glslang Reference Front End; 10
86; Bound: 113
87; Schema: 0
88               OpCapability Shader
89          %1 = OpExtInstImport "GLSL.std.450"
90               OpMemoryModel Logical GLSL450
91               OpEntryPoint Fragment %4 "main" %94
92               OpExecutionMode %4 OriginUpperLeft
93               OpSource ESSL 320
94               OpName %4 "main"
95               OpName %8 "a"
96               OpName %12 "buf0"
97               OpMemberName %12 0 "_GLF_uniform_int_values"
98               OpName %14 ""
99               OpName %20 "b"
100               OpName %35 "i"
101               OpName %65 "indexable"
102               OpName %94 "_GLF_color"
103               OpDecorate %11 ArrayStride 16
104               OpMemberDecorate %12 0 Offset 0
105               OpDecorate %12 Block
106               OpDecorate %14 DescriptorSet 0
107               OpDecorate %14 Binding 0
108               OpDecorate %94 Location 0
109          %2 = OpTypeVoid
110          %3 = OpTypeFunction %2
111          %6 = OpTypeInt 32 1
112          %7 = OpTypePointer Function %6
113          %9 = OpTypeInt 32 0
114         %10 = OpConstant %9 6
115         %11 = OpTypeArray %6 %10
116         %12 = OpTypeStruct %11
117         %13 = OpTypePointer Uniform %12
118         %14 = OpVariable %13 Uniform
119         %15 = OpConstant %6 0
120         %16 = OpConstant %6 1
121         %17 = OpTypePointer Uniform %6
122         %31 = OpTypeBool
123         %45 = OpConstant %6 2
124         %48 = OpConstant %6 3
125         %51 = OpConstant %6 4
126         %54 = OpConstant %6 5
127         %59 = OpConstant %9 5
128         %60 = OpTypeArray %6 %59
129         %64 = OpTypePointer Function %60
130         %91 = OpTypeFloat 32
131         %92 = OpTypeVector %91 4
132         %93 = OpTypePointer Output %92
133         %94 = OpVariable %93 Output
134          %4 = OpFunction %2 None %3
135          %5 = OpLabel
136          %8 = OpVariable %7 Function
137         %20 = OpVariable %7 Function
138         %35 = OpVariable %7 Function
139         %65 = OpVariable %64 Function
140         %18 = OpAccessChain %17 %14 %15 %16
141         %19 = OpLoad %6 %18
142               OpStore %8 %19
143         %21 = OpAccessChain %17 %14 %15 %16
144         %22 = OpLoad %6 %21
145               OpStore %20 %22
146               OpBranch %23
147         %23 = OpLabel
148               OpLoopMerge %25 %26 None
149               OpBranch %27
150         %27 = OpLabel
151         %28 = OpLoad %6 %20
152         %29 = OpAccessChain %17 %14 %15 %16
153         %30 = OpLoad %6 %29
154         %32 = OpSGreaterThanEqual %31 %28 %30
155               OpBranchConditional %32 %24 %25
156         %24 = OpLabel
157         %33 = OpLoad %6 %20
158         %34 = OpISub %6 %33 %16
159               OpStore %20 %34
160         %36 = OpAccessChain %17 %14 %15 %16
161         %37 = OpLoad %6 %36
162               OpStore %35 %37
163               OpBranch %38
164         %38 = OpLabel
165               OpLoopMerge %40 %41 None
166               OpBranch %42
167         %42 = OpLabel
168         %43 = OpLoad %6 %35
169         %44 = OpINotEqual %31 %43 %15
170               OpBranchConditional %44 %39 %40
171         %39 = OpLabel
172         %46 = OpAccessChain %17 %14 %15 %45
173         %47 = OpLoad %6 %46
174         %49 = OpAccessChain %17 %14 %15 %48
175         %50 = OpLoad %6 %49
176         %52 = OpAccessChain %17 %14 %15 %51
177         %53 = OpLoad %6 %52
178         %55 = OpAccessChain %17 %14 %15 %54
179         %56 = OpLoad %6 %55
180         %57 = OpAccessChain %17 %14 %15 %16
181         %58 = OpLoad %6 %57
182         %61 = OpCompositeConstruct %60 %47 %50 %53 %56 %58
183         %62 = OpLoad %6 %20
184         %63 = OpISub %6 %62 %16
185               OpStore %20 %63
186               OpStore %65 %61
187         %66 = OpAccessChain %7 %65 %62
188         %67 = OpLoad %6 %66
189               OpStore %8 %67
190               OpBranch %41
191         %41 = OpLabel
192         %68 = OpLoad %6 %35
193         %69 = OpISub %6 %68 %16
194               OpStore %35 %69
195               OpBranch %38
196         %40 = OpLabel
197         %70 = OpLoad %6 %8
198         %71 = OpAccessChain %17 %14 %15 %16
199         %72 = OpLoad %6 %71
200         %73 = OpSGreaterThan %31 %70 %72
201               OpSelectionMerge %75 None
202               OpBranchConditional %73 %74 %75
203         %74 = OpLabel
204         %76 = OpLoad %6 %20
205         %77 = OpIAdd %6 %76 %16
206               OpStore %20 %77
207               OpBranch %75
208         %75 = OpLabel
209               OpBranch %26
210         %26 = OpLabel
211               OpBranch %23
212         %25 = OpLabel
213         %78 = OpLoad %6 %8
214         %79 = OpAccessChain %17 %14 %15 %45
215         %80 = OpLoad %6 %79
216         %81 = OpIEqual %31 %78 %80
217               OpSelectionMerge %83 None
218               OpBranchConditional %81 %82 %83
219         %82 = OpLabel
220         %84 = OpLoad %6 %20
221         %85 = OpAccessChain %17 %14 %15 %15
222         %86 = OpLoad %6 %85
223         %87 = OpIEqual %31 %84 %86
224               OpBranch %83
225         %83 = OpLabel
226         %88 = OpPhi %31 %81 %25 %87 %82
227               OpSelectionMerge %90 None
228               OpBranchConditional %88 %89 %108
229         %89 = OpLabel
230         %95 = OpAccessChain %17 %14 %15 %16
231         %96 = OpLoad %6 %95
232         %97 = OpConvertSToF %91 %96
233         %98 = OpAccessChain %17 %14 %15 %15
234         %99 = OpLoad %6 %98
235        %100 = OpConvertSToF %91 %99
236        %101 = OpAccessChain %17 %14 %15 %15
237        %102 = OpLoad %6 %101
238        %103 = OpConvertSToF %91 %102
239        %104 = OpAccessChain %17 %14 %15 %16
240        %105 = OpLoad %6 %104
241        %106 = OpConvertSToF %91 %105
242        %107 = OpCompositeConstruct %92 %97 %100 %103 %106
243               OpStore %94 %107
244               OpBranch %90
245        %108 = OpLabel
246        %109 = OpAccessChain %17 %14 %15 %15
247        %110 = OpLoad %6 %109
248        %111 = OpConvertSToF %91 %110
249        %112 = OpCompositeConstruct %92 %111 %111 %111 %111
250               OpStore %94 %112
251               OpBranch %90
252         %90 = OpLabel
253               OpReturn
254               OpFunctionEnd
255END
256
257# uniforms for variant
258
259# _GLF_uniform_int_values
260BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
261 0 1 5 4 3 2
262END
263
264BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
265
266PIPELINE graphics variant_pipeline
267  ATTACH variant_vertex_shader
268  ATTACH variant_fragment_shader
269  FRAMEBUFFER_SIZE 256 256
270  BIND BUFFER variant_framebuffer AS color LOCATION 0
271  BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
272END
273CLEAR_COLOR variant_pipeline 0 0 0 255
274
275CLEAR variant_pipeline
276RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
277
278EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
279