3 # Copyright 2019 Google LLC
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
9 # http://www.apache.org/licenses/LICENSE-2.0
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.
18 # A test for a bug found by GraphicsFuzz.
20 # Short description: A fragment shader with an always discarding main function
22 # The test passes because: the framebuffer is cleared to black,
23 # the fragment shader always discards,
24 # and we check that the framebuffer is still black.
26 # Optimized using spirv-opt with the following arguments:
27 # '--private-to-local'
28 # '--reduce-load-size'
29 # '--eliminate-dead-code-aggressive'
30 # '--eliminate-local-multi-store'
31 # '--eliminate-dead-branches'
33 # '--private-to-local'
34 # '--combine-access-chains'
35 # '--eliminate-dead-branches'
36 # '--eliminate-dead-branches'
37 # '--inline-entry-points-exhaustive'
38 # '--scalar-replacement=100'
40 # '--combine-access-chains'
43 # '--combine-access-chains'
44 # '--reduce-load-size'
45 # '--redundancy-elimination'
46 # '--eliminate-local-multi-store'
49 # spirv-opt commit hash: e82a428605f6ce0a07337b36f8ba3935c9f165ac
53 SHADER vertex variant_vertex_shader PASSTHROUGH
55 # variant_fragment_shader is derived from the following GLSL:
57 # precision highp float;
59 # layout(location = 0) out vec4 _GLF_color;
61 # layout(set = 0, binding = 0) uniform buf0
63 # vec2 injectionSwitch;
71 # int binarySearch(tmp_struct obj)
79 # if (obj.nmb[zero] == 1)
91 # float tmp_float = injectionSwitch.y;
92 # vec3 color = vec3(tmp_float);
94 # if (binarySearch(obj) == -1) // Always true
100 # _GLF_color = vec4(0.0, 0.0, 0.0, 0.0);
101 # color.yz += vec2(1.0);
102 # if (injectionSwitch.x > 1.0)
107 # _GLF_color = vec4(color, 1.0);
109 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
112 ; Generator: Khronos Glslang Reference Front End; 8
116 %1 = OpExtInstImport "GLSL.std.450"
117 OpMemoryModel Logical GLSL450
118 OpEntryPoint Fragment %4 "main" %69
119 OpExecutionMode %4 OriginUpperLeft
122 OpName %10 "tmp_struct"
123 OpMemberName %10 0 "nmb"
124 OpName %14 "binarySearch(struct-tmp_struct-i1[1]1;"
128 OpName %45 "tmp_float"
130 OpMemberName %47 0 "injectionSwitch"
133 OpName %69 "_GLF_color"
134 OpMemberDecorate %10 0 RelaxedPrecision
135 OpDecorate %14 RelaxedPrecision
136 OpDecorate %17 RelaxedPrecision
137 OpDecorate %28 RelaxedPrecision
138 OpDecorate %30 RelaxedPrecision
139 OpDecorate %34 RelaxedPrecision
140 OpMemberDecorate %47 0 Offset 0
142 OpDecorate %49 DescriptorSet 0
143 OpDecorate %49 Binding 0
144 OpDecorate %69 Location 0
145 OpDecorate %92 RelaxedPrecision
146 OpDecorate %102 RelaxedPrecision
147 OpDecorate %111 RelaxedPrecision
148 OpDecorate %112 RelaxedPrecision
149 OpDecorate %113 RelaxedPrecision
150 OpDecorate %114 RelaxedPrecision
151 OpDecorate %122 RelaxedPrecision
152 OpDecorate %120 RelaxedPrecision
153 OpDecorate %128 RelaxedPrecision
154 OpDecorate %137 RelaxedPrecision
155 OpDecorate %144 RelaxedPrecision
156 OpDecorate %143 RelaxedPrecision
157 OpDecorate %154 RelaxedPrecision
158 OpDecorate %153 RelaxedPrecision
160 %3 = OpTypeFunction %2
164 %9 = OpTypeArray %6 %8
165 %10 = OpTypeStruct %9
166 %11 = OpTypePointer Function %10
167 %12 = OpTypeFunction %6 %11
168 %16 = OpTypePointer Function %6
169 %18 = OpConstant %6 1
170 %25 = OpConstant %6 10
172 %31 = OpConstant %6 0
173 %40 = OpConstant %6 -1
175 %44 = OpTypePointer Function %43
176 %46 = OpTypeVector %43 2
177 %47 = OpTypeStruct %46
178 %48 = OpTypePointer Uniform %47
179 %49 = OpVariable %48 Uniform
180 %50 = OpTypePointer Uniform %43
181 %53 = OpTypeVector %43 3
182 %54 = OpTypePointer Function %53
183 %67 = OpTypeVector %43 4
184 %68 = OpTypePointer Output %67
185 %69 = OpVariable %68 Output
186 %70 = OpConstant %43 0
187 %71 = OpConstantComposite %67 %70 %70 %70 %70
188 %72 = OpConstant %43 1
189 %73 = OpConstantComposite %46 %72 %72
190 %79 = OpConstant %7 0
192 %97 = OpConstantFalse %26
193 %98 = OpTypePointer Function %26
194 %100 = OpConstantTrue %26
195 %135 = OpConstantNull %9
196 %136 = OpTypePointer Function %9
201 %4 = OpFunction %2 None %3
203 %137 = OpVariable %136 Function
204 %110 = OpVariable %98 Function %97
205 %111 = OpVariable %16 Function
206 %112 = OpVariable %16 Function
207 %113 = OpVariable %16 Function
208 %114 = OpVariable %16 Function
209 %99 = OpVariable %98 Function %97
210 %45 = OpVariable %44 Function
211 %55 = OpVariable %54 Function
214 OpLoopMerge %93 %96 None
217 %51 = OpAccessChain %50 %49 %31 %8
220 %57 = OpCompositeConstruct %53 %52 %52 %52
222 %138 = OpCompositeExtract %9 %91 0
227 %142 = OpPhi %26 %97 %95 %149 %117
228 OpLoopMerge %116 %117 None
234 %122 = OpPhi %6 %18 %118 %120 %121
235 OpLoopMerge %123 %121 None
238 %125 = OpSGreaterThan %26 %122 %25
239 OpBranchConditional %125 %126 %123
241 %120 = OpISub %6 %122 %18
243 %139 = OpAccessChain %16 %137 %120
244 %128 = OpLoad %6 %139
245 %129 = OpIEqual %26 %128 %18
246 OpSelectionMerge %130 None
247 OpBranchConditional %129 %131 %130
258 %144 = OpPhi %6 %148 %124 %18 %131
259 %140 = OpPhi %26 %142 %124 %100 %131
260 OpSelectionMerge %133 None
261 OpBranchConditional %140 %116 %133
269 %143 = OpPhi %6 %144 %123 %40 %133
271 %62 = OpIEqual %26 %143 %40
272 OpSelectionMerge %64 None
273 OpBranchConditional %62 %63 %66
278 %75 = OpVectorShuffle %46 %57 %57 1 2
279 %76 = OpFAdd %46 %75 %73
280 %78 = OpVectorShuffle %53 %57 %76 0 3 4
282 %80 = OpAccessChain %50 %49 %31 %79
284 %82 = OpFOrdGreaterThan %26 %81 %72
285 OpSelectionMerge %84 None
286 OpBranchConditional %82 %83 %84
293 %87 = OpCompositeExtract %43 %78 0
294 %88 = OpCompositeExtract %43 %78 1
295 %89 = OpCompositeExtract %43 %78 2
296 %90 = OpCompositeConstruct %67 %87 %88 %89 %72
305 %14 = OpFunction %6 None %12
306 %13 = OpFunctionParameter %11
308 %107 = OpVariable %98 Function %97
309 %102 = OpVariable %16 Function
310 %17 = OpVariable %16 Function
311 %28 = OpVariable %16 Function
314 %152 = OpPhi %26 %97 %15 %158 %106
315 OpLoopMerge %101 %106 None
321 %92 = OpPhi %6 %18 %105 %30 %22
322 OpLoopMerge %21 %22 None
325 %27 = OpSGreaterThan %26 %92 %25
326 OpBranchConditional %27 %20 %21
328 %30 = OpISub %6 %92 %18
330 %33 = OpAccessChain %16 %13 %31 %30
332 %35 = OpIEqual %26 %34 %18
333 OpSelectionMerge %37 None
334 OpBranchConditional %35 %36 %37
345 %154 = OpPhi %6 %157 %23 %18 %36
346 %150 = OpPhi %26 %152 %23 %100 %36
347 OpSelectionMerge %108 None
348 OpBranchConditional %150 %101 %108
356 %153 = OpPhi %6 %154 %21 %40 %108
361 # uniforms for variant
364 BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
368 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
370 PIPELINE graphics variant_pipeline
371 ATTACH variant_vertex_shader
372 ATTACH variant_fragment_shader
373 FRAMEBUFFER_SIZE 256 256
374 BIND BUFFER variant_framebuffer AS color LOCATION 0
375 BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
377 CLEAR_COLOR variant_pipeline 0 0 0 255
379 CLEAR variant_pipeline
380 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
382 EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 0 0 0 255