#!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 inst combine compares 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_10 _GLF_uniform_int_values[0]
# #define _int_0 _GLF_uniform_int_values[1]
# #define _int_1 _GLF_uniform_int_values[2]
# #define _int_2 _GLF_uniform_int_values[3]
#
# precision highp int;
#
# precision highp float;
#
# // Contents of _GLF_uniform_int_values: [10, 0, 1, 2]
# layout(set = 0, binding = 0) uniform buf0
# {
#     int _GLF_uniform_int_values[4];
# };
#
# layout(location = 0) out vec4 _GLF_color;
#
# void main()
# {
#     int a[2];
#     for (int i = _int_1; i < _int_10; i++)
#     {
#         // a becomes [0, 1].
#         a = int[2](_int_0, (i % ivec2(3, _int_2))[1]);
#     }
#
#     _GLF_color = vec4(a[_int_1], _int_0, _int_0, a[_int_1]);
# }
SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 71
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %53
               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 %53 "_GLF_color"
               OpDecorate %11 ArrayStride 16
               OpMemberDecorate %12 0 Offset 0
               OpDecorate %12 Block
               OpDecorate %14 DescriptorSet 0
               OpDecorate %14 Binding 0
               OpDecorate %53 Location 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeInt 32 1
          %7 = OpTypePointer Function %6
          %9 = OpTypeInt 32 0
         %10 = OpConstant %9 4
         %11 = OpTypeArray %6 %10
         %12 = OpTypeStruct %11
         %13 = OpTypePointer Uniform %12
         %14 = OpVariable %13 Uniform
         %15 = OpConstant %6 0
         %16 = OpConstant %6 2
         %17 = OpTypePointer Uniform %6
         %28 = OpTypeBool
         %30 = OpConstant %9 2
         %31 = OpTypeArray %6 %30
         %32 = OpTypePointer Function %31
         %34 = OpConstant %6 1
         %38 = OpConstant %6 3
         %41 = OpTypeVector %6 2
         %45 = OpConstant %9 1
         %50 = OpTypeFloat 32
         %51 = OpTypeVector %50 4
         %52 = OpTypePointer Output %51
         %53 = OpVariable %52 Output
          %4 = OpFunction %2 None %3
          %5 = OpLabel
          %8 = OpVariable %7 Function
         %33 = OpVariable %32 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
         %35 = OpAccessChain %17 %14 %15 %34
         %36 = OpLoad %6 %35
         %37 = OpLoad %6 %8
         %39 = OpAccessChain %17 %14 %15 %38
         %40 = OpLoad %6 %39
         %42 = OpCompositeConstruct %41 %38 %40
         %43 = OpCompositeConstruct %41 %37 %37
         %44 = OpSMod %41 %43 %42
         %46 = OpCompositeExtract %6 %44 1
         %47 = OpCompositeConstruct %31 %36 %46
               OpStore %33 %47
               OpBranch %23
         %23 = OpLabel
         %48 = OpLoad %6 %8
         %49 = OpIAdd %6 %48 %34
               OpStore %8 %49
               OpBranch %20
         %22 = OpLabel
         %54 = OpAccessChain %17 %14 %15 %16
         %55 = OpLoad %6 %54
         %56 = OpAccessChain %7 %33 %55
         %57 = OpLoad %6 %56
         %58 = OpConvertSToF %50 %57
         %59 = OpAccessChain %17 %14 %15 %34
         %60 = OpLoad %6 %59
         %61 = OpConvertSToF %50 %60
         %62 = OpAccessChain %17 %14 %15 %34
         %63 = OpLoad %6 %62
         %64 = OpConvertSToF %50 %63
         %65 = OpAccessChain %17 %14 %15 %16
         %66 = OpLoad %6 %65
         %67 = OpAccessChain %7 %33 %66
         %68 = OpLoad %6 %67
         %69 = OpConvertSToF %50 %68
         %70 = OpCompositeConstruct %51 %58 %61 %64 %69
               OpStore %53 %70
               OpReturn
               OpFunctionEnd
END

# uniforms for variant

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