#!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 specific inst combine add sub 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_10 _GLF_uniform_int_values[0]
# #define _int_0 _GLF_uniform_int_values[1]
# #define _int_1 _GLF_uniform_int_values[2]
# #define _float_4_5 _GLF_uniform_float_values[0]
#
# precision highp float;
#
# precision highp int;
#
# // Contents of _GLF_uniform_float_values: 4.5
# layout(set = 0, binding = 0) uniform buf0
# {
#     float _GLF_uniform_float_values[1];
# };
#
# // Contents of _GLF_uniform_int_values: [10, 0, 1]
# layout(set = 0, binding = 1) uniform buf1
# {
#     int _GLF_uniform_int_values[3];
# };
#
# layout(location = 0) out vec4 _GLF_color;
#
# void main()
# {
#     int a = _int_0;
#     a++;
#     float b;
#     for (int i = _int_0; i < _int_10; i++)
#     {
#         // b becomes 9.0 * 2^-1 = 4.5.
#         b = ldexp(float(i), -a);
#     }
#
#     if (b == _float_4_5)
#     {
#         _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
#     }
#     else
#     {
#         _GLF_color = vec4(b);
#     }
# }
SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 8
; Bound: 77
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %59
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %8 "a"
               OpName %12 "buf1"
               OpMemberName %12 0 "_GLF_uniform_int_values"
               OpName %14 ""
               OpName %22 "i"
               OpName %37 "b"
               OpName %48 "buf0"
               OpMemberName %48 0 "_GLF_uniform_float_values"
               OpName %50 ""
               OpName %59 "_GLF_color"
               OpDecorate %11 ArrayStride 16
               OpMemberDecorate %12 0 Offset 0
               OpDecorate %12 Block
               OpDecorate %14 DescriptorSet 0
               OpDecorate %14 Binding 1
               OpDecorate %47 ArrayStride 16
               OpMemberDecorate %48 0 Offset 0
               OpDecorate %48 Block
               OpDecorate %50 DescriptorSet 0
               OpDecorate %50 Binding 0
               OpDecorate %59 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
         %33 = OpTypeBool
         %35 = OpTypeFloat 32
         %36 = OpTypePointer Function %35
         %46 = OpConstant %9 1
         %47 = OpTypeArray %35 %46
         %48 = OpTypeStruct %47
         %49 = OpTypePointer Uniform %48
         %50 = OpVariable %49 Uniform
         %51 = OpTypePointer Uniform %35
         %57 = OpTypeVector %35 4
         %58 = OpTypePointer Output %57
         %59 = OpVariable %58 Output
         %60 = OpConstant %6 2
          %4 = OpFunction %2 None %3
          %5 = OpLabel
          %8 = OpVariable %7 Function
         %22 = OpVariable %7 Function
         %37 = OpVariable %36 Function
         %18 = OpAccessChain %17 %14 %15 %16
         %19 = OpLoad %6 %18
               OpStore %8 %19
         %20 = OpLoad %6 %8
         %21 = OpIAdd %6 %20 %16
               OpStore %8 %21
         %23 = OpAccessChain %17 %14 %15 %16
         %24 = OpLoad %6 %23
               OpStore %22 %24
               OpBranch %25
         %25 = OpLabel
               OpLoopMerge %27 %28 None
               OpBranch %29
         %29 = OpLabel
         %30 = OpLoad %6 %22
         %31 = OpAccessChain %17 %14 %15 %15
         %32 = OpLoad %6 %31
         %34 = OpSLessThan %33 %30 %32
               OpBranchConditional %34 %26 %27
         %26 = OpLabel
         %38 = OpLoad %6 %22
         %39 = OpConvertSToF %35 %38
         %40 = OpLoad %6 %8
         %41 = OpSNegate %6 %40
         %42 = OpExtInst %35 %1 Ldexp %39 %41
               OpStore %37 %42
               OpBranch %28
         %28 = OpLabel
         %43 = OpLoad %6 %22
         %44 = OpIAdd %6 %43 %16
               OpStore %22 %44
               OpBranch %25
         %27 = OpLabel
         %45 = OpLoad %35 %37
         %52 = OpAccessChain %51 %50 %15 %15
         %53 = OpLoad %35 %52
         %54 = OpFOrdEqual %33 %45 %53
               OpSelectionMerge %56 None
               OpBranchConditional %54 %55 %74
         %55 = OpLabel
         %61 = OpAccessChain %17 %14 %15 %60
         %62 = OpLoad %6 %61
         %63 = OpConvertSToF %35 %62
         %64 = OpAccessChain %17 %14 %15 %16
         %65 = OpLoad %6 %64
         %66 = OpConvertSToF %35 %65
         %67 = OpAccessChain %17 %14 %15 %16
         %68 = OpLoad %6 %67
         %69 = OpConvertSToF %35 %68
         %70 = OpAccessChain %17 %14 %15 %60
         %71 = OpLoad %6 %70
         %72 = OpConvertSToF %35 %71
         %73 = OpCompositeConstruct %57 %63 %66 %69 %72
               OpStore %59 %73
               OpBranch %56
         %74 = OpLabel
         %75 = OpLoad %35 %37
         %76 = OpCompositeConstruct %57 %75 %75 %75 %75
               OpStore %59 %76
               OpBranch %56
         %56 = OpLabel
               OpReturn
               OpFunctionEnd
END

# uniforms for variant

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