#!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 GraphicsFuzz.

# Short description: A fragment shader that covers specific simplification and value tracking 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
# precision highp float;
# precision highp int;
#
# layout(location = 0) out vec4 _GLF_color;
# layout(set = 0, binding = 0) uniform buf0
# {
#     int two;
# };
#
# int func(int i, int x)
# {
#     int r = 2;
#
#     // Run until x = 3 (three iterations).
#     while(x <= r)
#     {
#         // Always false.
#         if(i == 1)
#             return -1;
#
#         // Always false.
#         if(x < 1)
#             r = 1;
#
#         // r is always 2.
#         // findLSB(2) = 1
#         // findMSB(1) = 0
#         // --> The while loop is run only once.
#         do
#         {
#             x++;
#         }
#         while(findMSB(findLSB(r)) > 1);
#     }
#
#     return x;
# }
#
# void main()
# {
#     if(func(two, 1) == 3)
#         _GLF_color = vec4(1, 0, 0, 1);
#     else
#         _GLF_color = vec4(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: 71
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %65
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %11 "func(i1;i1;"
               OpName %9 "i"
               OpName %10 "x"
               OpName %13 "r"
               OpName %48 "buf0"
               OpMemberName %48 0 "two"
               OpName %50 ""
               OpName %52 "param"
               OpName %56 "param"
               OpName %65 "_GLF_color"
               OpMemberDecorate %48 0 Offset 0
               OpDecorate %48 Block
               OpDecorate %50 DescriptorSet 0
               OpDecorate %50 Binding 0
               OpDecorate %65 Location 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeInt 32 1
          %7 = OpTypePointer Function %6
          %8 = OpTypeFunction %6 %7 %7
         %14 = OpConstant %6 2
         %22 = OpTypeBool
         %25 = OpConstant %6 1
         %29 = OpConstant %6 -1
         %48 = OpTypeStruct %6
         %49 = OpTypePointer Uniform %48
         %50 = OpVariable %49 Uniform
         %51 = OpConstant %6 0
         %53 = OpTypePointer Uniform %6
         %58 = OpConstant %6 3
         %62 = OpTypeFloat 32
         %63 = OpTypeVector %62 4
         %64 = OpTypePointer Output %63
         %65 = OpVariable %64 Output
         %66 = OpConstant %62 1
         %67 = OpConstant %62 0
         %68 = OpConstantComposite %63 %66 %67 %67 %66
         %70 = OpConstantComposite %63 %67 %67 %67 %67
          %4 = OpFunction %2 None %3
          %5 = OpLabel
         %52 = OpVariable %7 Function
         %56 = OpVariable %7 Function
         %54 = OpAccessChain %53 %50 %51
         %55 = OpLoad %6 %54
               OpStore %52 %55
               OpStore %56 %25
         %57 = OpFunctionCall %6 %11 %52 %56
         %59 = OpIEqual %22 %57 %58
               OpSelectionMerge %61 None
               OpBranchConditional %59 %60 %69
         %60 = OpLabel
               OpStore %65 %68
               OpBranch %61
         %69 = OpLabel
               OpStore %65 %70
               OpBranch %61
         %61 = OpLabel
               OpReturn
               OpFunctionEnd
         %11 = OpFunction %6 None %8
          %9 = OpFunctionParameter %7
         %10 = OpFunctionParameter %7
         %12 = OpLabel
         %13 = OpVariable %7 Function
               OpStore %13 %14
               OpBranch %15
         %15 = OpLabel
               OpLoopMerge %17 %18 None
               OpBranch %19
         %19 = OpLabel
         %20 = OpLoad %6 %10
         %21 = OpLoad %6 %13
         %23 = OpSLessThanEqual %22 %20 %21
               OpBranchConditional %23 %16 %17
         %16 = OpLabel
         %24 = OpLoad %6 %9
         %26 = OpIEqual %22 %24 %25
               OpSelectionMerge %28 None
               OpBranchConditional %26 %27 %28
         %27 = OpLabel
               OpReturnValue %29
         %28 = OpLabel
         %31 = OpLoad %6 %10
         %32 = OpSLessThan %22 %31 %25
               OpSelectionMerge %34 None
               OpBranchConditional %32 %33 %34
         %33 = OpLabel
               OpStore %13 %25
               OpBranch %34
         %34 = OpLabel
               OpBranch %35
         %35 = OpLabel
               OpLoopMerge %37 %38 None
               OpBranch %36
         %36 = OpLabel
         %39 = OpLoad %6 %10
         %40 = OpIAdd %6 %39 %25
               OpStore %10 %40
               OpBranch %38
         %38 = OpLabel
         %41 = OpLoad %6 %13
         %42 = OpExtInst %6 %1 FindILsb %41
         %43 = OpExtInst %6 %1 FindSMsb %42
         %44 = OpSGreaterThan %22 %43 %25
               OpBranchConditional %44 %35 %37
         %37 = OpLabel
               OpBranch %18
         %18 = OpLabel
               OpBranch %15
         %17 = OpLabel
         %45 = OpLoad %6 %10
               OpReturnValue %45
               OpFunctionEnd
END

# uniforms for variant

# two
BUFFER variant_two DATA_TYPE int32 DATA
 2
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_two 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
