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

# uniforms for variant

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