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 the GraphicsFuzz project.
20 # Short description: A fragment shader with greater of two values as index
22 # The test passes because both shaders render the same image.
24 # reference_vertex_shader is derived from the following GLSL:
26 # precision highp float;
28 # precision highp int;
30 # vec4 _GLF_FragCoord;
32 # layout(location = 0) in vec4 _GLF_pos;
34 # layout(location = 0) out vec4 frag_color;
36 # layout(set = 0, binding = 0) uniform buf0
40 # struct QuicksortObject
45 # QuicksortObject obj;
47 # void swap(int i, int j)
49 # int temp = obj.numbers[i];
50 # obj.numbers[i] = obj.numbers[j];
51 # obj.numbers[j] = temp;
53 # int performPartition(int l, int h)
55 # int pivot = obj.numbers[h];
57 # for (int j = l; j <= h - 1; j++)
59 # if (obj.numbers[j] <= pivot)
79 # int p = performPartition(l, h);
83 # stack[++top] = p - 1;
87 # stack[++top] = p + 1;
94 # _GLF_FragCoord = (_GLF_pos + vec4(1.0, 1.0, 0.0, 0.0)) * vec4(128.0, 128.0, 1.0, 1.0);
95 # for (int i = 0; i < 10; i++)
97 # obj.numbers[i] = (10 - i);
98 # obj.numbers[i] = obj.numbers[i] * obj.numbers[i];
101 # vec2 uv = _GLF_FragCoord.xy / resolution;
102 # vec3 color = vec3(1.0, 2.0, 3.0);
103 # color.x += float(obj.numbers[0]);
104 # if (uv.x > (1.0 / 4.0))
106 # color.x += float(obj.numbers[1]);
108 # if (uv.x > (2.0 / 4.0))
110 # color.y += float(obj.numbers[2]);
112 # if (uv.x > (3.0 / 4.0))
114 # color.z += float(obj.numbers[3]);
116 # color.y += float(obj.numbers[4]);
117 # if (uv.y > (1.0 / 4.0))
119 # color.x += float(obj.numbers[5]);
121 # if (uv.y > (2.0 / 4.0))
123 # color.y += float(obj.numbers[6]);
125 # if (uv.y > (3.0 / 4.0))
127 # color.z += float(obj.numbers[7]);
129 # color.z += float(obj.numbers[8]);
130 # if (abs(uv.x - uv.y) < 0.25)
132 # color.x += float(obj.numbers[9]);
134 # frag_color = vec4(normalize(color), 1.0);
135 # gl_Position = _GLF_pos;
137 SHADER vertex reference_vertex_shader SPIRV-ASM TARGET_ENV spv1.0
140 ; Generator: Khronos Glslang Reference Front End; 8
144 %1 = OpExtInstImport "GLSL.std.450"
145 OpMemoryModel Logical GLSL450
146 OpEntryPoint Vertex %4 "main" %157 %333 %342
149 OpName %11 "swap(i1;i1;"
152 OpName %16 "performPartition(i1;i1;"
155 OpName %18 "quicksort("
157 OpName %24 "QuicksortObject"
158 OpMemberName %24 0 "numbers"
174 OpName %155 "_GLF_FragCoord"
175 OpName %157 "_GLF_pos"
179 OpMemberName %196 0 "resolution"
182 OpName %333 "frag_color"
183 OpName %340 "gl_PerVertex"
184 OpMemberName %340 0 "gl_Position"
185 OpMemberName %340 1 "gl_PointSize"
187 OpDecorate %157 Location 0
188 OpMemberDecorate %196 0 Offset 0
189 OpDecorate %196 Block
190 OpDecorate %198 DescriptorSet 0
191 OpDecorate %198 Binding 0
192 OpDecorate %333 Location 0
193 OpMemberDecorate %340 0 BuiltIn Position
194 OpMemberDecorate %340 1 BuiltIn PointSize
195 OpDecorate %340 Block
197 %3 = OpTypeFunction %2
199 %7 = OpTypePointer Function %6
200 %8 = OpTypeFunction %2 %7 %7
201 %13 = OpTypeFunction %6 %7 %7
203 %22 = OpConstant %21 10
204 %23 = OpTypeArray %6 %22
205 %24 = OpTypeStruct %23
206 %25 = OpTypePointer Private %24
207 %26 = OpVariable %25 Private
208 %27 = OpConstant %6 0
209 %29 = OpTypePointer Private %6
210 %46 = OpConstant %6 1
212 %88 = OpConstant %6 9
213 %90 = OpConstant %6 -1
214 %91 = OpTypePointer Function %23
215 %152 = OpTypeFloat 32
216 %153 = OpTypeVector %152 4
217 %154 = OpTypePointer Private %153
218 %155 = OpVariable %154 Private
219 %156 = OpTypePointer Input %153
220 %157 = OpVariable %156 Input
221 %159 = OpConstant %152 1
222 %160 = OpConstant %152 0
223 %161 = OpConstantComposite %153 %159 %159 %160 %160
224 %163 = OpConstant %152 128
225 %164 = OpConstantComposite %153 %163 %163 %159 %159
226 %173 = OpConstant %6 10
227 %191 = OpTypeVector %152 2
228 %192 = OpTypePointer Function %191
229 %196 = OpTypeStruct %191
230 %197 = OpTypePointer Uniform %196
231 %198 = OpVariable %197 Uniform
232 %199 = OpTypePointer Uniform %191
233 %203 = OpTypeVector %152 3
234 %204 = OpTypePointer Function %203
235 %206 = OpConstant %152 2
236 %207 = OpConstant %152 3
237 %208 = OpConstantComposite %203 %159 %206 %207
238 %212 = OpConstant %21 0
239 %213 = OpTypePointer Function %152
240 %220 = OpConstant %152 0.25
241 %233 = OpConstant %152 0.5
242 %237 = OpConstant %6 2
243 %241 = OpConstant %21 1
244 %248 = OpConstant %152 0.75
245 %252 = OpConstant %6 3
246 %256 = OpConstant %21 2
247 %261 = OpConstant %6 4
248 %274 = OpConstant %6 5
249 %287 = OpConstant %6 6
250 %300 = OpConstant %6 7
251 %308 = OpConstant %6 8
252 %332 = OpTypePointer Output %153
253 %333 = OpVariable %332 Output
254 %340 = OpTypeStruct %153 %152
255 %341 = OpTypePointer Output %340
256 %342 = OpVariable %341 Output
257 %4 = OpFunction %2 None %3
259 %166 = OpVariable %7 Function
260 %193 = OpVariable %192 Function
261 %205 = OpVariable %204 Function
262 %158 = OpLoad %153 %157
263 %162 = OpFAdd %153 %158 %161
264 %165 = OpFMul %153 %162 %164
269 OpLoopMerge %169 %170 None
272 %172 = OpLoad %6 %166
273 %174 = OpSLessThan %58 %172 %173
274 OpBranchConditional %174 %168 %169
276 %175 = OpLoad %6 %166
277 %176 = OpLoad %6 %166
278 %177 = OpISub %6 %173 %176
279 %178 = OpAccessChain %29 %26 %27 %175
281 %179 = OpLoad %6 %166
282 %180 = OpLoad %6 %166
283 %181 = OpAccessChain %29 %26 %27 %180
284 %182 = OpLoad %6 %181
285 %183 = OpLoad %6 %166
286 %184 = OpAccessChain %29 %26 %27 %183
287 %185 = OpLoad %6 %184
288 %186 = OpIMul %6 %182 %185
289 %187 = OpAccessChain %29 %26 %27 %179
293 %188 = OpLoad %6 %166
294 %189 = OpIAdd %6 %188 %46
298 %190 = OpFunctionCall %2 %18
299 %194 = OpLoad %153 %155
300 %195 = OpVectorShuffle %191 %194 %194 0 1
301 %200 = OpAccessChain %199 %198 %27
302 %201 = OpLoad %191 %200
303 %202 = OpFDiv %191 %195 %201
306 %209 = OpAccessChain %29 %26 %27 %27
307 %210 = OpLoad %6 %209
308 %211 = OpConvertSToF %152 %210
309 %214 = OpAccessChain %213 %205 %212
310 %215 = OpLoad %152 %214
311 %216 = OpFAdd %152 %215 %211
312 %217 = OpAccessChain %213 %205 %212
314 %218 = OpAccessChain %213 %193 %212
315 %219 = OpLoad %152 %218
316 %221 = OpFOrdGreaterThan %58 %219 %220
317 OpSelectionMerge %223 None
318 OpBranchConditional %221 %222 %223
320 %224 = OpAccessChain %29 %26 %27 %46
321 %225 = OpLoad %6 %224
322 %226 = OpConvertSToF %152 %225
323 %227 = OpAccessChain %213 %205 %212
324 %228 = OpLoad %152 %227
325 %229 = OpFAdd %152 %228 %226
326 %230 = OpAccessChain %213 %205 %212
330 %231 = OpAccessChain %213 %193 %212
331 %232 = OpLoad %152 %231
332 %234 = OpFOrdGreaterThan %58 %232 %233
333 OpSelectionMerge %236 None
334 OpBranchConditional %234 %235 %236
336 %238 = OpAccessChain %29 %26 %27 %237
337 %239 = OpLoad %6 %238
338 %240 = OpConvertSToF %152 %239
339 %242 = OpAccessChain %213 %205 %241
340 %243 = OpLoad %152 %242
341 %244 = OpFAdd %152 %243 %240
342 %245 = OpAccessChain %213 %205 %241
346 %246 = OpAccessChain %213 %193 %212
347 %247 = OpLoad %152 %246
348 %249 = OpFOrdGreaterThan %58 %247 %248
349 OpSelectionMerge %251 None
350 OpBranchConditional %249 %250 %251
352 %253 = OpAccessChain %29 %26 %27 %252
353 %254 = OpLoad %6 %253
354 %255 = OpConvertSToF %152 %254
355 %257 = OpAccessChain %213 %205 %256
356 %258 = OpLoad %152 %257
357 %259 = OpFAdd %152 %258 %255
358 %260 = OpAccessChain %213 %205 %256
362 %262 = OpAccessChain %29 %26 %27 %261
363 %263 = OpLoad %6 %262
364 %264 = OpConvertSToF %152 %263
365 %265 = OpAccessChain %213 %205 %241
366 %266 = OpLoad %152 %265
367 %267 = OpFAdd %152 %266 %264
368 %268 = OpAccessChain %213 %205 %241
370 %269 = OpAccessChain %213 %193 %241
371 %270 = OpLoad %152 %269
372 %271 = OpFOrdGreaterThan %58 %270 %220
373 OpSelectionMerge %273 None
374 OpBranchConditional %271 %272 %273
376 %275 = OpAccessChain %29 %26 %27 %274
377 %276 = OpLoad %6 %275
378 %277 = OpConvertSToF %152 %276
379 %278 = OpAccessChain %213 %205 %212
380 %279 = OpLoad %152 %278
381 %280 = OpFAdd %152 %279 %277
382 %281 = OpAccessChain %213 %205 %212
386 %282 = OpAccessChain %213 %193 %241
387 %283 = OpLoad %152 %282
388 %284 = OpFOrdGreaterThan %58 %283 %233
389 OpSelectionMerge %286 None
390 OpBranchConditional %284 %285 %286
392 %288 = OpAccessChain %29 %26 %27 %287
393 %289 = OpLoad %6 %288
394 %290 = OpConvertSToF %152 %289
395 %291 = OpAccessChain %213 %205 %241
396 %292 = OpLoad %152 %291
397 %293 = OpFAdd %152 %292 %290
398 %294 = OpAccessChain %213 %205 %241
402 %295 = OpAccessChain %213 %193 %241
403 %296 = OpLoad %152 %295
404 %297 = OpFOrdGreaterThan %58 %296 %248
405 OpSelectionMerge %299 None
406 OpBranchConditional %297 %298 %299
408 %301 = OpAccessChain %29 %26 %27 %300
409 %302 = OpLoad %6 %301
410 %303 = OpConvertSToF %152 %302
411 %304 = OpAccessChain %213 %205 %256
412 %305 = OpLoad %152 %304
413 %306 = OpFAdd %152 %305 %303
414 %307 = OpAccessChain %213 %205 %256
418 %309 = OpAccessChain %29 %26 %27 %308
419 %310 = OpLoad %6 %309
420 %311 = OpConvertSToF %152 %310
421 %312 = OpAccessChain %213 %205 %256
422 %313 = OpLoad %152 %312
423 %314 = OpFAdd %152 %313 %311
424 %315 = OpAccessChain %213 %205 %256
426 %316 = OpAccessChain %213 %193 %212
427 %317 = OpLoad %152 %316
428 %318 = OpAccessChain %213 %193 %241
429 %319 = OpLoad %152 %318
430 %320 = OpFSub %152 %317 %319
431 %321 = OpExtInst %152 %1 FAbs %320
432 %322 = OpFOrdLessThan %58 %321 %220
433 OpSelectionMerge %324 None
434 OpBranchConditional %322 %323 %324
436 %325 = OpAccessChain %29 %26 %27 %88
437 %326 = OpLoad %6 %325
438 %327 = OpConvertSToF %152 %326
439 %328 = OpAccessChain %213 %205 %212
440 %329 = OpLoad %152 %328
441 %330 = OpFAdd %152 %329 %327
442 %331 = OpAccessChain %213 %205 %212
446 %334 = OpLoad %203 %205
447 %335 = OpExtInst %203 %1 Normalize %334
448 %336 = OpCompositeExtract %152 %335 0
449 %337 = OpCompositeExtract %152 %335 1
450 %338 = OpCompositeExtract %152 %335 2
451 %339 = OpCompositeConstruct %153 %336 %337 %338 %159
453 %343 = OpLoad %153 %157
454 %344 = OpAccessChain %332 %342 %27
458 %11 = OpFunction %2 None %8
459 %9 = OpFunctionParameter %7
460 %10 = OpFunctionParameter %7
462 %20 = OpVariable %7 Function
464 %30 = OpAccessChain %29 %26 %27 %28
469 %34 = OpAccessChain %29 %26 %27 %33
471 %36 = OpAccessChain %29 %26 %27 %32
475 %39 = OpAccessChain %29 %26 %27 %37
479 %16 = OpFunction %6 None %13
480 %14 = OpFunctionParameter %7
481 %15 = OpFunctionParameter %7
483 %40 = OpVariable %7 Function
484 %44 = OpVariable %7 Function
485 %48 = OpVariable %7 Function
486 %69 = OpVariable %7 Function
487 %71 = OpVariable %7 Function
488 %78 = OpVariable %7 Function
489 %79 = OpVariable %7 Function
491 %42 = OpAccessChain %29 %26 %27 %41
495 %47 = OpISub %6 %45 %46
501 OpLoopMerge %52 %53 None
506 %57 = OpISub %6 %56 %46
507 %59 = OpSLessThanEqual %58 %55 %57
508 OpBranchConditional %59 %51 %52
511 %61 = OpAccessChain %29 %26 %27 %60
514 %64 = OpSLessThanEqual %58 %62 %63
515 OpSelectionMerge %66 None
516 OpBranchConditional %64 %65 %66
519 %68 = OpIAdd %6 %67 %46
525 %73 = OpFunctionCall %2 %11 %69 %71
531 %75 = OpIAdd %6 %74 %46
536 %77 = OpIAdd %6 %76 %46
540 %81 = OpFunctionCall %2 %11 %78 %79
542 %83 = OpIAdd %6 %82 %46
545 %18 = OpFunction %2 None %3
547 %86 = OpVariable %7 Function
548 %87 = OpVariable %7 Function
549 %89 = OpVariable %7 Function
550 %92 = OpVariable %91 Function
551 %116 = OpVariable %7 Function
552 %117 = OpVariable %7 Function
553 %119 = OpVariable %7 Function
558 %94 = OpIAdd %6 %93 %46
561 %96 = OpAccessChain %7 %92 %94
564 %98 = OpIAdd %6 %97 %46
567 %100 = OpAccessChain %7 %92 %98
571 OpLoopMerge %103 %104 None
575 %107 = OpSGreaterThanEqual %58 %106 %27
576 OpBranchConditional %107 %102 %103
579 %109 = OpISub %6 %108 %46
581 %110 = OpAccessChain %7 %92 %108
582 %111 = OpLoad %6 %110
585 %113 = OpISub %6 %112 %46
587 %114 = OpAccessChain %7 %92 %112
588 %115 = OpLoad %6 %114
594 %121 = OpFunctionCall %6 %16 %117 %119
596 %122 = OpLoad %6 %116
597 %123 = OpISub %6 %122 %46
599 %125 = OpSGreaterThan %58 %123 %124
600 OpSelectionMerge %127 None
601 OpBranchConditional %125 %126 %127
604 %129 = OpIAdd %6 %128 %46
607 %131 = OpAccessChain %7 %92 %129
610 %133 = OpIAdd %6 %132 %46
612 %134 = OpLoad %6 %116
613 %135 = OpISub %6 %134 %46
614 %136 = OpAccessChain %7 %92 %133
618 %137 = OpLoad %6 %116
619 %138 = OpIAdd %6 %137 %46
621 %140 = OpSLessThan %58 %138 %139
622 OpSelectionMerge %142 None
623 OpBranchConditional %140 %141 %142
626 %144 = OpIAdd %6 %143 %46
628 %145 = OpLoad %6 %116
629 %146 = OpIAdd %6 %145 %46
630 %147 = OpAccessChain %7 %92 %144
633 %149 = OpIAdd %6 %148 %46
636 %151 = OpAccessChain %7 %92 %149
648 # reference_fragment_shader is derived from the following GLSL:
650 # precision highp float;
652 # layout(location = 0) out vec4 _GLF_color;
654 # layout(location = 0) in vec4 frag_color;
658 # _GLF_color = frag_color;
660 SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
663 ; Generator: Khronos Glslang Reference Front End; 8
667 %1 = OpExtInstImport "GLSL.std.450"
668 OpMemoryModel Logical GLSL450
669 OpEntryPoint Fragment %4 "main" %9 %11
670 OpExecutionMode %4 OriginUpperLeft
673 OpName %9 "_GLF_color"
674 OpName %11 "frag_color"
675 OpDecorate %9 Location 0
676 OpDecorate %11 Location 0
678 %3 = OpTypeFunction %2
680 %7 = OpTypeVector %6 4
681 %8 = OpTypePointer Output %7
682 %9 = OpVariable %8 Output
683 %10 = OpTypePointer Input %7
684 %11 = OpVariable %10 Input
685 %4 = OpFunction %2 None %3
693 # uniforms for reference
696 BUFFER reference_resolution DATA_TYPE vec2<float> DATA
700 BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
702 PIPELINE graphics reference_pipeline
703 ATTACH reference_vertex_shader
704 ATTACH reference_fragment_shader
705 FRAMEBUFFER_SIZE 256 256
706 BIND BUFFER reference_framebuffer AS color LOCATION 0
707 BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
709 CLEAR_COLOR reference_pipeline 0 0 0 255
711 CLEAR reference_pipeline
712 RUN reference_pipeline DRAW_GRID POS 0 0 SIZE 256 256 CELLS 8 8
715 # variant_vertex_shader is derived from the following GLSL:
717 # precision highp float;
719 # precision highp int;
721 # layout(set = 0, binding = 0) uniform buf0
723 # highp vec2 injectionSwitch;
725 # vec4 _GLF_FragCoord;
727 # layout(location = 0) in vec4 _GLF_pos;
729 # layout(location = 0) out vec4 frag_color;
731 # layout(set = 0, binding = 1) uniform buf1
735 # struct QuicksortObject
740 # QuicksortObject obj;
742 # void swap(int i, int j)
744 # int temp = obj.numbers[i];
745 # obj.numbers[i] = obj.numbers[j];
746 # obj.numbers[j] = temp;
748 # int performPartition(int l, int h)
750 # int pivot = obj.numbers[h];
752 # for (int j = l; j <= h - 1; j++)
754 # if (obj.numbers[j] <= pivot)
774 # int p = performPartition(l, h);
778 # stack[++top] = p - 1;
782 # stack[++top] = p + 1;
789 # _GLF_FragCoord = (_GLF_pos + vec4(1.0, 1.0, 0.0, 0.0)) * vec4(128.0, 128.0, 1.0, 1.0);
790 # for (int i = 0; i < 10; i++)
792 # obj.numbers[i] = (10 - i);
793 # obj.numbers[i] = obj.numbers[i] * obj.numbers[i];
796 # vec2 uv = _GLF_FragCoord.xy / resolution;
797 # vec3 color = vec3(1.0, 2.0, 3.0);
798 # color.x += float(obj.numbers[0]);
799 # if (uv.x > (1.0 / 4.0))
801 # color.x += float(obj.numbers[1]);
803 # if (uv.x > (2.0 / 4.0))
805 # // Assigned value for color.y is set by float(obj.numbers[2]); below.
806 # // Therefore it is the same as reference shader and should not affect the output.
807 # // [ max((2*1 = 2), 2) ] [ max((2*1 = 2), 2) ]
808 # color.y += max(float(obj.numbers[max((2) * int((injectionSwitch.y)), 2)]), float(obj.numbers[max((2) * int((injectionSwitch.y)), 2)]));
810 # if (uv.x > (3.0 / 4.0))
812 # color.z += float(obj.numbers[3]);
814 # color.y += float(obj.numbers[4]);
815 # if (uv.y > (1.0 / 4.0))
817 # color.x += float(obj.numbers[5]);
819 # if (uv.y > (2.0 / 4.0))
821 # color.y += float(obj.numbers[6]);
823 # if (uv.y > (3.0 / 4.0))
825 # color.z += float(obj.numbers[7]);
827 # color.z += float(obj.numbers[8]);
828 # if (abs(uv.x - uv.y) < 0.25)
830 # color.x += float(obj.numbers[9]);
832 # frag_color = vec4(normalize(color), 1.0);
833 # gl_Position = _GLF_pos;
835 SHADER vertex variant_vertex_shader SPIRV-ASM TARGET_ENV spv1.0
838 ; Generator: Khronos Glslang Reference Front End; 8
842 %1 = OpExtInstImport "GLSL.std.450"
843 OpMemoryModel Logical GLSL450
844 OpEntryPoint Vertex %4 "main" %157 %351 %360
847 OpName %11 "swap(i1;i1;"
850 OpName %16 "performPartition(i1;i1;"
853 OpName %18 "quicksort("
855 OpName %24 "QuicksortObject"
856 OpMemberName %24 0 "numbers"
872 OpName %155 "_GLF_FragCoord"
873 OpName %157 "_GLF_pos"
877 OpMemberName %196 0 "resolution"
881 OpMemberName %238 0 "injectionSwitch"
883 OpName %351 "frag_color"
884 OpName %358 "gl_PerVertex"
885 OpMemberName %358 0 "gl_Position"
886 OpMemberName %358 1 "gl_PointSize"
888 OpDecorate %157 Location 0
889 OpMemberDecorate %196 0 Offset 0
890 OpDecorate %196 Block
891 OpDecorate %198 DescriptorSet 0
892 OpDecorate %198 Binding 1
893 OpMemberDecorate %238 0 Offset 0
894 OpDecorate %238 Block
895 OpDecorate %240 DescriptorSet 0
896 OpDecorate %240 Binding 0
897 OpDecorate %351 Location 0
898 OpMemberDecorate %358 0 BuiltIn Position
899 OpMemberDecorate %358 1 BuiltIn PointSize
900 OpDecorate %358 Block
902 %3 = OpTypeFunction %2
904 %7 = OpTypePointer Function %6
905 %8 = OpTypeFunction %2 %7 %7
906 %13 = OpTypeFunction %6 %7 %7
908 %22 = OpConstant %21 10
909 %23 = OpTypeArray %6 %22
910 %24 = OpTypeStruct %23
911 %25 = OpTypePointer Private %24
912 %26 = OpVariable %25 Private
913 %27 = OpConstant %6 0
914 %29 = OpTypePointer Private %6
915 %46 = OpConstant %6 1
917 %88 = OpConstant %6 9
918 %90 = OpConstant %6 -1
919 %91 = OpTypePointer Function %23
920 %152 = OpTypeFloat 32
921 %153 = OpTypeVector %152 4
922 %154 = OpTypePointer Private %153
923 %155 = OpVariable %154 Private
924 %156 = OpTypePointer Input %153
925 %157 = OpVariable %156 Input
926 %159 = OpConstant %152 1
927 %160 = OpConstant %152 0
928 %161 = OpConstantComposite %153 %159 %159 %160 %160
929 %163 = OpConstant %152 128
930 %164 = OpConstantComposite %153 %163 %163 %159 %159
931 %173 = OpConstant %6 10
932 %191 = OpTypeVector %152 2
933 %192 = OpTypePointer Function %191
934 %196 = OpTypeStruct %191
935 %197 = OpTypePointer Uniform %196
936 %198 = OpVariable %197 Uniform
937 %199 = OpTypePointer Uniform %191
938 %203 = OpTypeVector %152 3
939 %204 = OpTypePointer Function %203
940 %206 = OpConstant %152 2
941 %207 = OpConstant %152 3
942 %208 = OpConstantComposite %203 %159 %206 %207
943 %212 = OpConstant %21 0
944 %213 = OpTypePointer Function %152
945 %220 = OpConstant %152 0.25
946 %233 = OpConstant %152 0.5
947 %237 = OpConstant %6 2
948 %238 = OpTypeStruct %191
949 %239 = OpTypePointer Uniform %238
950 %240 = OpVariable %239 Uniform
951 %241 = OpConstant %21 1
952 %242 = OpTypePointer Uniform %152
953 %266 = OpConstant %152 0.75
954 %270 = OpConstant %6 3
955 %274 = OpConstant %21 2
956 %279 = OpConstant %6 4
957 %292 = OpConstant %6 5
958 %305 = OpConstant %6 6
959 %318 = OpConstant %6 7
960 %326 = OpConstant %6 8
961 %350 = OpTypePointer Output %153
962 %351 = OpVariable %350 Output
963 %358 = OpTypeStruct %153 %152
964 %359 = OpTypePointer Output %358
965 %360 = OpVariable %359 Output
966 %4 = OpFunction %2 None %3
968 %166 = OpVariable %7 Function
969 %193 = OpVariable %192 Function
970 %205 = OpVariable %204 Function
971 %158 = OpLoad %153 %157
972 %162 = OpFAdd %153 %158 %161
973 %165 = OpFMul %153 %162 %164
978 OpLoopMerge %169 %170 None
981 %172 = OpLoad %6 %166
982 %174 = OpSLessThan %58 %172 %173
983 OpBranchConditional %174 %168 %169
985 %175 = OpLoad %6 %166
986 %176 = OpLoad %6 %166
987 %177 = OpISub %6 %173 %176
988 %178 = OpAccessChain %29 %26 %27 %175
990 %179 = OpLoad %6 %166
991 %180 = OpLoad %6 %166
992 %181 = OpAccessChain %29 %26 %27 %180
993 %182 = OpLoad %6 %181
994 %183 = OpLoad %6 %166
995 %184 = OpAccessChain %29 %26 %27 %183
996 %185 = OpLoad %6 %184
997 %186 = OpIMul %6 %182 %185
998 %187 = OpAccessChain %29 %26 %27 %179
1002 %188 = OpLoad %6 %166
1003 %189 = OpIAdd %6 %188 %46
1007 %190 = OpFunctionCall %2 %18
1008 %194 = OpLoad %153 %155
1009 %195 = OpVectorShuffle %191 %194 %194 0 1
1010 %200 = OpAccessChain %199 %198 %27
1011 %201 = OpLoad %191 %200
1012 %202 = OpFDiv %191 %195 %201
1015 %209 = OpAccessChain %29 %26 %27 %27
1016 %210 = OpLoad %6 %209
1017 %211 = OpConvertSToF %152 %210
1018 %214 = OpAccessChain %213 %205 %212
1019 %215 = OpLoad %152 %214
1020 %216 = OpFAdd %152 %215 %211
1021 %217 = OpAccessChain %213 %205 %212
1023 %218 = OpAccessChain %213 %193 %212
1024 %219 = OpLoad %152 %218
1025 %221 = OpFOrdGreaterThan %58 %219 %220
1026 OpSelectionMerge %223 None
1027 OpBranchConditional %221 %222 %223
1029 %224 = OpAccessChain %29 %26 %27 %46
1030 %225 = OpLoad %6 %224
1031 %226 = OpConvertSToF %152 %225
1032 %227 = OpAccessChain %213 %205 %212
1033 %228 = OpLoad %152 %227
1034 %229 = OpFAdd %152 %228 %226
1035 %230 = OpAccessChain %213 %205 %212
1039 %231 = OpAccessChain %213 %193 %212
1040 %232 = OpLoad %152 %231
1041 %234 = OpFOrdGreaterThan %58 %232 %233
1042 OpSelectionMerge %236 None
1043 OpBranchConditional %234 %235 %236
1045 %243 = OpAccessChain %242 %240 %27 %241
1046 %244 = OpLoad %152 %243
1047 %245 = OpConvertFToS %6 %244
1048 %246 = OpIMul %6 %237 %245
1049 %247 = OpExtInst %6 %1 SMax %246 %237
1050 %248 = OpAccessChain %29 %26 %27 %247
1051 %249 = OpLoad %6 %248
1052 %250 = OpConvertSToF %152 %249
1053 %251 = OpAccessChain %242 %240 %27 %241
1054 %252 = OpLoad %152 %251
1055 %253 = OpConvertFToS %6 %252
1056 %254 = OpIMul %6 %237 %253
1057 %255 = OpExtInst %6 %1 SMax %254 %237
1058 %256 = OpAccessChain %29 %26 %27 %255
1059 %257 = OpLoad %6 %256
1060 %258 = OpConvertSToF %152 %257
1061 %259 = OpExtInst %152 %1 FMax %250 %258
1062 %260 = OpAccessChain %213 %205 %241
1063 %261 = OpLoad %152 %260
1064 %262 = OpFAdd %152 %261 %259
1065 %263 = OpAccessChain %213 %205 %241
1069 %264 = OpAccessChain %213 %193 %212
1070 %265 = OpLoad %152 %264
1071 %267 = OpFOrdGreaterThan %58 %265 %266
1072 OpSelectionMerge %269 None
1073 OpBranchConditional %267 %268 %269
1075 %271 = OpAccessChain %29 %26 %27 %270
1076 %272 = OpLoad %6 %271
1077 %273 = OpConvertSToF %152 %272
1078 %275 = OpAccessChain %213 %205 %274
1079 %276 = OpLoad %152 %275
1080 %277 = OpFAdd %152 %276 %273
1081 %278 = OpAccessChain %213 %205 %274
1085 %280 = OpAccessChain %29 %26 %27 %279
1086 %281 = OpLoad %6 %280
1087 %282 = OpConvertSToF %152 %281
1088 %283 = OpAccessChain %213 %205 %241
1089 %284 = OpLoad %152 %283
1090 %285 = OpFAdd %152 %284 %282
1091 %286 = OpAccessChain %213 %205 %241
1093 %287 = OpAccessChain %213 %193 %241
1094 %288 = OpLoad %152 %287
1095 %289 = OpFOrdGreaterThan %58 %288 %220
1096 OpSelectionMerge %291 None
1097 OpBranchConditional %289 %290 %291
1099 %293 = OpAccessChain %29 %26 %27 %292
1100 %294 = OpLoad %6 %293
1101 %295 = OpConvertSToF %152 %294
1102 %296 = OpAccessChain %213 %205 %212
1103 %297 = OpLoad %152 %296
1104 %298 = OpFAdd %152 %297 %295
1105 %299 = OpAccessChain %213 %205 %212
1109 %300 = OpAccessChain %213 %193 %241
1110 %301 = OpLoad %152 %300
1111 %302 = OpFOrdGreaterThan %58 %301 %233
1112 OpSelectionMerge %304 None
1113 OpBranchConditional %302 %303 %304
1115 %306 = OpAccessChain %29 %26 %27 %305
1116 %307 = OpLoad %6 %306
1117 %308 = OpConvertSToF %152 %307
1118 %309 = OpAccessChain %213 %205 %241
1119 %310 = OpLoad %152 %309
1120 %311 = OpFAdd %152 %310 %308
1121 %312 = OpAccessChain %213 %205 %241
1125 %313 = OpAccessChain %213 %193 %241
1126 %314 = OpLoad %152 %313
1127 %315 = OpFOrdGreaterThan %58 %314 %266
1128 OpSelectionMerge %317 None
1129 OpBranchConditional %315 %316 %317
1131 %319 = OpAccessChain %29 %26 %27 %318
1132 %320 = OpLoad %6 %319
1133 %321 = OpConvertSToF %152 %320
1134 %322 = OpAccessChain %213 %205 %274
1135 %323 = OpLoad %152 %322
1136 %324 = OpFAdd %152 %323 %321
1137 %325 = OpAccessChain %213 %205 %274
1141 %327 = OpAccessChain %29 %26 %27 %326
1142 %328 = OpLoad %6 %327
1143 %329 = OpConvertSToF %152 %328
1144 %330 = OpAccessChain %213 %205 %274
1145 %331 = OpLoad %152 %330
1146 %332 = OpFAdd %152 %331 %329
1147 %333 = OpAccessChain %213 %205 %274
1149 %334 = OpAccessChain %213 %193 %212
1150 %335 = OpLoad %152 %334
1151 %336 = OpAccessChain %213 %193 %241
1152 %337 = OpLoad %152 %336
1153 %338 = OpFSub %152 %335 %337
1154 %339 = OpExtInst %152 %1 FAbs %338
1155 %340 = OpFOrdLessThan %58 %339 %220
1156 OpSelectionMerge %342 None
1157 OpBranchConditional %340 %341 %342
1159 %343 = OpAccessChain %29 %26 %27 %88
1160 %344 = OpLoad %6 %343
1161 %345 = OpConvertSToF %152 %344
1162 %346 = OpAccessChain %213 %205 %212
1163 %347 = OpLoad %152 %346
1164 %348 = OpFAdd %152 %347 %345
1165 %349 = OpAccessChain %213 %205 %212
1169 %352 = OpLoad %203 %205
1170 %353 = OpExtInst %203 %1 Normalize %352
1171 %354 = OpCompositeExtract %152 %353 0
1172 %355 = OpCompositeExtract %152 %353 1
1173 %356 = OpCompositeExtract %152 %353 2
1174 %357 = OpCompositeConstruct %153 %354 %355 %356 %159
1176 %361 = OpLoad %153 %157
1177 %362 = OpAccessChain %350 %360 %27
1181 %11 = OpFunction %2 None %8
1182 %9 = OpFunctionParameter %7
1183 %10 = OpFunctionParameter %7
1185 %20 = OpVariable %7 Function
1187 %30 = OpAccessChain %29 %26 %27 %28
1192 %34 = OpAccessChain %29 %26 %27 %33
1194 %36 = OpAccessChain %29 %26 %27 %32
1198 %39 = OpAccessChain %29 %26 %27 %37
1202 %16 = OpFunction %6 None %13
1203 %14 = OpFunctionParameter %7
1204 %15 = OpFunctionParameter %7
1206 %40 = OpVariable %7 Function
1207 %44 = OpVariable %7 Function
1208 %48 = OpVariable %7 Function
1209 %69 = OpVariable %7 Function
1210 %71 = OpVariable %7 Function
1211 %78 = OpVariable %7 Function
1212 %79 = OpVariable %7 Function
1214 %42 = OpAccessChain %29 %26 %27 %41
1218 %47 = OpISub %6 %45 %46
1224 OpLoopMerge %52 %53 None
1229 %57 = OpISub %6 %56 %46
1230 %59 = OpSLessThanEqual %58 %55 %57
1231 OpBranchConditional %59 %51 %52
1234 %61 = OpAccessChain %29 %26 %27 %60
1237 %64 = OpSLessThanEqual %58 %62 %63
1238 OpSelectionMerge %66 None
1239 OpBranchConditional %64 %65 %66
1242 %68 = OpIAdd %6 %67 %46
1248 %73 = OpFunctionCall %2 %11 %69 %71
1254 %75 = OpIAdd %6 %74 %46
1259 %77 = OpIAdd %6 %76 %46
1263 %81 = OpFunctionCall %2 %11 %78 %79
1265 %83 = OpIAdd %6 %82 %46
1268 %18 = OpFunction %2 None %3
1270 %86 = OpVariable %7 Function
1271 %87 = OpVariable %7 Function
1272 %89 = OpVariable %7 Function
1273 %92 = OpVariable %91 Function
1274 %116 = OpVariable %7 Function
1275 %117 = OpVariable %7 Function
1276 %119 = OpVariable %7 Function
1281 %94 = OpIAdd %6 %93 %46
1284 %96 = OpAccessChain %7 %92 %94
1287 %98 = OpIAdd %6 %97 %46
1290 %100 = OpAccessChain %7 %92 %98
1294 OpLoopMerge %103 %104 None
1297 %106 = OpLoad %6 %89
1298 %107 = OpSGreaterThanEqual %58 %106 %27
1299 OpBranchConditional %107 %102 %103
1301 %108 = OpLoad %6 %89
1302 %109 = OpISub %6 %108 %46
1304 %110 = OpAccessChain %7 %92 %108
1305 %111 = OpLoad %6 %110
1307 %112 = OpLoad %6 %89
1308 %113 = OpISub %6 %112 %46
1310 %114 = OpAccessChain %7 %92 %112
1311 %115 = OpLoad %6 %114
1313 %118 = OpLoad %6 %86
1315 %120 = OpLoad %6 %87
1317 %121 = OpFunctionCall %6 %16 %117 %119
1319 %122 = OpLoad %6 %116
1320 %123 = OpISub %6 %122 %46
1321 %124 = OpLoad %6 %86
1322 %125 = OpSGreaterThan %58 %123 %124
1323 OpSelectionMerge %127 None
1324 OpBranchConditional %125 %126 %127
1326 %128 = OpLoad %6 %89
1327 %129 = OpIAdd %6 %128 %46
1329 %130 = OpLoad %6 %86
1330 %131 = OpAccessChain %7 %92 %129
1332 %132 = OpLoad %6 %89
1333 %133 = OpIAdd %6 %132 %46
1335 %134 = OpLoad %6 %116
1336 %135 = OpISub %6 %134 %46
1337 %136 = OpAccessChain %7 %92 %133
1341 %137 = OpLoad %6 %116
1342 %138 = OpIAdd %6 %137 %46
1343 %139 = OpLoad %6 %87
1344 %140 = OpSLessThan %58 %138 %139
1345 OpSelectionMerge %142 None
1346 OpBranchConditional %140 %141 %142
1348 %143 = OpLoad %6 %89
1349 %144 = OpIAdd %6 %143 %46
1351 %145 = OpLoad %6 %116
1352 %146 = OpIAdd %6 %145 %46
1353 %147 = OpAccessChain %7 %92 %144
1355 %148 = OpLoad %6 %89
1356 %149 = OpIAdd %6 %148 %46
1358 %150 = OpLoad %6 %87
1359 %151 = OpAccessChain %7 %92 %149
1371 # variant_fragment_shader is derived from the following GLSL:
1373 # precision highp float;
1375 # layout(location = 0) out vec4 _GLF_color;
1377 # layout(location = 0) in vec4 frag_color;
1381 # _GLF_color = frag_color;
1383 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
1386 ; Generator: Khronos Glslang Reference Front End; 8
1390 %1 = OpExtInstImport "GLSL.std.450"
1391 OpMemoryModel Logical GLSL450
1392 OpEntryPoint Fragment %4 "main" %9 %11
1393 OpExecutionMode %4 OriginUpperLeft
1396 OpName %9 "_GLF_color"
1397 OpName %11 "frag_color"
1398 OpDecorate %9 Location 0
1399 OpDecorate %11 Location 0
1401 %3 = OpTypeFunction %2
1403 %7 = OpTypeVector %6 4
1404 %8 = OpTypePointer Output %7
1405 %9 = OpVariable %8 Output
1406 %10 = OpTypePointer Input %7
1407 %11 = OpVariable %10 Input
1408 %4 = OpFunction %2 None %3
1416 # uniforms for variant
1419 BUFFER variant_resolution DATA_TYPE vec2<float> DATA
1423 BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
1427 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
1429 PIPELINE graphics variant_pipeline
1430 ATTACH variant_vertex_shader
1431 ATTACH variant_fragment_shader
1432 FRAMEBUFFER_SIZE 256 256
1433 BIND BUFFER variant_framebuffer AS color LOCATION 0
1434 BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 1
1435 BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
1437 CLEAR_COLOR variant_pipeline 0 0 0 255
1439 CLEAR variant_pipeline
1440 RUN variant_pipeline DRAW_GRID POS 0 0 SIZE 256 256 CELLS 8 8
1442 EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005