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 with true conditional divided by 1
22 # The test passes because both shaders render the same image.
24 # Optimized using spirv-opt with the following arguments:
25 # '--eliminate-local-multi-store'
26 # '--combine-access-chains'
27 # '--copy-propagate-arrays'
28 # '--scalar-replacement=100'
29 # '--eliminate-dead-code-aggressive'
30 # '--inline-entry-points-exhaustive'
31 # '--private-to-local'
32 # '--eliminate-dead-branches'
33 # '--eliminate-dead-inserts'
35 # '--simplify-instructions'
37 # '--eliminate-local-single-block'
38 # '--eliminate-local-single-block'
39 # '--private-to-local'
40 # '--combine-access-chains'
41 # '--reduce-load-size'
43 # '--eliminate-dead-branches'
46 # '--eliminate-local-single-store'
47 # '--redundancy-elimination'
48 # '--inline-entry-points-exhaustive'
49 # '--reduce-load-size'
50 # '--simplify-instructions'
51 # '--eliminate-dead-inserts'
52 # '--eliminate-dead-code-aggressive'
54 # '--eliminate-dead-inserts'
55 # spirv-opt commit hash: 7afbc0c8be3f4dd48a7e521deb18f5c29a6c9892
59 SHADER vertex reference_vertex_shader PASSTHROUGH
61 # reference_fragment_shader is derived from the following GLSL:
63 # precision highp float;
65 # precision highp int;
67 # layout(location = 0) out vec4 _GLF_color;
69 # layout(set = 0, binding = 0) uniform buf0
73 # float compute_value(float limit, float thirty_two)
75 # float result = -0.5;
76 # for (int i = 1; i < 800; i++)
84 # if (mod(float(i), round(thirty_two)) <= 0.01)
89 # if (float(i) >= limit)
98 # vec3 c = vec3(7.0, 8.0, 9.0);
99 # float thirty_two = round(resolution.x / 8.0);
100 # c.x = compute_value(gl_FragCoord.x, thirty_two);
101 # c.y = compute_value(gl_FragCoord.y, thirty_two);
103 # for (int i = 0; i < 3; i++)
107 # c[i] = c[i] * c[i];
110 # _GLF_color = vec4(normalize(abs(c)), 1.0);
112 SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
115 ; Generator: Khronos Glslang Reference Front End; 10
119 %1 = OpExtInstImport "GLSL.std.450"
120 OpMemoryModel Logical GLSL450
121 OpEntryPoint Fragment %4 "main" %85 %137
122 OpExecutionMode %4 OriginUpperLeft
125 OpName %11 "compute_value(f1;f1;"
127 OpName %10 "thirty_two"
130 OpMemberName %73 0 "resolution"
132 OpName %85 "gl_FragCoord"
137 OpName %137 "_GLF_color"
138 OpMemberDecorate %73 0 Offset 0
140 OpDecorate %75 DescriptorSet 0
141 OpDecorate %75 Binding 0
142 OpDecorate %85 BuiltIn FragCoord
143 OpDecorate %137 Location 0
145 %3 = OpTypeFunction %2
147 %7 = OpTypePointer Function %6
148 %8 = OpTypeFunction %6 %7 %7
149 %14 = OpConstant %6 -0.5
151 %18 = OpConstant %15 1
152 %25 = OpConstant %15 800
154 %29 = OpConstant %15 32
155 %31 = OpConstant %15 0
156 %35 = OpConstant %6 0.400000006
157 %44 = OpConstant %6 0.00999999978
158 %48 = OpConstant %6 100
159 %64 = OpTypeVector %6 3
160 %65 = OpTypePointer Function %64
161 %67 = OpConstant %6 7
162 %68 = OpConstant %6 8
163 %69 = OpConstant %6 9
164 %70 = OpConstantComposite %64 %67 %68 %69
165 %72 = OpTypeVector %6 2
166 %73 = OpTypeStruct %72
167 %74 = OpTypePointer Uniform %73
168 %75 = OpVariable %74 Uniform
170 %77 = OpConstant %76 0
171 %78 = OpTypePointer Uniform %6
172 %83 = OpTypeVector %6 4
173 %84 = OpTypePointer Input %83
174 %85 = OpVariable %84 Input
175 %87 = OpTypePointer Input %6
176 %95 = OpConstant %76 1
177 %107 = OpConstant %76 2
178 %116 = OpConstant %15 3
179 %121 = OpConstant %6 1
180 %136 = OpTypePointer Output %83
181 %137 = OpVariable %136 Output
182 %153 = OpConstant %6 0.125
183 %4 = OpFunction %2 None %3
185 %66 = OpVariable %65 Function
186 %86 = OpVariable %7 Function
187 %90 = OpVariable %7 Function
188 %94 = OpVariable %7 Function
189 %98 = OpVariable %7 Function
191 %79 = OpAccessChain %78 %75 %31 %77
193 %81 = OpFMul %6 %80 %153
194 %82 = OpExtInst %6 %1 Round %81
195 %88 = OpAccessChain %87 %85 %77
199 %92 = OpFunctionCall %6 %11 %86 %90
200 %93 = OpAccessChain %7 %66 %77
202 %96 = OpAccessChain %87 %85 %95
206 %100 = OpFunctionCall %6 %11 %94 %98
207 %101 = OpAccessChain %7 %66 %95
210 %105 = OpLoad %6 %101
211 %106 = OpFAdd %6 %103 %105
212 %108 = OpAccessChain %7 %66 %107
216 %145 = OpPhi %15 %31 %5 %135 %113
217 %117 = OpSLessThan %26 %145 %116
218 OpLoopMerge %112 %113 None
219 OpBranchConditional %117 %111 %112
221 %119 = OpAccessChain %7 %66 %145
222 %120 = OpLoad %6 %119
223 %122 = OpFOrdGreaterThanEqual %26 %120 %121
224 OpSelectionMerge %124 None
225 OpBranchConditional %122 %123 %124
227 %128 = OpLoad %6 %119
228 %131 = OpLoad %6 %119
229 %132 = OpFMul %6 %128 %131
235 %135 = OpIAdd %15 %145 %18
238 %138 = OpLoad %64 %66
239 %139 = OpExtInst %64 %1 FAbs %138
240 %140 = OpExtInst %64 %1 Normalize %139
241 %141 = OpCompositeExtract %6 %140 0
242 %142 = OpCompositeExtract %6 %140 1
243 %143 = OpCompositeExtract %6 %140 2
244 %144 = OpCompositeConstruct %83 %141 %142 %143 %121
248 %11 = OpFunction %6 None %8
249 %9 = OpFunctionParameter %7
250 %10 = OpFunctionParameter %7
254 %148 = OpPhi %6 %14 %12 %151 %22
255 %147 = OpPhi %15 %18 %12 %60 %22
256 %27 = OpSLessThan %26 %147 %25
257 OpLoopMerge %21 %22 None
258 OpBranchConditional %27 %20 %21
260 %30 = OpSMod %15 %147 %29
261 %32 = OpIEqual %26 %30 %31
262 OpSelectionMerge %34 None
263 OpBranchConditional %32 %33 %38
265 %37 = OpFAdd %6 %148 %35
268 %40 = OpConvertSToF %6 %147
270 %42 = OpExtInst %6 %1 Round %41
271 %43 = OpFMod %6 %40 %42
272 %45 = OpFOrdLessThanEqual %26 %43 %44
273 OpSelectionMerge %47 None
274 OpBranchConditional %45 %46 %47
276 %50 = OpFAdd %6 %148 %48
279 %152 = OpPhi %6 %148 %38 %50 %46
282 %151 = OpPhi %6 %37 %33 %152 %47
283 %52 = OpConvertSToF %6 %147
285 %54 = OpFOrdGreaterThanEqual %26 %52 %53
286 OpSelectionMerge %56 None
287 OpBranchConditional %54 %55 %56
293 %60 = OpIAdd %15 %147 %18
300 # uniforms for reference
303 BUFFER reference_resolution DATA_TYPE vec2<float> DATA
307 BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
309 PIPELINE graphics reference_pipeline
310 ATTACH reference_vertex_shader
311 ATTACH reference_fragment_shader
312 FRAMEBUFFER_SIZE 256 256
313 BIND BUFFER reference_framebuffer AS color LOCATION 0
314 BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
316 CLEAR_COLOR reference_pipeline 0 0 0 255
318 CLEAR reference_pipeline
319 RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
322 SHADER vertex variant_vertex_shader PASSTHROUGH
324 # variant_fragment_shader is derived from the following GLSL:
326 # precision highp float;
328 # precision highp int;
330 # layout(location = 0) out vec4 _GLF_color;
332 # layout(set = 0, binding = 0) uniform buf0
336 # layout(set = 0, binding = 1) uniform buf1
338 # vec2 injectionSwitch; //x == 0.0, y == 1.0
341 # float compute_value(float limit, float thirty_two)
343 # float result = -0.5;
344 # for (int i = 1; i < 800; i++)
352 # if (mod(float(i), round(thirty_two)) <= 0.01)
357 # if (float(i) >= limit)
366 # vec3 c = vec3(7.0, 8.0, 9.0);
367 # float thirty_two = round(resolution.x / 8.0);
368 # c.x = compute_value(gl_FragCoord.x, thirty_two);
369 # c.y = compute_value(gl_FragCoord.y, thirty_two);
370 # // Always true, x / 1 = x, end result should be same as the reference result.
371 # c.z = c.x + (true ? ((c) / 1.0) : (vec3(1.0))).y;
372 # for (int i = 0; i < 3; i++)
377 # if ((injectionSwitch.x > injectionSwitch.y))
381 # c[i] = c[i] * c[i];
384 # _GLF_color = vec4(normalize(abs(c)), 1.0);
386 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
389 ; Generator: Khronos Glslang Reference Front End; 10
393 %1 = OpExtInstImport "GLSL.std.450"
394 OpMemoryModel Logical GLSL450
395 OpEntryPoint Fragment %4 "main" %85 %157
396 OpExecutionMode %4 OriginUpperLeft
399 OpName %11 "compute_value(f1;f1;"
401 OpName %10 "thirty_two"
404 OpMemberName %73 0 "resolution"
406 OpName %85 "gl_FragCoord"
412 OpMemberName %134 0 "injectionSwitch"
414 OpName %157 "_GLF_color"
415 OpMemberDecorate %73 0 Offset 0
417 OpDecorate %75 DescriptorSet 0
418 OpDecorate %75 Binding 0
419 OpDecorate %85 BuiltIn FragCoord
420 OpMemberDecorate %134 0 Offset 0
421 OpDecorate %134 Block
422 OpDecorate %136 DescriptorSet 0
423 OpDecorate %136 Binding 1
424 OpDecorate %157 Location 0
426 %3 = OpTypeFunction %2
428 %7 = OpTypePointer Function %6
429 %8 = OpTypeFunction %6 %7 %7
430 %14 = OpConstant %6 -0.5
432 %18 = OpConstant %15 1
433 %25 = OpConstant %15 800
435 %29 = OpConstant %15 32
436 %31 = OpConstant %15 0
437 %35 = OpConstant %6 0.400000006
438 %44 = OpConstant %6 0.00999999978
439 %48 = OpConstant %6 100
440 %64 = OpTypeVector %6 3
441 %65 = OpTypePointer Function %64
442 %67 = OpConstant %6 7
443 %68 = OpConstant %6 8
444 %69 = OpConstant %6 9
445 %70 = OpConstantComposite %64 %67 %68 %69
446 %72 = OpTypeVector %6 2
447 %73 = OpTypeStruct %72
448 %74 = OpTypePointer Uniform %73
449 %75 = OpVariable %74 Uniform
451 %77 = OpConstant %76 0
452 %78 = OpTypePointer Uniform %6
453 %83 = OpTypeVector %6 4
454 %84 = OpTypePointer Input %83
455 %85 = OpVariable %84 Input
456 %87 = OpTypePointer Input %6
457 %95 = OpConstant %76 1
458 %109 = OpConstant %6 1
459 %117 = OpConstant %76 2
460 %126 = OpConstant %15 3
461 %134 = OpTypeStruct %72
462 %135 = OpTypePointer Uniform %134
463 %136 = OpVariable %135 Uniform
464 %156 = OpTypePointer Output %83
465 %157 = OpVariable %156 Output
466 %173 = OpConstant %6 0.125
467 %4 = OpFunction %2 None %3
469 %66 = OpVariable %65 Function
470 %86 = OpVariable %7 Function
471 %90 = OpVariable %7 Function
472 %94 = OpVariable %7 Function
473 %98 = OpVariable %7 Function
474 %105 = OpVariable %65 Function
476 %79 = OpAccessChain %78 %75 %31 %77
478 %81 = OpFMul %6 %80 %173
479 %82 = OpExtInst %6 %1 Round %81
480 %88 = OpAccessChain %87 %85 %77
484 %92 = OpFunctionCall %6 %11 %86 %90
485 %93 = OpAccessChain %7 %66 %77
487 %96 = OpAccessChain %87 %85 %95
491 %100 = OpFunctionCall %6 %11 %94 %98
492 %101 = OpAccessChain %7 %66 %95
495 %108 = OpLoad %64 %66
497 %114 = OpAccessChain %7 %105 %95
498 %115 = OpLoad %6 %114
499 %116 = OpFAdd %6 %103 %115
500 %118 = OpAccessChain %7 %66 %117
504 %165 = OpPhi %15 %31 %5 %155 %123
505 %127 = OpSLessThan %26 %165 %126
506 OpLoopMerge %122 %123 None
507 OpBranchConditional %127 %121 %122
509 %129 = OpAccessChain %7 %66 %165
510 %130 = OpLoad %6 %129
511 %131 = OpFOrdGreaterThanEqual %26 %130 %109
512 OpSelectionMerge %133 None
513 OpBranchConditional %131 %132 %133
515 %137 = OpAccessChain %78 %136 %31 %77
516 %138 = OpLoad %6 %137
517 %139 = OpAccessChain %78 %136 %31 %95
518 %140 = OpLoad %6 %139
519 %141 = OpFOrdGreaterThan %26 %138 %140
520 OpSelectionMerge %143 None
521 OpBranchConditional %141 %142 %143
525 %148 = OpLoad %6 %129
526 %151 = OpLoad %6 %129
527 %152 = OpFMul %6 %148 %151
533 %155 = OpIAdd %15 %165 %18
536 %158 = OpLoad %64 %66
537 %159 = OpExtInst %64 %1 FAbs %158
538 %160 = OpExtInst %64 %1 Normalize %159
539 %161 = OpCompositeExtract %6 %160 0
540 %162 = OpCompositeExtract %6 %160 1
541 %163 = OpCompositeExtract %6 %160 2
542 %164 = OpCompositeConstruct %83 %161 %162 %163 %109
546 %11 = OpFunction %6 None %8
547 %9 = OpFunctionParameter %7
548 %10 = OpFunctionParameter %7
552 %168 = OpPhi %6 %14 %12 %171 %22
553 %167 = OpPhi %15 %18 %12 %60 %22
554 %27 = OpSLessThan %26 %167 %25
555 OpLoopMerge %21 %22 None
556 OpBranchConditional %27 %20 %21
558 %30 = OpSMod %15 %167 %29
559 %32 = OpIEqual %26 %30 %31
560 OpSelectionMerge %34 None
561 OpBranchConditional %32 %33 %38
563 %40 = OpConvertSToF %6 %167
565 %42 = OpExtInst %6 %1 Round %41
566 %43 = OpFMod %6 %40 %42
567 %45 = OpFOrdLessThanEqual %26 %43 %44
568 OpSelectionMerge %47 None
569 OpBranchConditional %45 %46 %47
571 %50 = OpFAdd %6 %168 %48
574 %172 = OpPhi %6 %168 %38 %50 %46
577 %37 = OpFAdd %6 %168 %35
580 %171 = OpPhi %6 %37 %33 %172 %47
581 %52 = OpConvertSToF %6 %167
583 %54 = OpFOrdGreaterThanEqual %26 %52 %53
584 OpSelectionMerge %56 None
585 OpBranchConditional %54 %55 %56
591 %60 = OpIAdd %15 %167 %18
598 # uniforms for variant
601 BUFFER variant_resolution DATA_TYPE vec2<float> DATA
605 BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
609 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
611 PIPELINE graphics variant_pipeline
612 ATTACH variant_vertex_shader
613 ATTACH variant_fragment_shader
614 FRAMEBUFFER_SIZE 256 256
615 BIND BUFFER variant_framebuffer AS color LOCATION 0
616 BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
617 BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 1
619 CLEAR_COLOR variant_pipeline 0 0 0 255
621 CLEAR variant_pipeline
622 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
624 EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005