#!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 DAG combiner 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_3 _GLF_uniform_int_values[0]
# #define _int_4 _GLF_uniform_int_values[1]
# #define _int_0 _GLF_uniform_int_values[2]
# #define _int_1 _GLF_uniform_int_values[3]
#
# precision highp float;
#
# precision highp int;
#
# // Contents of _GLF_uniform_int_values: [3, 4, 0, 1]
# layout(set = 0, binding = 0) uniform buf0
# {
#     int _GLF_uniform_int_values[4];
# };
#
# layout(location = 0) out vec4 _GLF_color;
#
# void main()
# {
#     int a = _int_1;
#
#     // i = 0: a = 0 -> 2
#     // i = 1: a = 2 -> 3
#     // i = 2: a = 3 -> 4
#     for (int i = _int_0; i < _int_3; i++)
#     {
#         do
#         {
#             a++;
#         } while (findMSB(a) < _int_1);
#     }
#     if (a == _int_4)
#     {
#         _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 %12 "buf0"
               OpMemberName %12 0 "_GLF_uniform_int_values"
               OpName %14 ""
               OpName %20 "i"
               OpName %57 "_GLF_color"
               OpDecorate %11 ArrayStride 16
               OpMemberDecorate %12 0 Offset 0
               OpDecorate %12 Block
               OpDecorate %14 DescriptorSet 0
               OpDecorate %14 Binding 0
               OpDecorate %57 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 3
         %17 = OpTypePointer Uniform %6
         %21 = OpConstant %6 2
         %32 = OpTypeBool
         %39 = OpConstant %6 1
         %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
         %20 = 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
               OpBranch %34
         %34 = OpLabel
               OpLoopMerge %36 %37 None
               OpBranch %35
         %35 = OpLabel
         %38 = OpLoad %6 %8
         %40 = OpIAdd %6 %38 %39
               OpStore %8 %40
               OpBranch %37
         %37 = OpLabel
         %41 = OpLoad %6 %8
         %42 = OpExtInst %6 %1 FindSMsb %41
         %43 = OpAccessChain %17 %14 %15 %16
         %44 = OpLoad %6 %43
         %45 = OpSLessThan %32 %42 %44
               OpBranchConditional %45 %34 %36
         %36 = OpLabel
               OpBranch %27
         %27 = OpLabel
         %46 = OpLoad %6 %20
         %47 = OpIAdd %6 %46 %39
               OpStore %20 %47
               OpBranch %24
         %26 = OpLabel
         %48 = OpLoad %6 %8
         %49 = OpAccessChain %17 %14 %15 %39
         %50 = OpLoad %6 %49
         %51 = OpIEqual %32 %48 %50
               OpSelectionMerge %53 None
               OpBranchConditional %51 %52 %71
         %52 = OpLabel
         %58 = OpAccessChain %17 %14 %15 %16
         %59 = OpLoad %6 %58
         %60 = OpConvertSToF %54 %59
         %61 = OpAccessChain %17 %14 %15 %21
         %62 = OpLoad %6 %61
         %63 = OpConvertSToF %54 %62
         %64 = OpAccessChain %17 %14 %15 %21
         %65 = OpLoad %6 %64
         %66 = OpConvertSToF %54 %65
         %67 = OpAccessChain %17 %14 %15 %16
         %68 = OpLoad %6 %67
         %69 = OpConvertSToF %54 %68
         %70 = OpCompositeConstruct %55 %60 %63 %66 %69
               OpStore %57 %70
               OpBranch %53
         %71 = OpLabel
         %72 = OpAccessChain %17 %14 %15 %21
         %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 DATA
 3 0 0 0
 4 0 0 0
 0 0 0 0
 1 0 0 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
