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 unreachable continue statement
22 # The test passes because the shader always writes the color red.
24 # Optimized using spirv-opt with the following arguments:
25 # '--eliminate-local-single-store'
26 # '--simplify-instructions'
27 # '--eliminate-dead-branches'
29 # '--combine-access-chains'
31 # '--eliminate-dead-branches'
32 # spirv-opt commit hash: 06407250a169c6a03b3765e86619075af1a8c187
36 SHADER vertex variant_vertex_shader PASSTHROUGH
38 # variant_fragment_shader is derived from the following GLSL:
40 # precision highp float;
42 # layout(location = 0) out vec4 _GLF_color;
44 # layout(set = 0, binding = 0) uniform buf0
46 # vec2 injectionSwitch;
50 # _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
53 # int _injected_loop_counter = 1;
57 # if (injectionSwitch.x > 1.0) // Always false
59 # if (injectionSwitch.x > 1.0)
72 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
75 ; Generator: Khronos Glslang Reference Front End; 7
79 %1 = OpExtInstImport "GLSL.std.450"
80 OpMemoryModel Logical GLSL450
81 OpEntryPoint Fragment %4 "main" %13
82 OpExecutionMode %4 OriginUpperLeft
85 OpName %9 "computeColor("
86 OpName %13 "_GLF_color"
87 OpName %19 "_injected_loop_counter"
89 OpMemberName %29 0 "injectionSwitch"
91 OpDecorate %13 Location 0
92 OpDecorate %19 RelaxedPrecision
93 OpMemberDecorate %29 0 Offset 0
95 OpDecorate %31 DescriptorSet 0
96 OpDecorate %31 Binding 0
98 %3 = OpTypeFunction %2
100 %7 = OpTypeVector %6 3
101 %8 = OpTypeFunction %7
102 %11 = OpTypeVector %6 4
103 %12 = OpTypePointer Output %11
104 %13 = OpVariable %12 Output
105 %14 = OpConstant %6 1
106 %15 = OpConstant %6 0
107 %16 = OpConstantComposite %11 %14 %15 %15 %14
109 %18 = OpTypePointer Function %17
110 %20 = OpConstant %17 1
112 %27 = OpConstantTrue %26
113 %28 = OpTypeVector %6 2
114 %29 = OpTypeStruct %28
115 %30 = OpTypePointer Uniform %29
116 %31 = OpVariable %30 Uniform
117 %32 = OpConstant %17 0
119 %34 = OpConstant %33 0
120 %35 = OpTypePointer Uniform %6
121 %47 = OpConstantComposite %7 %14 %14 %14
122 %4 = OpFunction %2 None %3
124 %51 = OpFunctionCall %7 %9
127 %9 = OpFunction %7 None %8
129 %19 = OpVariable %18 Function
134 OpLoopMerge %23 %45 None
137 %36 = OpAccessChain %35 %31 %32 %34
139 %38 = OpFOrdGreaterThan %26 %37 %14
140 OpSelectionMerge %40 None
141 OpBranchConditional %38 %39 %40
143 %41 = OpAccessChain %35 %31 %32 %34
145 %43 = OpFOrdGreaterThan %26 %42 %14
146 OpSelectionMerge %52 None
147 OpBranchConditional %43 %44 %45
161 # uniforms for variant
164 BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
168 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
170 PIPELINE graphics variant_pipeline
171 ATTACH variant_vertex_shader
172 ATTACH variant_fragment_shader
173 FRAMEBUFFER_SIZE 256 256
174 BIND BUFFER variant_framebuffer AS color LOCATION 0
175 BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
177 CLEAR_COLOR variant_pipeline 0 0 0 255
179 CLEAR variant_pipeline
180 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
182 EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255