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 arr value set to itself squared
22 # The test passes because shader always writes red.
24 SHADER vertex variant_vertex_shader PASSTHROUGH
26 # variant_fragment_shader is derived from the following GLSL:
28 # precision highp float;
30 # precision highp int;
32 # layout(location = 0) out vec4 _GLF_color;
34 # struct QuicksortObject {
38 # QuicksortObject obj;
40 # void swap(int i, int j)
42 # int temp = obj.numbers[i];
43 # obj.numbers[i] = obj.numbers[j];
44 # obj.numbers[j] = temp;
46 # int performPartition(int l, int h)
48 # int pivot = obj.numbers[h];
56 # if(obj.numbers[j] <= pivot)
76 # int p = performPartition(l, h);
80 # stack[++ top] = p - 1;
84 # stack[++ top] = p + 1;
97 # obj.numbers[i] = (10 - i);
98 # obj.numbers[i] = obj.numbers[i] * obj.numbers[i];
102 # if (obj.numbers[0] < obj.numbers[4])
103 # _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
105 # _GLF_color = vec4(0.0, 1.0, 0.0, 1.0);
108 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
111 ; Generator: Khronos Glslang Reference Front End; 8
115 %1 = OpExtInstImport "GLSL.std.450"
116 OpMemoryModel Logical GLSL450
117 OpEntryPoint Fragment %4 "main" %188
118 OpExecutionMode %4 OriginUpperLeft
121 OpName %11 "swap(i1;i1;"
124 OpName %16 "performPartition(i1;i1;"
127 OpName %18 "quicksort("
129 OpName %24 "QuicksortObject"
130 OpMemberName %24 0 "numbers"
147 OpName %188 "_GLF_color"
148 OpDecorate %188 Location 0
150 %3 = OpTypeFunction %2
152 %7 = OpTypePointer Function %6
153 %8 = OpTypeFunction %2 %7 %7
154 %13 = OpTypeFunction %6 %7 %7
156 %22 = OpConstant %21 10
157 %23 = OpTypeArray %6 %22
158 %24 = OpTypeStruct %23
159 %25 = OpTypePointer Private %24
160 %26 = OpVariable %25 Private
161 %27 = OpConstant %6 0
162 %29 = OpTypePointer Private %6
163 %46 = OpConstant %6 1
165 %88 = OpConstant %6 9
166 %90 = OpConstant %6 -1
167 %91 = OpTypePointer Function %23
168 %159 = OpConstant %6 10
169 %179 = OpConstant %6 4
170 %185 = OpTypeFloat 32
171 %186 = OpTypeVector %185 4
172 %187 = OpTypePointer Output %186
173 %188 = OpVariable %187 Output
174 %189 = OpConstant %185 1
175 %190 = OpConstant %185 0
176 %191 = OpConstantComposite %186 %189 %190 %190 %189
177 %193 = OpConstantComposite %186 %190 %189 %190 %189
178 %194 = OpTypeVector %185 2
179 %4 = OpFunction %2 None %3
181 %152 = OpVariable %7 Function
185 OpLoopMerge %155 %156 None
188 %158 = OpLoad %6 %152
189 %160 = OpSLessThan %58 %158 %159
190 OpBranchConditional %160 %154 %155
192 %161 = OpLoad %6 %152
193 %162 = OpLoad %6 %152
194 %163 = OpISub %6 %159 %162
195 %164 = OpAccessChain %29 %26 %27 %161
197 %165 = OpLoad %6 %152
198 %166 = OpLoad %6 %152
199 %167 = OpAccessChain %29 %26 %27 %166
200 %168 = OpLoad %6 %167
201 %169 = OpLoad %6 %152
202 %170 = OpAccessChain %29 %26 %27 %169
203 %171 = OpLoad %6 %170
204 %172 = OpIMul %6 %168 %171
205 %173 = OpAccessChain %29 %26 %27 %165
209 %174 = OpLoad %6 %152
210 %175 = OpIAdd %6 %174 %46
214 %176 = OpFunctionCall %2 %18
215 %177 = OpAccessChain %29 %26 %27 %27
216 %178 = OpLoad %6 %177
217 %180 = OpAccessChain %29 %26 %27 %179
218 %181 = OpLoad %6 %180
219 %182 = OpSLessThan %58 %178 %181
220 OpSelectionMerge %184 None
221 OpBranchConditional %182 %183 %192
231 %11 = OpFunction %2 None %8
232 %9 = OpFunctionParameter %7
233 %10 = OpFunctionParameter %7
235 %20 = OpVariable %7 Function
237 %30 = OpAccessChain %29 %26 %27 %28
242 %34 = OpAccessChain %29 %26 %27 %33
244 %36 = OpAccessChain %29 %26 %27 %32
248 %39 = OpAccessChain %29 %26 %27 %37
252 %16 = OpFunction %6 None %13
253 %14 = OpFunctionParameter %7
254 %15 = OpFunctionParameter %7
256 %40 = OpVariable %7 Function
257 %44 = OpVariable %7 Function
258 %48 = OpVariable %7 Function
259 %69 = OpVariable %7 Function
260 %71 = OpVariable %7 Function
261 %78 = OpVariable %7 Function
262 %79 = OpVariable %7 Function
264 %42 = OpAccessChain %29 %26 %27 %41
268 %47 = OpISub %6 %45 %46
274 OpLoopMerge %52 %53 None
279 %57 = OpISub %6 %56 %46
280 %59 = OpSLessThanEqual %58 %55 %57
281 OpBranchConditional %59 %51 %52
284 %61 = OpAccessChain %29 %26 %27 %60
287 %64 = OpSLessThanEqual %58 %62 %63
288 OpSelectionMerge %66 None
289 OpBranchConditional %64 %65 %66
292 %68 = OpIAdd %6 %67 %46
298 %73 = OpFunctionCall %2 %11 %69 %71
304 %75 = OpIAdd %6 %74 %46
309 %77 = OpIAdd %6 %76 %46
313 %81 = OpFunctionCall %2 %11 %78 %79
315 %83 = OpIAdd %6 %82 %46
318 %18 = OpFunction %2 None %3
320 %86 = OpVariable %7 Function
321 %87 = OpVariable %7 Function
322 %89 = OpVariable %7 Function
323 %92 = OpVariable %91 Function
324 %116 = OpVariable %7 Function
325 %117 = OpVariable %7 Function
326 %119 = OpVariable %7 Function
331 %94 = OpIAdd %6 %93 %46
334 %96 = OpAccessChain %7 %92 %94
337 %98 = OpIAdd %6 %97 %46
340 %100 = OpAccessChain %7 %92 %98
344 OpLoopMerge %103 %104 None
348 %107 = OpSGreaterThanEqual %58 %106 %27
349 OpBranchConditional %107 %102 %103
352 %109 = OpISub %6 %108 %46
354 %110 = OpAccessChain %7 %92 %108
355 %111 = OpLoad %6 %110
358 %113 = OpISub %6 %112 %46
360 %114 = OpAccessChain %7 %92 %112
361 %115 = OpLoad %6 %114
367 %121 = OpFunctionCall %6 %16 %117 %119
369 %122 = OpLoad %6 %116
370 %123 = OpISub %6 %122 %46
372 %125 = OpSGreaterThan %58 %123 %124
373 OpSelectionMerge %127 None
374 OpBranchConditional %125 %126 %127
377 %129 = OpIAdd %6 %128 %46
380 %131 = OpAccessChain %7 %92 %129
383 %133 = OpIAdd %6 %132 %46
385 %134 = OpLoad %6 %116
386 %135 = OpISub %6 %134 %46
387 %136 = OpAccessChain %7 %92 %133
391 %137 = OpLoad %6 %116
392 %138 = OpIAdd %6 %137 %46
394 %140 = OpSLessThan %58 %138 %139
395 OpSelectionMerge %142 None
396 OpBranchConditional %140 %141 %142
399 %144 = OpIAdd %6 %143 %46
401 %145 = OpLoad %6 %116
402 %146 = OpIAdd %6 %145 %46
403 %147 = OpAccessChain %7 %92 %144
406 %149 = OpIAdd %6 %148 %46
409 %151 = OpAccessChain %7 %92 %149
421 # uniforms for variant
423 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
425 PIPELINE graphics variant_pipeline
426 ATTACH variant_vertex_shader
427 ATTACH variant_fragment_shader
428 FRAMEBUFFER_SIZE 16 16
429 BIND BUFFER variant_framebuffer AS color LOCATION 0
431 CLEAR_COLOR variant_pipeline 0 0 0 255
433 CLEAR variant_pipeline
434 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
436 EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255