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

# uniforms for variant

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