• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!amber
2
3# Copyright 2019 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 dead code elimination 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#
30# layout(set = 0, binding = 0) uniform buf0
31# {
32#     vec2 injectionSwitch;
33# };
34# layout(location = 0) out vec4 _GLF_color;
35# float array0[3]; // Will end up having 0, 0, 0
36# float array1[3]; // Will end up having 1, 1, 1
37#
38# void main()
39# {
40#     int q = 0;
41#     int i = int(gl_FragCoord.x) % 3;
42#     for(int c = 0; c < 3; c++)
43#     {
44#         array0[c] = 0.0;
45#         array1[c] = 0.0;
46#
47#         // injectionSwitch.x is always zero
48#         switch(int((injectionSwitch.x)) + q)
49#         {
50#             case 0:
51#                 q = 61;
52#                 break;
53#             case 51:
54#                 // We never hit this infinite loop.
55#                 while(true) {}
56#                 // This wrong value should never be written.
57#                 array0[c] = 1.0;
58#             case 61:
59#                 array1[0] = 1.0;
60#                 array1[c] = 1.0;
61#         }
62#     }
63#     _GLF_color = vec4(array1[i], array0[i], array0[i], 1);
64# }
65SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
66; SPIR-V
67; Version: 1.0
68; Generator: Khronos Glslang Reference Front End; 8
69; Bound: 87
70; Schema: 0
71               OpCapability Shader
72          %1 = OpExtInstImport "GLSL.std.450"
73               OpMemoryModel Logical GLSL450
74               OpEntryPoint Fragment %4 "main" %14 %76
75               OpExecutionMode %4 OriginUpperLeft
76               OpSource ESSL 310
77               OpName %4 "main"
78               OpName %8 "q"
79               OpName %10 "i"
80               OpName %14 "gl_FragCoord"
81               OpName %23 "c"
82               OpName %35 "array0"
83               OpName %40 "array1"
84               OpName %44 "buf0"
85               OpMemberName %44 0 "injectionSwitch"
86               OpName %46 ""
87               OpName %76 "_GLF_color"
88               OpDecorate %8 RelaxedPrecision
89               OpDecorate %10 RelaxedPrecision
90               OpDecorate %14 BuiltIn FragCoord
91               OpDecorate %20 RelaxedPrecision
92               OpDecorate %22 RelaxedPrecision
93               OpDecorate %23 RelaxedPrecision
94               OpDecorate %29 RelaxedPrecision
95               OpDecorate %36 RelaxedPrecision
96               OpDecorate %41 RelaxedPrecision
97               OpMemberDecorate %44 0 Offset 0
98               OpDecorate %44 Block
99               OpDecorate %46 DescriptorSet 0
100               OpDecorate %46 Binding 0
101               OpDecorate %50 RelaxedPrecision
102               OpDecorate %51 RelaxedPrecision
103               OpDecorate %52 RelaxedPrecision
104               OpDecorate %65 RelaxedPrecision
105               OpDecorate %69 RelaxedPrecision
106               OpDecorate %72 RelaxedPrecision
107               OpDecorate %74 RelaxedPrecision
108               OpDecorate %76 Location 0
109               OpDecorate %77 RelaxedPrecision
110               OpDecorate %80 RelaxedPrecision
111               OpDecorate %83 RelaxedPrecision
112          %2 = OpTypeVoid
113          %3 = OpTypeFunction %2
114          %6 = OpTypeInt 32 1
115          %7 = OpTypePointer Function %6
116          %9 = OpConstant %6 0
117         %11 = OpTypeFloat 32
118         %12 = OpTypeVector %11 4
119         %13 = OpTypePointer Input %12
120         %14 = OpVariable %13 Input
121         %15 = OpTypeInt 32 0
122         %16 = OpConstant %15 0
123         %17 = OpTypePointer Input %11
124         %21 = OpConstant %6 3
125         %30 = OpTypeBool
126         %32 = OpConstant %15 3
127         %33 = OpTypeArray %11 %32
128         %34 = OpTypePointer Private %33
129         %35 = OpVariable %34 Private
130         %37 = OpConstant %11 0
131         %38 = OpTypePointer Private %11
132         %40 = OpVariable %34 Private
133         %43 = OpTypeVector %11 2
134         %44 = OpTypeStruct %43
135         %45 = OpTypePointer Uniform %44
136         %46 = OpVariable %45 Uniform
137         %47 = OpTypePointer Uniform %11
138         %57 = OpConstant %6 61
139         %64 = OpConstantTrue %30
140         %66 = OpConstant %11 1
141         %73 = OpConstant %6 1
142         %75 = OpTypePointer Output %12
143         %76 = OpVariable %75 Output
144          %4 = OpFunction %2 None %3
145          %5 = OpLabel
146          %8 = OpVariable %7 Function
147         %10 = OpVariable %7 Function
148         %23 = OpVariable %7 Function
149               OpStore %8 %9
150         %18 = OpAccessChain %17 %14 %16
151         %19 = OpLoad %11 %18
152         %20 = OpConvertFToS %6 %19
153         %22 = OpSMod %6 %20 %21
154               OpStore %10 %22
155               OpStore %23 %9
156               OpBranch %24
157         %24 = OpLabel
158               OpLoopMerge %26 %27 None
159               OpBranch %28
160         %28 = OpLabel
161         %29 = OpLoad %6 %23
162         %31 = OpSLessThan %30 %29 %21
163               OpBranchConditional %31 %25 %26
164         %25 = OpLabel
165         %36 = OpLoad %6 %23
166         %39 = OpAccessChain %38 %35 %36
167               OpStore %39 %37
168         %41 = OpLoad %6 %23
169         %42 = OpAccessChain %38 %40 %41
170               OpStore %42 %37
171         %48 = OpAccessChain %47 %46 %9 %16
172         %49 = OpLoad %11 %48
173         %50 = OpConvertFToS %6 %49
174         %51 = OpLoad %6 %8
175         %52 = OpIAdd %6 %50 %51
176               OpSelectionMerge %56 None
177               OpSwitch %52 %56 0 %53 51 %54 61 %55
178         %53 = OpLabel
179               OpStore %8 %57
180               OpBranch %56
181         %54 = OpLabel
182               OpBranch %59
183         %59 = OpLabel
184               OpLoopMerge %61 %62 None
185               OpBranch %63
186         %63 = OpLabel
187               OpBranchConditional %64 %60 %61
188         %60 = OpLabel
189               OpBranch %62
190         %62 = OpLabel
191               OpBranch %59
192         %61 = OpLabel
193         %65 = OpLoad %6 %23
194         %67 = OpAccessChain %38 %35 %65
195               OpStore %67 %66
196               OpBranch %55
197         %55 = OpLabel
198         %68 = OpAccessChain %38 %40 %9
199               OpStore %68 %66
200         %69 = OpLoad %6 %23
201         %70 = OpAccessChain %38 %40 %69
202               OpStore %70 %66
203               OpBranch %56
204         %56 = OpLabel
205               OpBranch %27
206         %27 = OpLabel
207         %72 = OpLoad %6 %23
208         %74 = OpIAdd %6 %72 %73
209               OpStore %23 %74
210               OpBranch %24
211         %26 = OpLabel
212         %77 = OpLoad %6 %10
213         %78 = OpAccessChain %38 %40 %77
214         %79 = OpLoad %11 %78
215         %80 = OpLoad %6 %10
216         %81 = OpAccessChain %38 %35 %80
217         %82 = OpLoad %11 %81
218         %83 = OpLoad %6 %10
219         %84 = OpAccessChain %38 %35 %83
220         %85 = OpLoad %11 %84
221         %86 = OpCompositeConstruct %12 %79 %82 %85 %66
222               OpStore %76 %86
223               OpReturn
224               OpFunctionEnd
225END
226
227# uniforms for variant
228
229# injectionSwitch
230BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
231 0.0 1.0
232END
233
234BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
235
236PIPELINE graphics variant_pipeline
237  ATTACH variant_vertex_shader
238  ATTACH variant_fragment_shader
239  FRAMEBUFFER_SIZE 256 256
240  BIND BUFFER variant_framebuffer AS color LOCATION 0
241  BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
242END
243CLEAR_COLOR variant_pipeline 0 0 0 255
244
245CLEAR variant_pipeline
246RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
247
248EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
249