#!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 floating point 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 _int_0 _GLF_uniform_int_values[1]
# #define _float_0_0 _GLF_uniform_float_values[0]
#
# precision highp float;
#
# // Contents of _GLF_uniform_float_values: 0.0
# layout(set = 0, binding = 0) uniform buf0
# {
#     float _GLF_uniform_float_values[1];
# };
#
# // Contents of _GLF_uniform_int_values: [1, 0]
# layout(set = 0, binding = 1) uniform buf1
# {
#     int _GLF_uniform_int_values[3];
# };
# layout(location = 0) out vec4 _GLF_color;
#
# void main()
# {
#     // This results in an undefined value, but not in undefined behavior.
#     float undefined = mod(5.0, 0.0);
#     if (_int_1 == (_int_1 + _int_0) || undefined > _float_0_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; 8
; Bound: 68
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %49
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %8 "undefined"
               OpName %17 "buf1"
               OpMemberName %17 0 "_GLF_uniform_int_values"
               OpName %19 ""
               OpName %37 "buf0"
               OpMemberName %37 0 "_GLF_uniform_float_values"
               OpName %39 ""
               OpName %49 "_GLF_color"
               OpDecorate %16 ArrayStride 16
               OpMemberDecorate %17 0 RelaxedPrecision
               OpMemberDecorate %17 0 Offset 0
               OpDecorate %17 Block
               OpDecorate %19 DescriptorSet 0
               OpDecorate %19 Binding 1
               OpDecorate %23 RelaxedPrecision
               OpDecorate %25 RelaxedPrecision
               OpDecorate %28 RelaxedPrecision
               OpDecorate %29 RelaxedPrecision
               OpDecorate %36 ArrayStride 16
               OpMemberDecorate %37 0 Offset 0
               OpDecorate %37 Block
               OpDecorate %39 DescriptorSet 0
               OpDecorate %39 Binding 0
               OpDecorate %49 Location 0
               OpDecorate %51 RelaxedPrecision
               OpDecorate %54 RelaxedPrecision
               OpDecorate %57 RelaxedPrecision
               OpDecorate %60 RelaxedPrecision
               OpDecorate %65 RelaxedPrecision
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeFloat 32
          %7 = OpTypePointer Function %6
          %9 = OpConstant %6 5
         %10 = OpConstant %6 0
         %12 = OpTypeBool
         %13 = OpTypeInt 32 1
         %14 = OpTypeInt 32 0
         %15 = OpConstant %14 3
         %16 = OpTypeArray %13 %15
         %17 = OpTypeStruct %16
         %18 = OpTypePointer Uniform %17
         %19 = OpVariable %18 Uniform
         %20 = OpConstant %13 0
         %21 = OpTypePointer Uniform %13
         %26 = OpConstant %13 1
         %35 = OpConstant %14 1
         %36 = OpTypeArray %6 %35
         %37 = OpTypeStruct %36
         %38 = OpTypePointer Uniform %37
         %39 = OpVariable %38 Uniform
         %40 = OpTypePointer Uniform %6
         %47 = OpTypeVector %6 4
         %48 = OpTypePointer Output %47
         %49 = OpVariable %48 Output
          %4 = OpFunction %2 None %3
          %5 = OpLabel
          %8 = OpVariable %7 Function
         %11 = OpFMod %6 %9 %10
               OpStore %8 %11
         %22 = OpAccessChain %21 %19 %20 %20
         %23 = OpLoad %13 %22
         %24 = OpAccessChain %21 %19 %20 %20
         %25 = OpLoad %13 %24
         %27 = OpAccessChain %21 %19 %20 %26
         %28 = OpLoad %13 %27
         %29 = OpIAdd %13 %25 %28
         %30 = OpIEqual %12 %23 %29
         %31 = OpLogicalNot %12 %30
               OpSelectionMerge %33 None
               OpBranchConditional %31 %32 %33
         %32 = OpLabel
         %34 = OpLoad %6 %8
         %41 = OpAccessChain %40 %39 %20 %20
         %42 = OpLoad %6 %41
         %43 = OpFOrdGreaterThan %12 %34 %42
               OpBranch %33
         %33 = OpLabel
         %44 = OpPhi %12 %30 %5 %43 %32
               OpSelectionMerge %46 None
               OpBranchConditional %44 %45 %63
         %45 = OpLabel
         %50 = OpAccessChain %21 %19 %20 %20
         %51 = OpLoad %13 %50
         %52 = OpConvertSToF %6 %51
         %53 = OpAccessChain %21 %19 %20 %26
         %54 = OpLoad %13 %53
         %55 = OpConvertSToF %6 %54
         %56 = OpAccessChain %21 %19 %20 %26
         %57 = OpLoad %13 %56
         %58 = OpConvertSToF %6 %57
         %59 = OpAccessChain %21 %19 %20 %20
         %60 = OpLoad %13 %59
         %61 = OpConvertSToF %6 %60
         %62 = OpCompositeConstruct %47 %52 %55 %58 %61
               OpStore %49 %62
               OpBranch %46
         %63 = OpLabel
         %64 = OpAccessChain %21 %19 %20 %26
         %65 = OpLoad %13 %64
         %66 = OpConvertSToF %6 %65
         %67 = OpCompositeConstruct %47 %66 %66 %66 %66
               OpStore %49 %67
               OpBranch %46
         %46 = OpLabel
               OpReturn
               OpFunctionEnd
END

# uniforms for variant

# _GLF_uniform_int_values
BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
 1 0
END
# _GLF_uniform_float_values
BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
 0.0
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_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 256 256

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