#!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: Covers a specific schedule dag register reduction list code path

# 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 _float_0_0446 _GLF_uniform_float_values[0]
# #define _float_0_0448 _GLF_uniform_float_values[1]
# #define _float_4_6 _GLF_uniform_float_values[2]
# #define _float_1_0 _GLF_uniform_float_values[3]
# #define _float_0_0 _GLF_uniform_float_values[4]
#
# precision highp float;
#
# // Contents of _GLF_uniform_float_values: [0.0446, 0.0448, 4.6, 1.0, 0.0]
# layout(set = 0, binding = 0) uniform buf0
# {
#     float _GLF_uniform_float_values[5];
# };
#
# layout(location = 0) out vec4 _GLF_color;
#
# void main()
# {
#     // a becomes 4.6.
#     float a = mix(_float_4_6, _float_1_0, _float_1_0 > _float_4_6);
#
#     float b = cos(log(a));
#
#     _GLF_color = vec4(b);
#
#     if (b > _float_0_0446 && b < _float_0_0448)
#     {
#         _GLF_color = vec4(_float_1_0, _float_0_0, _float_0_0, _float_1_0);
#     }
# }
SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 64
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %37
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %8 "a"
               OpName %12 "buf0"
               OpMemberName %12 0 "_GLF_uniform_float_values"
               OpName %14 ""
               OpName %31 "b"
               OpName %37 "_GLF_color"
               OpDecorate %11 ArrayStride 16
               OpMemberDecorate %12 0 Offset 0
               OpDecorate %12 Block
               OpDecorate %14 DescriptorSet 0
               OpDecorate %14 Binding 0
               OpDecorate %37 Location 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeFloat 32
          %7 = OpTypePointer Function %6
          %9 = OpTypeInt 32 0
         %10 = OpConstant %9 5
         %11 = OpTypeArray %6 %10
         %12 = OpTypeStruct %11
         %13 = OpTypePointer Uniform %12
         %14 = OpVariable %13 Uniform
         %15 = OpTypeInt 32 1
         %16 = OpConstant %15 0
         %17 = OpConstant %15 2
         %18 = OpTypePointer Uniform %6
         %21 = OpConstant %15 3
         %28 = OpTypeBool
         %35 = OpTypeVector %6 4
         %36 = OpTypePointer Output %35
         %37 = OpVariable %36 Output
         %47 = OpConstant %15 1
         %56 = OpConstant %15 4
          %4 = OpFunction %2 None %3
          %5 = OpLabel
          %8 = OpVariable %7 Function
         %31 = OpVariable %7 Function
         %19 = OpAccessChain %18 %14 %16 %17
         %20 = OpLoad %6 %19
         %22 = OpAccessChain %18 %14 %16 %21
         %23 = OpLoad %6 %22
         %24 = OpAccessChain %18 %14 %16 %21
         %25 = OpLoad %6 %24
         %26 = OpAccessChain %18 %14 %16 %17
         %27 = OpLoad %6 %26
         %29 = OpFOrdGreaterThan %28 %25 %27
         %30 = OpSelect %6 %29 %23 %20
               OpStore %8 %30
         %32 = OpLoad %6 %8
         %33 = OpExtInst %6 %1 Log %32
         %34 = OpExtInst %6 %1 Cos %33
               OpStore %31 %34
         %38 = OpLoad %6 %31
         %39 = OpCompositeConstruct %35 %38 %38 %38 %38
               OpStore %37 %39
         %40 = OpLoad %6 %31
         %41 = OpAccessChain %18 %14 %16 %16
         %42 = OpLoad %6 %41
         %43 = OpFOrdGreaterThan %28 %40 %42
               OpSelectionMerge %45 None
               OpBranchConditional %43 %44 %45
         %44 = OpLabel
         %46 = OpLoad %6 %31
         %48 = OpAccessChain %18 %14 %16 %47
         %49 = OpLoad %6 %48
         %50 = OpFOrdLessThan %28 %46 %49
               OpBranch %45
         %45 = OpLabel
         %51 = OpPhi %28 %43 %5 %50 %44
               OpSelectionMerge %53 None
               OpBranchConditional %51 %52 %53
         %52 = OpLabel
         %54 = OpAccessChain %18 %14 %16 %21
         %55 = OpLoad %6 %54
         %57 = OpAccessChain %18 %14 %16 %56
         %58 = OpLoad %6 %57
         %59 = OpAccessChain %18 %14 %16 %56
         %60 = OpLoad %6 %59
         %61 = OpAccessChain %18 %14 %16 %21
         %62 = OpLoad %6 %61
         %63 = OpCompositeConstruct %35 %55 %58 %60 %62
               OpStore %37 %63
               OpBranch %53
         %53 = OpLabel
               OpReturn
               OpFunctionEnd
END

# uniforms for variant

# _GLF_uniform_float_values
BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
 0.0446 0.0448 4.6 1.0 0.0
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_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
