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