#!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 LLVM analysis code path.

# The test passes because shader always writes red.

SHADER vertex variant_vertex_shader PASSTHROUGH

# variant_fragment_shader is derived from the following GLSL:
# #version 310 es
# precision highp float;
# precision highp int;
#
# layout(location = 0) out vec4 _GLF_color;
#
# layout(set = 0, binding = 0) uniform buf0
# {
#     int three;
# };
#
# void main()
# {
#     int a = 0;
#     for(int i = 0; i < 7 + three; i++)
#     {
#         switch(i)
#         {
#             case 7:
#             case 8:
#                 a++;
#                 break;
#         }
#     }
#
#     if (a == 2) // Always true.
#         _GLF_color = vec4(1, 0, 0, 1);
#     else
#         _GLF_color = vec4(0);
# }
SHADER fragment variant_fragment_shader SPIRV-ASM
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 8
; Bound: 51
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %45
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %8 "a"
               OpName %10 "i"
               OpName %18 "buf0"
               OpMemberName %18 0 "three"
               OpName %20 ""
               OpName %45 "_GLF_color"
               OpMemberDecorate %18 0 Offset 0
               OpDecorate %18 Block
               OpDecorate %20 DescriptorSet 0
               OpDecorate %20 Binding 0
               OpDecorate %45 Location 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeInt 32 1
          %7 = OpTypePointer Function %6
          %9 = OpConstant %6 0
         %17 = OpConstant %6 7
         %18 = OpTypeStruct %6
         %19 = OpTypePointer Uniform %18
         %20 = OpVariable %19 Uniform
         %21 = OpTypePointer Uniform %6
         %25 = OpTypeBool
         %31 = OpConstant %6 1
         %38 = OpConstant %6 2
         %42 = OpTypeFloat 32
         %43 = OpTypeVector %42 4
         %44 = OpTypePointer Output %43
         %45 = OpVariable %44 Output
         %46 = OpConstant %42 1
         %47 = OpConstant %42 0
         %48 = OpConstantComposite %43 %46 %47 %47 %46
         %50 = OpConstantComposite %43 %47 %47 %47 %47
          %4 = OpFunction %2 None %3
          %5 = OpLabel
          %8 = OpVariable %7 Function
         %10 = OpVariable %7 Function
               OpStore %8 %9
               OpStore %10 %9
               OpBranch %11
         %11 = OpLabel
               OpLoopMerge %13 %14 None
               OpBranch %15
         %15 = OpLabel
         %16 = OpLoad %6 %10
         %22 = OpAccessChain %21 %20 %9
         %23 = OpLoad %6 %22
         %24 = OpIAdd %6 %17 %23
         %26 = OpSLessThan %25 %16 %24
               OpBranchConditional %26 %12 %13
         %12 = OpLabel
         %27 = OpLoad %6 %10
               OpSelectionMerge %29 None
               OpSwitch %27 %29 7 %28 8 %28
         %28 = OpLabel
         %30 = OpLoad %6 %8
         %32 = OpIAdd %6 %30 %31
               OpStore %8 %32
               OpBranch %29
         %29 = OpLabel
               OpBranch %14
         %14 = OpLabel
         %35 = OpLoad %6 %10
         %36 = OpIAdd %6 %35 %31
               OpStore %10 %36
               OpBranch %11
         %13 = OpLabel
         %37 = OpLoad %6 %8
         %39 = OpIEqual %25 %37 %38
               OpSelectionMerge %41 None
               OpBranchConditional %39 %40 %49
         %40 = OpLabel
               OpStore %45 %48
               OpBranch %41
         %49 = OpLabel
               OpStore %45 %50
               OpBranch %41
         %41 = OpLabel
               OpReturn
               OpFunctionEnd
END

# uniforms for variant

# three
BUFFER variant_three DATA_TYPE int32 DATA
 3
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
