#!amber

# Copyright 2018 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 bug found by GraphicsFuzz.

# A fragment shader with somewhat complex control flow and a switch.
# Derived from the following GLSL fragment shader.
# We check that all pixels are red. The test passes because the final
# statement writes red to _GLF_color and there are no discard statements.

# #version 310 es
#
# precision highp float;
# precision highp int;
#
# layout(set = 0, binding = 0) uniform buf0 {
#  vec2 injectionSwitch;
# };
# layout(location=0) out vec4 _GLF_color;
#
# struct S {
#  bool ok;
# };
#
# bool g()
# {
#  for(
#      int i = 0;
#      i < 1;
#      i++
#  )
#   {
#    switch(int(injectionSwitch.x))
#     {
#      case 9:
#      S a = S(bool(injectionSwitch.x));
#      S b = a;
#      case 42:
#      if(b.ok)
#       {
#        return true;
#       }
#       default:
#       break;
#     }
#   }
#  return true;
# }
# vec3 f()
# {
#  {
#   S a = S(bool(injectionSwitch.x));
#   if(a.ok)
#    {
#     return vec3(0.0);
#    }
#   if(g())
#    {
#     return vec3(1.0);
#    }
#  }
#  return vec3(1.0);
# }
# void main()
# {
#  _GLF_color = vec4(f(), 1.0);
#  // always true at runtime
#  if (injectionSwitch.x == 0.0) {
#   _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
#  }
# }

SHADER vertex variant_vertex_shader PASSTHROUGH

SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
; SPIR-V
; Version: 1.0
; Generator: Khronos SPIR-V Tools Assembler; 0
; Bound: 73
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %2 "main" %3
               OpExecutionMode %2 OriginUpperLeft
               OpSource ESSL 310
               OpName %2 "main"
               OpName %4 "buf0"
               OpMemberName %4 0 "injectionSwitch"
               OpName %5 ""
               OpName %3 "_GLF_color"
               OpMemberDecorate %4 0 Offset 0
               OpDecorate %4 Block
               OpDecorate %5 DescriptorSet 0
               OpDecorate %5 Binding 0
               OpDecorate %3 Location 0
          %6 = OpTypeVoid
          %7 = OpTypeFunction %6
          %8 = OpTypeBool
          %9 = OpTypeFloat 32
         %10 = OpTypeVector %9 3
         %11 = OpTypeInt 32 1
         %12 = OpConstant %11 0
         %13 = OpConstant %11 1
         %14 = OpTypeVector %9 2
          %4 = OpTypeStruct %14
         %15 = OpTypePointer Uniform %4
          %5 = OpVariable %15 Uniform
         %16 = OpTypeInt 32 0
         %17 = OpConstant %16 0
         %18 = OpTypePointer Uniform %9
         %19 = OpConstant %9 0
         %20 = OpConstantTrue %8
         %21 = OpConstantComposite %10 %19 %19 %19
         %22 = OpConstant %9 1
         %23 = OpConstantComposite %10 %22 %22 %22
         %24 = OpTypeVector %9 4
         %25 = OpTypePointer Output %24
          %3 = OpVariable %25 Output
         %26 = OpConstantComposite %24 %22 %19 %19 %22
         %27 = OpConstantFalse %8
         %28 = OpUndef %8
          %2 = OpFunction %6 None %7
         %29 = OpLabel
               OpBranch %30
         %30 = OpLabel
               OpLoopMerge %31 %32 None
               OpBranch %33
         %33 = OpLabel
         %34 = OpAccessChain %18 %5 %12 %17
         %35 = OpLoad %9 %34
         %36 = OpFOrdNotEqual %8 %35 %19
               OpSelectionMerge %37 None
               OpBranchConditional %36 %38 %37
         %38 = OpLabel
               OpBranch %31
         %37 = OpLabel
               OpBranch %39
         %39 = OpLabel
               OpLoopMerge %40 %41 None
               OpBranch %42
         %42 = OpLabel
         %43 = OpPhi %8 %28 %39 %44 %72
         %46 = OpPhi %11 %12 %39 %47 %72
         %48 = OpSLessThan %8 %46 %13
               OpLoopMerge %49 %72 None
               OpBranchConditional %48 %50 %49
         %50 = OpLabel
         %51 = OpConvertFToS %11 %35
               OpSelectionMerge %52 None
               OpSwitch %51 %45 9 %53 42 %54
         %52 = OpLabel
               OpBranch %72
         %45 = OpLabel
         %44 = OpPhi %8 %43 %50 %55 %56
         %47 = OpIAdd %11 %46 %13
               OpBranch %72
         %72 = OpLabel
               OpBranch %42
         %53 = OpLabel
               OpBranch %54
         %54 = OpLabel
         %55 = OpPhi %8 %43 %50 %36 %53
               OpSelectionMerge %56 None
               OpBranchConditional %55 %57 %56
         %57 = OpLabel
               OpBranch %49
         %56 = OpLabel
               OpBranch %45
         %49 = OpLabel
         %58 = OpPhi %8 %28 %42 %20 %57
         %59 = OpPhi %8 %27 %42 %20 %57
               OpSelectionMerge %60 None
               OpBranchConditional %59 %40 %60
         %60 = OpLabel
               OpBranch %40
         %41 = OpLabel
               OpBranch %39
         %40 = OpLabel
         %61 = OpPhi %8 %58 %49 %20 %60
               OpSelectionMerge %62 None
               OpBranchConditional %61 %63 %62
         %63 = OpLabel
               OpBranch %31
         %62 = OpLabel
               OpBranch %31
         %32 = OpLabel
               OpBranch %30
         %31 = OpLabel
         %64 = OpPhi %10 %21 %38 %23 %63 %23 %62
         %65 = OpCompositeExtract %9 %64 0
         %66 = OpCompositeExtract %9 %64 1
         %67 = OpCompositeExtract %9 %64 2
         %68 = OpCompositeConstruct %24 %65 %66 %67 %22
               OpStore %3 %68
         %69 = OpFOrdEqual %8 %35 %19
               OpSelectionMerge %70 None
               OpBranchConditional %69 %71 %70
         %71 = OpLabel
               OpStore %3 %26
               OpBranch %70
         %70 = OpLabel
               OpReturn
               OpFunctionEnd
END


# uniforms for variant

# injectionSwitch
BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
 0.0 1.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_injectionSwitch 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
