#!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 mem pass 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;
#
# layout(location = 0) out vec4 _GLF_color;
# layout(set = 0, binding = 0) uniform buf0
# {
#     float two;
# };
#
# float func(vec2 v)
# {
#     // Never used in this function.
#     v.x = two;
#
#     // Always false.
#     if(v.y < 1.0)
#         return 1.0;
#
#     return 5.0;
# }
#
# void main()
# {
#     float f = func(vec2(1));
#
#     if (f == 5.0)
#         _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: 52
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %47
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %11 "func(vf2;"
               OpName %10 "v"
               OpName %13 "buf0"
               OpMemberName %13 0 "two"
               OpName %15 ""
               OpName %37 "f"
               OpName %39 "param"
               OpName %47 "_GLF_color"
               OpMemberDecorate %13 0 Offset 0
               OpDecorate %13 Block
               OpDecorate %15 DescriptorSet 0
               OpDecorate %15 Binding 0
               OpDecorate %47 Location 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeFloat 32
          %7 = OpTypeVector %6 2
          %8 = OpTypePointer Function %7
          %9 = OpTypeFunction %6 %8
         %13 = OpTypeStruct %6
         %14 = OpTypePointer Uniform %13
         %15 = OpVariable %14 Uniform
         %16 = OpTypeInt 32 1
         %17 = OpConstant %16 0
         %18 = OpTypePointer Uniform %6
         %21 = OpTypeInt 32 0
         %22 = OpConstant %21 0
         %23 = OpTypePointer Function %6
         %25 = OpConstant %21 1
         %28 = OpConstant %6 1
         %29 = OpTypeBool
         %34 = OpConstant %6 5
         %38 = OpConstantComposite %7 %28 %28
         %45 = OpTypeVector %6 4
         %46 = OpTypePointer Output %45
         %47 = OpVariable %46 Output
         %48 = OpConstant %6 0
         %49 = OpConstantComposite %45 %28 %48 %48 %28
         %51 = OpConstantComposite %45 %48 %48 %48 %48
          %4 = OpFunction %2 None %3
          %5 = OpLabel
         %37 = OpVariable %23 Function
         %39 = OpVariable %8 Function
               OpStore %39 %38
         %40 = OpFunctionCall %6 %11 %39
               OpStore %37 %40
         %41 = OpLoad %6 %37
         %42 = OpFOrdEqual %29 %41 %34
               OpSelectionMerge %44 None
               OpBranchConditional %42 %43 %50
         %43 = OpLabel
               OpStore %47 %49
               OpBranch %44
         %50 = OpLabel
               OpStore %47 %51
               OpBranch %44
         %44 = OpLabel
               OpReturn
               OpFunctionEnd
         %11 = OpFunction %6 None %9
         %10 = OpFunctionParameter %8
         %12 = OpLabel
         %19 = OpAccessChain %18 %15 %17
         %20 = OpLoad %6 %19
         %24 = OpAccessChain %23 %10 %22
               OpStore %24 %20
         %26 = OpAccessChain %23 %10 %25
         %27 = OpLoad %6 %26
         %30 = OpFOrdLessThan %29 %27 %28
               OpSelectionMerge %32 None
               OpBranchConditional %30 %31 %32
         %31 = OpLabel
               OpReturnValue %28
         %32 = OpLabel
               OpReturnValue %34
               OpFunctionEnd
END

# uniforms for variant

# two
BUFFER variant_two DATA_TYPE float DATA
 2.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_two 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
