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