#!amber

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

# uniforms for variant

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