#!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 arbitrary precision float usage.

# 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;
#
# void main()
# {
#     vec4 v = vec4(1, 2, 3, 4);
#     float dist1 = distance(tanh(v), sinh(v) / cosh(v));
#     float dist2 = distance(tanh(v), vec4(0.76159, 0.96403, 0.99505, 0.99933));
#
#     // tanh(v) == sinh(v) / cosh(v). Allow some room for precision errors.
#     if (dist1 < 0.1 && dist2 < 0.1)
#         _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: 49
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %44
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %9 "v"
               OpName %16 "dist1"
               OpName %25 "dist2"
               OpName %44 "_GLF_color"
               OpDecorate %44 Location 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeFloat 32
          %7 = OpTypeVector %6 4
          %8 = OpTypePointer Function %7
         %10 = OpConstant %6 1
         %11 = OpConstant %6 2
         %12 = OpConstant %6 3
         %13 = OpConstant %6 4
         %14 = OpConstantComposite %7 %10 %11 %12 %13
         %15 = OpTypePointer Function %6
         %28 = OpConstant %6 0.761590004
         %29 = OpConstant %6 0.964030027
         %30 = OpConstant %6 0.995050013
         %31 = OpConstant %6 0.999329984
         %32 = OpConstantComposite %7 %28 %29 %30 %31
         %35 = OpConstant %6 0.100000001
         %36 = OpTypeBool
         %43 = OpTypePointer Output %7
         %44 = OpVariable %43 Output
         %45 = OpConstant %6 0
         %46 = OpConstantComposite %7 %10 %45 %45 %10
         %48 = OpConstantComposite %7 %45 %45 %45 %45
          %4 = OpFunction %2 None %3
          %5 = OpLabel
          %9 = OpVariable %8 Function
         %16 = OpVariable %15 Function
         %25 = OpVariable %15 Function
               OpStore %9 %14
         %17 = OpLoad %7 %9
         %18 = OpExtInst %7 %1 Tanh %17
         %19 = OpLoad %7 %9
         %20 = OpExtInst %7 %1 Sinh %19
         %21 = OpLoad %7 %9
         %22 = OpExtInst %7 %1 Cosh %21
         %23 = OpFDiv %7 %20 %22
         %24 = OpExtInst %6 %1 Distance %18 %23
               OpStore %16 %24
         %26 = OpLoad %7 %9
         %27 = OpExtInst %7 %1 Tanh %26
         %33 = OpExtInst %6 %1 Distance %27 %32
               OpStore %25 %33
         %34 = OpLoad %6 %16
         %37 = OpFOrdLessThan %36 %34 %35
         %38 = OpLoad %6 %25
         %39 = OpFOrdLessThan %36 %38 %35
         %40 = OpLogicalAnd %36 %37 %39
               OpSelectionMerge %42 None
               OpBranchConditional %40 %41 %47
         %41 = OpLabel
               OpStore %44 %46
               OpBranch %42
         %47 = OpLabel
               OpStore %44 %48
               OpBranch %42
         %42 = OpLabel
               OpReturn
               OpFunctionEnd
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
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
