#!amber

# Copyright 2021 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 specific LLVM code paths

# 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 320 es
# #define _int_0 _GLF_uniform_int_values[0]
# #define _int_1 _GLF_uniform_int_values[1]
# #define _float_0_0 _GLF_uniform_float_values[0]
# #define _float_1_0 _GLF_uniform_float_values[1]
#
# precision highp float;
# precision highp int;
#
# // Contents of _GLF_uniform_int_values: [0, 1]
# layout(set = 0, binding = 0) uniform buf0
# {
#     int _GLF_uniform_int_values[2];
# };
#
# // Contents of _GLF_uniform_float_values: [0.0, 1.0]
# layout(set = 0, binding = 1) uniform buf1
# {
#     float _GLF_uniform_float_values[2];
# };
#
# layout(location = 0) out vec4 _GLF_color;
#
# // Contents of zero: 0
# layout(set = 0, binding = 2) uniform buf2
# {
#     int zero;
# };
#
# void main()
# {
#     // Results are undefined.
#     float f = pow(- _float_1_0, sinh(1.0));
#
#     // The value of f doesn't matter because the right side is always true.
#     if(f == _float_0_0 || zero == _int_0)
#     {
#         _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; 10
; Bound: 70
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %51
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 320
               OpName %4 "main"
               OpName %8 "f"
               OpName %12 "buf1"
               OpMemberName %12 0 "_GLF_uniform_float_values"
               OpName %14 ""
               OpName %33 "buf2"
               OpMemberName %33 0 "zero"
               OpName %35 ""
               OpName %40 "buf0"
               OpMemberName %40 0 "_GLF_uniform_int_values"
               OpName %42 ""
               OpName %51 "_GLF_color"
               OpDecorate %11 ArrayStride 16
               OpMemberDecorate %12 0 Offset 0
               OpDecorate %12 Block
               OpDecorate %14 DescriptorSet 0
               OpDecorate %14 Binding 1
               OpMemberDecorate %33 0 Offset 0
               OpDecorate %33 Block
               OpDecorate %35 DescriptorSet 0
               OpDecorate %35 Binding 2
               OpDecorate %39 ArrayStride 16
               OpMemberDecorate %40 0 Offset 0
               OpDecorate %40 Block
               OpDecorate %42 DescriptorSet 0
               OpDecorate %42 Binding 0
               OpDecorate %51 Location 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeFloat 32
          %7 = OpTypePointer Function %6
          %9 = OpTypeInt 32 0
         %10 = OpConstant %9 2
         %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 1
         %18 = OpTypePointer Uniform %6
         %22 = OpConstant %6 1
         %25 = OpTypeBool
         %33 = OpTypeStruct %15
         %34 = OpTypePointer Uniform %33
         %35 = OpVariable %34 Uniform
         %36 = OpTypePointer Uniform %15
         %39 = OpTypeArray %15 %10
         %40 = OpTypeStruct %39
         %41 = OpTypePointer Uniform %40
         %42 = OpVariable %41 Uniform
         %49 = OpTypeVector %6 4
         %50 = OpTypePointer Output %49
         %51 = OpVariable %50 Output
          %4 = OpFunction %2 None %3
          %5 = OpLabel
          %8 = OpVariable %7 Function
         %19 = OpAccessChain %18 %14 %16 %17
         %20 = OpLoad %6 %19
         %21 = OpFNegate %6 %20
         %23 = OpExtInst %6 %1 Sinh %22
         %24 = OpExtInst %6 %1 Pow %21 %23
               OpStore %8 %24
         %26 = OpLoad %6 %8
         %27 = OpAccessChain %18 %14 %16 %16
         %28 = OpLoad %6 %27
         %29 = OpFOrdEqual %25 %26 %28
         %30 = OpLogicalNot %25 %29
               OpSelectionMerge %32 None
               OpBranchConditional %30 %31 %32
         %31 = OpLabel
         %37 = OpAccessChain %36 %35 %16
         %38 = OpLoad %15 %37
         %43 = OpAccessChain %36 %42 %16 %16
         %44 = OpLoad %15 %43
         %45 = OpIEqual %25 %38 %44
               OpBranch %32
         %32 = OpLabel
         %46 = OpPhi %25 %29 %5 %45 %31
               OpSelectionMerge %48 None
               OpBranchConditional %46 %47 %65
         %47 = OpLabel
         %52 = OpAccessChain %36 %42 %16 %17
         %53 = OpLoad %15 %52
         %54 = OpConvertSToF %6 %53
         %55 = OpAccessChain %36 %42 %16 %16
         %56 = OpLoad %15 %55
         %57 = OpConvertSToF %6 %56
         %58 = OpAccessChain %36 %42 %16 %16
         %59 = OpLoad %15 %58
         %60 = OpConvertSToF %6 %59
         %61 = OpAccessChain %36 %42 %16 %17
         %62 = OpLoad %15 %61
         %63 = OpConvertSToF %6 %62
         %64 = OpCompositeConstruct %49 %54 %57 %60 %63
               OpStore %51 %64
               OpBranch %48
         %65 = OpLabel
         %66 = OpAccessChain %36 %42 %16 %16
         %67 = OpLoad %15 %66
         %68 = OpConvertSToF %6 %67
         %69 = OpCompositeConstruct %49 %68 %68 %68 %68
               OpStore %51 %69
               OpBranch %48
         %48 = OpLabel
               OpReturn
               OpFunctionEnd
END

# uniforms for variant

# zero
BUFFER variant_zero DATA_TYPE int32 STD140 DATA
 0
END
# _GLF_uniform_float_values
BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
 0.0 1.0
END
# _GLF_uniform_int_values
BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
 0 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_zero AS uniform DESCRIPTOR_SET 0 BINDING 2
  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
