#!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 covers a specific peephole optimizer 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 _int_1 _GLF_uniform_int_values[0]
# #define _float_1_2 _GLF_uniform_float_values[0]
# #define _float_0_0 _GLF_uniform_float_values[1]
# #define _float_1_0 _GLF_uniform_float_values[2]
#
# precision highp float;
#
# precision highp int;
#
# // Contents of _GLF_uniform_int_values: 1
# layout(set = 0, binding = 0) uniform buf0
# {
#     int _GLF_uniform_int_values[1];
# };
#
# // Contents of _GLF_uniform_float_values: [1.2, 0.0, 1.0]
# layout(set = 0, binding = 1) uniform buf1
# {
#     float _GLF_uniform_float_values[3];
# };
#
# layout(location = 0) out vec4 _GLF_color;
#
# void main()
# {
#     float a = _float_1_2;
#
#     // Always true.
#     if (!(gl_FragCoord.x < _float_0_0))
#     {
#         // Always true.
#         if (!(gl_FragCoord.x < _float_0_0))
#         {
#             // Always false.
#             if (!(gl_FragCoord.x > _float_0_0))
#             {
#                 discard;
#             }
#             a = _float_1_0;
#         }
#     }
#     _GLF_color = vec4(_int_1, acosh(a), acosh(a), _int_1);
# }
SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 8
; Bound: 74
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %22 %56
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %8 "a"
               OpName %12 "buf1"
               OpMemberName %12 0 "_GLF_uniform_float_values"
               OpName %14 ""
               OpName %22 "gl_FragCoord"
               OpName %56 "_GLF_color"
               OpName %59 "buf0"
               OpMemberName %59 0 "_GLF_uniform_int_values"
               OpName %61 ""
               OpDecorate %11 ArrayStride 16
               OpMemberDecorate %12 0 Offset 0
               OpDecorate %12 Block
               OpDecorate %14 DescriptorSet 0
               OpDecorate %14 Binding 1
               OpDecorate %22 BuiltIn FragCoord
               OpDecorate %56 Location 0
               OpDecorate %58 ArrayStride 16
               OpMemberDecorate %59 0 Offset 0
               OpDecorate %59 Block
               OpDecorate %61 DescriptorSet 0
               OpDecorate %61 Binding 0
          %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
         %20 = OpTypeVector %6 4
         %21 = OpTypePointer Input %20
         %22 = OpVariable %21 Input
         %23 = OpConstant %9 0
         %24 = OpTypePointer Input %6
         %27 = OpConstant %15 1
         %30 = OpTypeBool
         %52 = OpConstant %15 2
         %55 = OpTypePointer Output %20
         %56 = OpVariable %55 Output
         %57 = OpConstant %9 1
         %58 = OpTypeArray %15 %57
         %59 = OpTypeStruct %58
         %60 = OpTypePointer Uniform %59
         %61 = OpVariable %60 Uniform
         %62 = OpTypePointer Uniform %15
          %4 = OpFunction %2 None %3
          %5 = OpLabel
          %8 = OpVariable %7 Function
         %18 = OpAccessChain %17 %14 %16 %16
         %19 = OpLoad %6 %18
               OpStore %8 %19
         %25 = OpAccessChain %24 %22 %23
         %26 = OpLoad %6 %25
         %28 = OpAccessChain %17 %14 %16 %27
         %29 = OpLoad %6 %28
         %31 = OpFOrdLessThan %30 %26 %29
         %32 = OpLogicalNot %30 %31
               OpSelectionMerge %34 None
               OpBranchConditional %32 %33 %34
         %33 = OpLabel
         %35 = OpAccessChain %24 %22 %23
         %36 = OpLoad %6 %35
         %37 = OpAccessChain %17 %14 %16 %27
         %38 = OpLoad %6 %37
         %39 = OpFOrdLessThan %30 %36 %38
         %40 = OpLogicalNot %30 %39
               OpSelectionMerge %42 None
               OpBranchConditional %40 %41 %42
         %41 = OpLabel
         %43 = OpAccessChain %24 %22 %23
         %44 = OpLoad %6 %43
         %45 = OpAccessChain %17 %14 %16 %27
         %46 = OpLoad %6 %45
         %47 = OpFOrdGreaterThan %30 %44 %46
         %48 = OpLogicalNot %30 %47
               OpSelectionMerge %50 None
               OpBranchConditional %48 %49 %50
         %49 = OpLabel
               OpKill
         %50 = OpLabel
         %53 = OpAccessChain %17 %14 %16 %52
         %54 = OpLoad %6 %53
               OpStore %8 %54
               OpBranch %42
         %42 = OpLabel
               OpBranch %34
         %34 = OpLabel
         %63 = OpAccessChain %62 %61 %16 %16
         %64 = OpLoad %15 %63
         %65 = OpConvertSToF %6 %64
         %66 = OpLoad %6 %8
         %67 = OpExtInst %6 %1 Acosh %66
         %68 = OpLoad %6 %8
         %69 = OpExtInst %6 %1 Acosh %68
         %70 = OpAccessChain %62 %61 %16 %16
         %71 = OpLoad %15 %70
         %72 = OpConvertSToF %6 %71
         %73 = OpCompositeConstruct %20 %65 %67 %69 %72
               OpStore %56 %73
               OpReturn
               OpFunctionEnd
END

# uniforms for variant

# _GLF_uniform_float_values
BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
 1.2 0.0 1.0
END
# _GLF_uniform_int_values
BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
 1
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__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
  BIND BUFFER variant__GLF_uniform_int_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 256 256

EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
