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