#!amber

# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


# A test for a coverage-gap found by GraphicsFuzz.

# Short description: A fragment shader that covers a specific return merge path.

# The test passes because shader always writes red.

# Optimized using spirv-opt with the following arguments:
# '--simplify-instructions'
# '--eliminate-dead-branches'
# '--merge-blocks'
# '--private-to-local'
# '--eliminate-local-single-block'
# '--eliminate-local-single-block'
# '--if-conversion'
# '--eliminate-local-multi-store'
# spirv-opt commit hash: 9215c1b7df0029f27807e8c8d7ec80532ce90a87



SHADER vertex variant_vertex_shader PASSTHROUGH

# variant_fragment_shader is derived from the following GLSL:
# #version 310 es
# precision highp float;
#
# layout(location = 0) out vec4 _GLF_color;
# layout(set = 0, binding = 0) uniform buf0
# {
#     float three;
# };
#
# // Always returns 1.0.
# float func()
# {
#     float b = 2.0;
#
#     do
#     {
#         // Always false.
#         if (three == 0.0)
#             break;
#
#         // Always false.
#         if (three == 0.0)
#             return 1.0;
#
#         b = 1.0;
#     }
#     while(false);
#
#     return b;
# }
#
# void main()
# {
#     if (func() == 1.0)
#         _GLF_color = vec4(1, 0, 0, 1);
#     else
#         _GLF_color = vec4(0);
# }
SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 8
; Bound: 54
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %48
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %8 "func("
               OpName %11 "b"
               OpName %17 "buf0"
               OpMemberName %17 0 "three"
               OpName %19 ""
               OpName %48 "_GLF_color"
               OpMemberDecorate %17 0 Offset 0
               OpDecorate %17 Block
               OpDecorate %19 DescriptorSet 0
               OpDecorate %19 Binding 0
               OpDecorate %48 Location 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeFloat 32
          %7 = OpTypeFunction %6
         %10 = OpTypePointer Function %6
         %12 = OpConstant %6 2
         %17 = OpTypeStruct %6
         %18 = OpTypePointer Uniform %17
         %19 = OpVariable %18 Uniform
         %20 = OpTypeInt 32 1
         %21 = OpConstant %20 0
         %22 = OpTypePointer Uniform %6
         %25 = OpConstant %6 0
         %26 = OpTypeBool
         %36 = OpConstant %6 1
         %38 = OpConstantFalse %26
         %46 = OpTypeVector %6 4
         %47 = OpTypePointer Output %46
         %48 = OpVariable %47 Output
         %49 = OpConstantComposite %46 %36 %25 %25 %36
         %51 = OpConstantComposite %46 %25 %25 %25 %25
          %4 = OpFunction %2 None %3
          %5 = OpLabel
         %42 = OpFunctionCall %6 %8
         %43 = OpFOrdEqual %26 %42 %36
               OpSelectionMerge %45 None
               OpBranchConditional %43 %44 %50
         %44 = OpLabel
               OpStore %48 %49
               OpBranch %45
         %50 = OpLabel
               OpStore %48 %51
               OpBranch %45
         %45 = OpLabel
               OpReturn
               OpFunctionEnd
          %8 = OpFunction %6 None %7
          %9 = OpLabel
         %11 = OpVariable %10 Function
               OpStore %11 %12
               OpBranch %13
         %13 = OpLabel
         %53 = OpPhi %6 %12 %9 %36 %16
               OpLoopMerge %15 %16 None
               OpBranch %14
         %14 = OpLabel
         %23 = OpAccessChain %22 %19 %21
         %24 = OpLoad %6 %23
         %27 = OpFOrdEqual %26 %24 %25
               OpSelectionMerge %29 None
               OpBranchConditional %27 %28 %29
         %28 = OpLabel
               OpBranch %15
         %29 = OpLabel
         %31 = OpAccessChain %22 %19 %21
         %32 = OpLoad %6 %31
         %33 = OpFOrdEqual %26 %32 %25
               OpSelectionMerge %35 None
               OpBranchConditional %33 %34 %35
         %34 = OpLabel
               OpReturnValue %36
         %35 = OpLabel
               OpStore %11 %36
               OpBranch %16
         %16 = OpLabel
               OpBranchConditional %38 %13 %15
         %15 = OpLabel
         %52 = OpPhi %6 %53 %28 %36 %16
               OpReturnValue %52
               OpFunctionEnd
END

# uniforms for variant

# three
BUFFER variant_three DATA_TYPE float DATA
 3.0
END

BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM

PIPELINE graphics variant_pipeline
  ATTACH variant_vertex_shader
  ATTACH variant_fragment_shader
  FRAMEBUFFER_SIZE 256 256
  BIND BUFFER variant_framebuffer AS color LOCATION 0
  BIND BUFFER variant_three AS uniform DESCRIPTOR_SET 0 BINDING 0
END
CLEAR_COLOR variant_pipeline 0 0 0 255

CLEAR variant_pipeline
RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256

EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
