#!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 specific instruction simplify and combine compare 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 310 es
# #define _int_0 _GLF_uniform_int_values[0]
# #define _int_1 _GLF_uniform_int_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];
# };
#
# layout(location = 0) out vec4 _GLF_color;
#
# void main()
# {
#     if ((1 >> _int_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: 45
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %26
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %11 "buf0"
               OpMemberName %11 0 "_GLF_uniform_int_values"
               OpName %13 ""
               OpName %26 "_GLF_color"
               OpDecorate %10 ArrayStride 16
               OpMemberDecorate %11 0 Offset 0
               OpDecorate %11 Block
               OpDecorate %13 DescriptorSet 0
               OpDecorate %13 Binding 0
               OpDecorate %26 Location 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeInt 32 1
          %7 = OpConstant %6 1
          %8 = OpTypeInt 32 0
          %9 = OpConstant %8 2
         %10 = OpTypeArray %6 %9
         %11 = OpTypeStruct %10
         %12 = OpTypePointer Uniform %11
         %13 = OpVariable %12 Uniform
         %14 = OpConstant %6 0
         %15 = OpTypePointer Uniform %6
         %19 = OpTypeBool
         %23 = OpTypeFloat 32
         %24 = OpTypeVector %23 4
         %25 = OpTypePointer Output %24
         %26 = OpVariable %25 Output
          %4 = OpFunction %2 None %3
          %5 = OpLabel
         %16 = OpAccessChain %15 %13 %14 %14
         %17 = OpLoad %6 %16
         %18 = OpShiftRightArithmetic %6 %7 %17
         %20 = OpSGreaterThan %19 %18 %14
               OpSelectionMerge %22 None
               OpBranchConditional %20 %21 %40
         %21 = OpLabel
         %27 = OpAccessChain %15 %13 %14 %7
         %28 = OpLoad %6 %27
         %29 = OpConvertSToF %23 %28
         %30 = OpAccessChain %15 %13 %14 %14
         %31 = OpLoad %6 %30
         %32 = OpConvertSToF %23 %31
         %33 = OpAccessChain %15 %13 %14 %14
         %34 = OpLoad %6 %33
         %35 = OpConvertSToF %23 %34
         %36 = OpAccessChain %15 %13 %14 %7
         %37 = OpLoad %6 %36
         %38 = OpConvertSToF %23 %37
         %39 = OpCompositeConstruct %24 %29 %32 %35 %38
               OpStore %26 %39
               OpBranch %22
         %40 = OpLabel
         %41 = OpAccessChain %15 %13 %14 %14
         %42 = OpLoad %6 %41
         %43 = OpConvertSToF %23 %42
         %44 = OpCompositeConstruct %24 %43 %43 %43 %43
               OpStore %26 %44
               OpBranch %22
         %22 = OpLabel
               OpReturn
               OpFunctionEnd
END

# uniforms for variant

# _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__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
