#!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 the GraphicsFuzz project.

# Short description: A fragment shader that calculates modulo of an acosh result

# The test passes because the shader always writes red.

SHADER vertex variant_vertex_shader PASSTHROUGH

# variant_fragment_shader is derived from the following GLSL:
# #version 310 es
# #define _int_0 _GLF_uniform_int_values[0]
# #define _int_1 _GLF_uniform_int_values[1]
# #define _float_2_6 _GLF_uniform_float_values[0]
# #define _float_1_61 _GLF_uniform_float_values[1]
# #define _float_0_1 _GLF_uniform_float_values[2]
#
# precision highp float;
# precision highp int;
#
# // Contents of _GLF_uniform_float_values: [2.6, 1.61, 0.1]
# layout(set = 0, binding = 0) uniform buf0
# {
#     float _GLF_uniform_float_values[3];
# };
#
# // Contents of _GLF_uniform_int_values: [0, 1]
# layout(set = 0, binding = 1) uniform buf1
# {
#     int _GLF_uniform_int_values[2];
# };
#
# layout(location = 0) out vec4 _GLF_color;
#
# void main()
# {
#     float f = mod(acosh(_float_2_6), 7938.0);
#     if (abs(f - _float_1_61) < _float_0_1)
#     {
#         _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
#     }
#     else
#     {
#         _GLF_color = vec4(_int_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: 63
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %38
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %8 "f"
               OpName %12 "buf0"
               OpMemberName %12 0 "_GLF_uniform_float_values"
               OpName %14 ""
               OpName %38 "_GLF_color"
               OpName %41 "buf1"
               OpMemberName %41 0 "_GLF_uniform_int_values"
               OpName %43 ""
               OpDecorate %11 ArrayStride 16
               OpMemberDecorate %12 0 Offset 0
               OpDecorate %12 Block
               OpDecorate %14 DescriptorSet 0
               OpDecorate %14 Binding 0
               OpDecorate %38 Location 0
               OpDecorate %40 ArrayStride 16
               OpMemberDecorate %41 0 Offset 0
               OpDecorate %41 Block
               OpDecorate %43 DescriptorSet 0
               OpDecorate %43 Binding 1
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeFloat 32
          %7 = OpTypePointer Function %6
          %9 = OpTypeInt 32 0
         %10 = OpConstant %9 3
         %11 = OpTypeArray %6 %10
         %12 = OpTypeStruct %11
         %13 = OpTypePointer Uniform %12
         %14 = OpVariable %13 Uniform
         %15 = OpTypeInt 32 1
         %16 = OpConstant %15 0
         %17 = OpTypePointer Uniform %6
         %21 = OpConstant %6 7938
         %24 = OpConstant %15 1
         %29 = OpConstant %15 2
         %32 = OpTypeBool
         %36 = OpTypeVector %6 4
         %37 = OpTypePointer Output %36
         %38 = OpVariable %37 Output
         %39 = OpConstant %9 2
         %40 = OpTypeArray %15 %39
         %41 = OpTypeStruct %40
         %42 = OpTypePointer Uniform %41
         %43 = OpVariable %42 Uniform
         %44 = OpTypePointer Uniform %15
          %4 = OpFunction %2 None %3
          %5 = OpLabel
          %8 = OpVariable %7 Function
         %18 = OpAccessChain %17 %14 %16 %16
         %19 = OpLoad %6 %18
         %20 = OpExtInst %6 %1 Acosh %19
         %22 = OpFMod %6 %20 %21
               OpStore %8 %22
         %23 = OpLoad %6 %8
         %25 = OpAccessChain %17 %14 %16 %24
         %26 = OpLoad %6 %25
         %27 = OpFSub %6 %23 %26
         %28 = OpExtInst %6 %1 FAbs %27
         %30 = OpAccessChain %17 %14 %16 %29
         %31 = OpLoad %6 %30
         %33 = OpFOrdLessThan %32 %28 %31
               OpSelectionMerge %35 None
               OpBranchConditional %33 %34 %58
         %34 = OpLabel
         %45 = OpAccessChain %44 %43 %16 %24
         %46 = OpLoad %15 %45
         %47 = OpConvertSToF %6 %46
         %48 = OpAccessChain %44 %43 %16 %16
         %49 = OpLoad %15 %48
         %50 = OpConvertSToF %6 %49
         %51 = OpAccessChain %44 %43 %16 %16
         %52 = OpLoad %15 %51
         %53 = OpConvertSToF %6 %52
         %54 = OpAccessChain %44 %43 %16 %24
         %55 = OpLoad %15 %54
         %56 = OpConvertSToF %6 %55
         %57 = OpCompositeConstruct %36 %47 %50 %53 %56
               OpStore %38 %57
               OpBranch %35
         %58 = OpLabel
         %59 = OpAccessChain %44 %43 %16 %16
         %60 = OpLoad %15 %59
         %61 = OpConvertSToF %6 %60
         %62 = OpCompositeConstruct %36 %61 %61 %61 %61
               OpStore %38 %62
               OpBranch %35
         %35 = OpLabel
               OpReturn
               OpFunctionEnd
END

# uniforms for variant

# _GLF_uniform_int_values
BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
 0 1
END
# _GLF_uniform_float_values
BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
 2.6 1.61 0.1
END

BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM

PIPELINE graphics variant_pipeline
  ATTACH variant_vertex_shader
  ATTACH variant_fragment_shader
  FRAMEBUFFER_SIZE 16 16
  BIND BUFFER variant_framebuffer AS color LOCATION 0
  BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
  BIND BUFFER variant__GLF_uniform_float_values 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 16 16

EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
