#!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 value, inst combine select and value tracking 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_2 _GLF_uniform_int_values[0]
# #define _int_0 _GLF_uniform_int_values[1]
# #define _int_1 _GLF_uniform_int_values[2]
#
# precision highp float;
#
# precision highp int;
#
# // Contents of _GLF_uniform_int_values: [2, 0, 1]
# layout(set = 0, binding = 0) uniform buf0
# {
#     int _GLF_uniform_int_values[3];
# };
#
# layout(location = 0) out vec4 _GLF_color;
#
# void main()
# {
#     int A[2];
#     for (int i = _int_0; i < _int_2; i++)
#     {
#         A[i] = i;
#     }
#
#     int a = min(~(A[_int_0]), ~(A[_int_1]));
#
#     _GLF_color = vec4(_int_0);
#
#     if (a == -_int_2)
#     {
#         _GLF_color = vec4(_int_1, _int_0, _int_0, _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: 80
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %55
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %8 "i"
               OpName %12 "buf0"
               OpMemberName %12 0 "_GLF_uniform_int_values"
               OpName %14 ""
               OpName %33 "A"
               OpName %39 "a"
               OpName %55 "_GLF_color"
               OpDecorate %11 ArrayStride 16
               OpMemberDecorate %12 0 Offset 0
               OpDecorate %12 Block
               OpDecorate %14 DescriptorSet 0
               OpDecorate %14 Binding 0
               OpDecorate %55 Location 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeInt 32 1
          %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 = OpConstant %6 0
         %16 = OpConstant %6 1
         %17 = OpTypePointer Uniform %6
         %28 = OpTypeBool
         %30 = OpConstant %9 2
         %31 = OpTypeArray %6 %30
         %32 = OpTypePointer Function %31
         %45 = OpConstant %6 2
         %52 = OpTypeFloat 32
         %53 = OpTypeVector %52 4
         %54 = OpTypePointer Output %53
         %55 = OpVariable %54 Output
          %4 = OpFunction %2 None %3
          %5 = OpLabel
          %8 = OpVariable %7 Function
         %33 = OpVariable %32 Function
         %39 = OpVariable %7 Function
         %18 = OpAccessChain %17 %14 %15 %16
         %19 = OpLoad %6 %18
               OpStore %8 %19
               OpBranch %20
         %20 = OpLabel
               OpLoopMerge %22 %23 None
               OpBranch %24
         %24 = OpLabel
         %25 = OpLoad %6 %8
         %26 = OpAccessChain %17 %14 %15 %15
         %27 = OpLoad %6 %26
         %29 = OpSLessThan %28 %25 %27
               OpBranchConditional %29 %21 %22
         %21 = OpLabel
         %34 = OpLoad %6 %8
         %35 = OpLoad %6 %8
         %36 = OpAccessChain %7 %33 %34
               OpStore %36 %35
               OpBranch %23
         %23 = OpLabel
         %37 = OpLoad %6 %8
         %38 = OpIAdd %6 %37 %16
               OpStore %8 %38
               OpBranch %20
         %22 = OpLabel
         %40 = OpAccessChain %17 %14 %15 %16
         %41 = OpLoad %6 %40
         %42 = OpAccessChain %7 %33 %41
         %43 = OpLoad %6 %42
         %44 = OpNot %6 %43
         %46 = OpAccessChain %17 %14 %15 %45
         %47 = OpLoad %6 %46
         %48 = OpAccessChain %7 %33 %47
         %49 = OpLoad %6 %48
         %50 = OpNot %6 %49
         %51 = OpExtInst %6 %1 SMin %44 %50
               OpStore %39 %51
         %56 = OpAccessChain %17 %14 %15 %16
         %57 = OpLoad %6 %56
         %58 = OpConvertSToF %52 %57
         %59 = OpCompositeConstruct %53 %58 %58 %58 %58
               OpStore %55 %59
         %60 = OpLoad %6 %39
         %61 = OpAccessChain %17 %14 %15 %15
         %62 = OpLoad %6 %61
         %63 = OpSNegate %6 %62
         %64 = OpIEqual %28 %60 %63
               OpSelectionMerge %66 None
               OpBranchConditional %64 %65 %66
         %65 = OpLabel
         %67 = OpAccessChain %17 %14 %15 %45
         %68 = OpLoad %6 %67
         %69 = OpConvertSToF %52 %68
         %70 = OpAccessChain %17 %14 %15 %16
         %71 = OpLoad %6 %70
         %72 = OpConvertSToF %52 %71
         %73 = OpAccessChain %17 %14 %15 %16
         %74 = OpLoad %6 %73
         %75 = OpConvertSToF %52 %74
         %76 = OpAccessChain %17 %14 %15 %45
         %77 = OpLoad %6 %76
         %78 = OpConvertSToF %52 %77
         %79 = OpCompositeConstruct %53 %69 %72 %75 %78
               OpStore %55 %79
               OpBranch %66
         %66 = OpLabel
               OpReturn
               OpFunctionEnd
END

# uniforms for variant

# _GLF_uniform_int_values
BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
 2 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
