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 loop that writes then reads a global array
22 # The test passes because the first 4-iteration loop increments acc, and then the
23 # shader writes red if acc == 4, which is always the case.
25 # Optimized using spirv-opt with the following arguments:
26 # '--reduce-load-size'
27 # '--combine-access-chains'
29 # '--inline-entry-points-exhaustive'
30 # '--eliminate-dead-code-aggressive'
31 # '--eliminate-dead-branches'
33 # '--combine-access-chains'
34 # '--scalar-replacement=100'
35 # '--private-to-local'
36 # '--convert-local-access-chains'
37 # '--private-to-local'
38 # '--scalar-replacement=100'
39 # '--eliminate-local-single-block'
40 # '--scalar-replacement=100'
42 # '--eliminate-local-multi-store'
43 # '--redundancy-elimination'
44 # '--eliminate-local-multi-store'
46 # '--inline-entry-points-exhaustive'
47 # spirv-opt commit hash: 18b3b94567a9251a6f8491a6d07c4422abadd22c
51 SHADER vertex variant_vertex_shader PASSTHROUGH
53 # variant_fragment_shader is derived from the following GLSL:
55 # precision highp float;
57 # layout(location = 0) out vec4 _GLF_color;
59 # layout(set = 0, binding = 0) uniform buf0
64 # int globalNumbers[10];
66 # // Sets globalNumbers[0] to 1.
69 # // globalNumbers[0] == 0
70 # int setGlobalNumberZeroToOne(int n)
77 # if (globalNumbers[n] <= 1)
79 # globalNumbers[n] = 1;
99 # int localNumbers[2];
105 # localNumbers[1] = yieldsZero();
106 # globalNumbers[0] = 0;
107 # setGlobalNumberZeroToOne(localNumbers[1]);
108 # acc += globalNumbers[int(one) - 1]; // acc += 1;
111 # // acc should be 4.
114 # _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
116 # _GLF_color = vec4(0.0, 0.0, 0.0, 1.0);
118 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
121 ; Generator: Khronos Glslang Reference Front End; 8
125 %1 = OpExtInstImport "GLSL.std.450"
126 OpMemoryModel Logical GLSL450
127 OpEntryPoint Fragment %4 "main" %104
128 OpExecutionMode %4 OriginUpperLeft
131 OpName %13 "yieldsZero("
132 OpName %30 "globalNumbers"
135 OpMemberName %54 0 "one"
139 OpName %80 "localNumbers"
141 OpName %104 "_GLF_color"
142 OpDecorate %13 RelaxedPrecision
143 OpDecorate %30 RelaxedPrecision
144 OpDecorate %46 RelaxedPrecision
145 OpMemberDecorate %54 0 Offset 0
147 OpDecorate %56 DescriptorSet 0
148 OpDecorate %56 Binding 0
149 OpDecorate %67 RelaxedPrecision
150 OpDecorate %68 RelaxedPrecision
151 OpDecorate %80 RelaxedPrecision
152 OpDecorate %86 RelaxedPrecision
153 OpDecorate %93 RelaxedPrecision
154 OpDecorate %95 RelaxedPrecision
155 OpDecorate %97 RelaxedPrecision
156 OpDecorate %104 Location 0
157 OpDecorate %110 RelaxedPrecision
158 OpDecorate %122 RelaxedPrecision
159 OpDecorate %129 RelaxedPrecision
160 OpDecorate %131 RelaxedPrecision
161 OpDecorate %143 RelaxedPrecision
162 OpDecorate %144 RelaxedPrecision
163 OpDecorate %146 RelaxedPrecision
164 OpDecorate %147 RelaxedPrecision
165 OpDecorate %148 RelaxedPrecision
166 OpDecorate %161 RelaxedPrecision
167 OpDecorate %160 RelaxedPrecision
168 OpDecorate %156 RelaxedPrecision
169 OpDecorate %167 RelaxedPrecision
170 OpDecorate %168 RelaxedPrecision
171 OpDecorate %169 RelaxedPrecision
172 OpDecorate %178 RelaxedPrecision
173 OpDecorate %186 RelaxedPrecision
174 OpDecorate %190 RelaxedPrecision
176 %3 = OpTypeFunction %2
178 %7 = OpTypePointer Function %6
179 %12 = OpTypeFunction %6
180 %16 = OpConstant %6 0
183 %27 = OpConstant %26 10
184 %28 = OpTypeArray %6 %27
185 %29 = OpTypePointer Private %28
186 %32 = OpTypePointer Private %6
187 %35 = OpConstant %6 1
189 %54 = OpTypeStruct %53
190 %55 = OpTypePointer Uniform %54
191 %56 = OpVariable %55 Uniform
192 %57 = OpTypePointer Uniform %53
193 %75 = OpConstant %6 4
194 %77 = OpConstant %26 2
195 %78 = OpTypeArray %6 %77
196 %79 = OpTypePointer Function %78
197 %102 = OpTypeVector %53 4
198 %103 = OpTypePointer Output %102
199 %104 = OpVariable %103 Output
200 %105 = OpConstant %53 1
201 %106 = OpConstant %53 0
202 %107 = OpConstantComposite %102 %105 %106 %106 %105
203 %109 = OpConstantComposite %102 %106 %106 %106 %105
204 %136 = OpConstantFalse %24
205 %137 = OpTypePointer Function %24
206 %139 = OpConstantTrue %24
207 %142 = OpTypePointer Function %28
210 %4 = OpFunction %2 None %3
212 %166 = OpVariable %137 Function %136
213 %167 = OpVariable %7 Function
214 %168 = OpVariable %7 Function
215 %169 = OpVariable %7 Function
216 %30 = OpVariable %142 Function
217 %110 = OpVariable %7 Function
218 %67 = OpVariable %7 Function
219 %68 = OpVariable %7 Function
220 %80 = OpVariable %79 Function
221 %84 = OpVariable %7 Function
226 %147 = OpPhi %6 %16 %5 %95 %72
227 %146 = OpPhi %6 %16 %5 %97 %72
228 OpLoopMerge %71 %72 None
231 %76 = OpSLessThan %24 %146 %75
232 OpBranchConditional %76 %70 %71
237 %172 = OpPhi %24 %136 %70 %165 %171
238 OpLoopMerge %173 %171 None
244 %177 = OpPhi %24 %172 %174 %165 %176
245 %178 = OpPhi %6 %16 %174 %164 %176
246 OpLoopMerge %179 %176 None
249 %181 = OpAccessChain %57 %56 %16
250 %182 = OpLoad %53 %181
251 %183 = OpConvertFToS %6 %182
252 %184 = OpSLessThan %24 %178 %183
253 OpBranchConditional %184 %185 %179
261 %186 = OpPhi %6 %164 %180 %178 %185
262 %187 = OpPhi %24 %177 %180 %139 %185
263 OpSelectionMerge %188 None
264 OpBranchConditional %187 %173 %188
273 %190 = OpPhi %6 %186 %179 %189 %188
276 %143 = OpLoad %78 %80
277 %144 = OpCompositeInsert %78 %81 %143 1
279 %83 = OpAccessChain %7 %30 %16
281 %85 = OpAccessChain %7 %80 %35
282 %86 = OpCompositeExtract %6 %144 1
287 %148 = OpPhi %6 %16 %173 %129 %114
288 OpLoopMerge %113 %114 None
291 %118 = OpSLessThanEqual %24 %148 %86
292 OpBranchConditional %118 %119 %113
294 %121 = OpAccessChain %7 %30 %86
295 %122 = OpLoad %6 %121
296 %123 = OpSLessThanEqual %24 %122 %35
297 OpSelectionMerge %124 None
298 OpBranchConditional %123 %125 %124
305 %129 = OpIAdd %6 %148 %35
309 %88 = OpAccessChain %57 %56 %16
311 %90 = OpConvertFToS %6 %89
312 %91 = OpISub %6 %90 %35
313 %92 = OpAccessChain %7 %30 %91
315 %95 = OpIAdd %6 %147 %93
319 %97 = OpIAdd %6 %146 %35
323 %99 = OpIEqual %24 %147 %75
324 OpSelectionMerge %101 None
325 OpBranchConditional %99 %100 %108
335 %13 = OpFunction %6 None %12
337 %138 = OpVariable %137 Function %136
338 %131 = OpVariable %7 Function
339 %46 = OpVariable %7 Function
342 %159 = OpPhi %24 %136 %14 %165 %135
343 OpLoopMerge %130 %135 None
349 %158 = OpPhi %24 %159 %134 %165 %50
350 %156 = OpPhi %6 %16 %134 %164 %50
351 OpLoopMerge %49 %50 None
354 %58 = OpAccessChain %57 %56 %16
356 %60 = OpConvertFToS %6 %59
357 %61 = OpSLessThan %24 %156 %60
358 OpBranchConditional %61 %48 %49
366 %161 = OpPhi %6 %164 %51 %156 %48
367 %157 = OpPhi %24 %158 %51 %139 %48
368 OpSelectionMerge %140 None
369 OpBranchConditional %157 %130 %140
378 %160 = OpPhi %6 %161 %49 %66 %140
383 # uniforms for variant
386 BUFFER variant_one DATA_TYPE float DATA
390 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
392 PIPELINE graphics variant_pipeline
393 ATTACH variant_vertex_shader
394 ATTACH variant_fragment_shader
395 FRAMEBUFFER_SIZE 256 256
396 BIND BUFFER variant_framebuffer AS color LOCATION 0
397 BIND BUFFER variant_one AS uniform DESCRIPTOR_SET 0 BINDING 0
399 CLEAR_COLOR variant_pipeline 0 0 0 255
401 CLEAR variant_pipeline
402 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
404 EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255