#!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 selection DAG 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]
#
# precision highp float;
# precision highp int;
#
# // Contents of _GLF_uniform_int_values: [1, 0]
# layout(set = 0, binding = 0) uniform buf0
# {
#     int _GLF_uniform_int_values[2];
# };
# // Contents of v1: [0.0, 1.0]
# layout(set = 0, binding = 1) uniform buf1
# {
#     vec2 v1;
# };
#
# layout(location = 0) out vec4 _GLF_color;
#
# void main()
# {
#     // Always true.
#     if (v1.x < v1.y)
#     {
#         _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
#
#         // Always false.
#         if (v1.x > v1.y)
#         {
#             _GLF_color = vec4(_int_1);
#         }
#         return;
#     }
#     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: 65
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %27
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %8 "buf1"
               OpMemberName %8 0 "v1"
               OpName %10 ""
               OpName %27 "_GLF_color"
               OpName %30 "buf0"
               OpMemberName %30 0 "_GLF_uniform_int_values"
               OpName %32 ""
               OpMemberDecorate %8 0 Offset 0
               OpDecorate %8 Block
               OpDecorate %10 DescriptorSet 0
               OpDecorate %10 Binding 1
               OpDecorate %27 Location 0
               OpDecorate %29 ArrayStride 16
               OpMemberDecorate %30 0 Offset 0
               OpDecorate %30 Block
               OpDecorate %32 DescriptorSet 0
               OpDecorate %32 Binding 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeFloat 32
          %7 = OpTypeVector %6 2
          %8 = OpTypeStruct %7
          %9 = OpTypePointer Uniform %8
         %10 = OpVariable %9 Uniform
         %11 = OpTypeInt 32 1
         %12 = OpConstant %11 0
         %13 = OpTypeInt 32 0
         %14 = OpConstant %13 0
         %15 = OpTypePointer Uniform %6
         %18 = OpConstant %13 1
         %21 = OpTypeBool
         %25 = OpTypeVector %6 4
         %26 = OpTypePointer Output %25
         %27 = OpVariable %26 Output
         %28 = OpConstant %13 2
         %29 = OpTypeArray %11 %28
         %30 = OpTypeStruct %29
         %31 = OpTypePointer Uniform %30
         %32 = OpVariable %31 Uniform
         %33 = OpTypePointer Uniform %11
         %37 = OpConstant %11 1
          %4 = OpFunction %2 None %3
          %5 = OpLabel
         %16 = OpAccessChain %15 %10 %12 %14
         %17 = OpLoad %6 %16
         %19 = OpAccessChain %15 %10 %12 %18
         %20 = OpLoad %6 %19
         %22 = OpFOrdLessThan %21 %17 %20
               OpSelectionMerge %24 None
               OpBranchConditional %22 %23 %60
         %23 = OpLabel
         %34 = OpAccessChain %33 %32 %12 %12
         %35 = OpLoad %11 %34
         %36 = OpConvertSToF %6 %35
         %38 = OpAccessChain %33 %32 %12 %37
         %39 = OpLoad %11 %38
         %40 = OpConvertSToF %6 %39
         %41 = OpAccessChain %33 %32 %12 %37
         %42 = OpLoad %11 %41
         %43 = OpConvertSToF %6 %42
         %44 = OpAccessChain %33 %32 %12 %12
         %45 = OpLoad %11 %44
         %46 = OpConvertSToF %6 %45
         %47 = OpCompositeConstruct %25 %36 %40 %43 %46
               OpStore %27 %47
         %48 = OpAccessChain %15 %10 %12 %14
         %49 = OpLoad %6 %48
         %50 = OpAccessChain %15 %10 %12 %18
         %51 = OpLoad %6 %50
         %52 = OpFOrdGreaterThan %21 %49 %51
               OpSelectionMerge %54 None
               OpBranchConditional %52 %53 %54
         %53 = OpLabel
         %55 = OpAccessChain %33 %32 %12 %12
         %56 = OpLoad %11 %55
         %57 = OpConvertSToF %6 %56
         %58 = OpCompositeConstruct %25 %57 %57 %57 %57
               OpStore %27 %58
               OpBranch %54
         %54 = OpLabel
               OpReturn
         %60 = OpLabel
         %61 = OpAccessChain %33 %32 %12 %37
         %62 = OpLoad %11 %61
         %63 = OpConvertSToF %6 %62
         %64 = OpCompositeConstruct %25 %63 %63 %63 %63
               OpStore %27 %64
               OpBranch %24
         %24 = OpLabel
               OpReturn
               OpFunctionEnd
END

# uniforms for variant

# v1
BUFFER variant_v1 DATA_TYPE vec2<float> STD140 DATA
 0.0 1.0
END
# _GLF_uniform_int_values
BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
 1 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_v1 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
