3 # Copyright 2020 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 that uses struct array data for loop iterator value
22 # The test passes because shader always writes red.
24 # Optimized using spirv-opt with the following arguments:
26 # spirv-opt commit hash: ab7ac60f14ae66006bed5c989a2cfd4c4881704c
30 SHADER vertex variant_vertex_shader PASSTHROUGH
32 # variant_fragment_shader is derived from the following GLSL:
34 # precision highp float;
35 # precision highp int;
37 # layout(location = 0) out vec4 _GLF_color;
39 # layout(set = 0, binding = 0) uniform buf0
49 # // Always returns given parameter value.
55 # for (int i = 0; i < 1 + int(zero); i++)
69 # for (int i = 0; i < 2; i++)
77 # _GLF_color = vec4(1, 0, 0, 1);
79 # _GLF_color = vec4(0);
83 # _GLF_color = vec4(0); // Should never be reached.
85 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
88 ; Generator: Khronos Glslang Reference Front End; 8
92 %1 = OpExtInstImport "GLSL.std.450"
93 OpMemoryModel Logical GLSL450
94 OpEntryPoint Fragment %4 "main" %79
95 OpExecutionMode %4 OriginUpperLeft
99 OpMemberName %12 0 "a"
101 OpMemberName %29 0 "zero"
103 OpName %79 "_GLF_color"
104 OpMemberDecorate %29 0 Offset 0
106 OpDecorate %31 DescriptorSet 0
107 OpDecorate %31 Binding 0
108 OpDecorate %79 Location 0
110 %3 = OpTypeFunction %2
112 %7 = OpTypePointer Function %6
113 %12 = OpTypeStruct %6
115 %14 = OpConstant %13 9
116 %15 = OpTypeArray %12 %14
117 %16 = OpTypePointer Function %15
118 %18 = OpConstant %6 0
119 %19 = OpConstant %6 1
121 %29 = OpTypeStruct %28
122 %30 = OpTypePointer Uniform %29
123 %31 = OpVariable %30 Uniform
124 %32 = OpTypePointer Uniform %28
126 %41 = OpConstant %28 1
127 %52 = OpConstant %6 -1
128 %62 = OpConstant %6 2
129 %71 = OpConstant %6 5
130 %77 = OpTypeVector %28 4
131 %78 = OpTypePointer Output %77
132 %79 = OpVariable %78 Output
133 %80 = OpConstant %28 0
134 %81 = OpConstantComposite %77 %41 %80 %80 %41
135 %83 = OpConstantComposite %77 %80 %80 %80 %80
136 %92 = OpConstantFalse %37
137 %95 = OpConstantTrue %37
139 %4 = OpFunction %2 None %3
141 %144 = OpVariable %16 Function
142 %109 = OpVariable %16 Function
145 OpLoopMerge %88 %91 None
148 %186 = OpPhi %6 %188 %89 %182 %59
149 %177 = OpPhi %6 %18 %89 %87 %59
150 %63 = OpSLessThan %37 %177 %62
151 OpLoopMerge %58 %59 None
152 OpBranchConditional %63 %57 %58
156 %116 = OpAccessChain %7 %109 %18 %18
158 OpLoopMerge %113 %114 None
161 %178 = OpPhi %6 %18 %112 %138 %119
162 %122 = OpAccessChain %32 %31 %18
163 %123 = OpLoad %28 %122
164 %124 = OpConvertFToS %6 %123
165 %125 = OpIAdd %6 %19 %124
166 %126 = OpSLessThan %37 %178 %125
167 OpLoopMerge %118 %119 None
168 OpBranchConditional %126 %127 %118
170 %130 = OpFOrdLessThan %37 %123 %41
171 OpSelectionMerge %131 None
172 OpBranchConditional %130 %132 %131
176 %135 = OpAccessChain %7 %109 %178 %18
177 %136 = OpLoad %6 %135
180 %138 = OpIAdd %6 %136 %19
183 %183 = OpPhi %6 %186 %117 %177 %132
184 %179 = OpPhi %37 %92 %117 %95 %132
185 OpSelectionMerge %140 None
186 OpBranchConditional %179 %113 %140
192 %182 = OpPhi %6 %183 %118 %52 %140
193 OpSelectionMerge %69 None
194 OpSwitch %182 %69 -1 %67 0 %68
198 %151 = OpAccessChain %7 %144 %18 %18
200 OpLoopMerge %148 %149 None
203 %189 = OpPhi %6 %18 %147 %173 %154
204 %161 = OpSLessThan %37 %189 %125
205 OpLoopMerge %153 %154 None
206 OpBranchConditional %161 %162 %153
208 %165 = OpFOrdLessThan %37 %123 %41
209 OpSelectionMerge %166 None
210 OpBranchConditional %165 %167 %166
214 %170 = OpAccessChain %7 %144 %189 %18
215 %171 = OpLoad %6 %170
218 %173 = OpIAdd %6 %171 %19
221 %194 = OpPhi %6 %188 %152 %71 %167
222 %190 = OpPhi %37 %92 %152 %95 %167
223 OpSelectionMerge %175 None
224 OpBranchConditional %190 %148 %175
230 %193 = OpPhi %6 %194 %153 %52 %175
231 %74 = OpIEqual %37 %193 %71
232 OpSelectionMerge %76 None
233 OpBranchConditional %74 %75 %82
247 %87 = OpIAdd %6 %177 %19
250 %203 = OpPhi %37 %92 %56 %95 %67 %95 %76
251 OpSelectionMerge %96 None
252 OpBranchConditional %203 %88 %96
263 # uniforms for variant
266 BUFFER variant_zero DATA_TYPE float DATA
270 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
272 PIPELINE graphics variant_pipeline
273 ATTACH variant_vertex_shader
274 ATTACH variant_fragment_shader
275 FRAMEBUFFER_SIZE 256 256
276 BIND BUFFER variant_framebuffer AS color LOCATION 0
277 BIND BUFFER variant_zero AS uniform DESCRIPTOR_SET 0 BINDING 0
279 CLEAR_COLOR variant_pipeline 0 0 0 255
281 CLEAR variant_pipeline
282 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
284 EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255