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