#!amber

# Copyright 2019 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 bug found by GraphicsFuzz.

# Short description: A fragment shader with a for loop containing nested ifs

# The test passes because the two-iteration loop only writes red to the output color variable.

SHADER vertex variant_vertex_shader PASSTHROUGH

# variant_fragment_shader is derived from the following GLSL:
# #version 310 es
# precision highp float;
#
# layout(location = 0) out vec4 _GLF_color;
#
# void main()
# {
#   for (
#       int j = 0;
#       j < 2;
#       j++)
#   {
#     if (j < 1)
#     {
#       _GLF_color = vec4(1.0, 0.0, 0.0, 1.0); // red
#     }
#     if (j != 3)
#     {
#       if (j != 4)
#       {
#         if (j == 5) // always false
#         {
#           _GLF_color[0] = float(ldexp(1.0, 2));
#         }
#         else
#         {
#           float a;
#           a = float(ldexp(1.0, 2));
#           _GLF_color = vec4(1.0, 0.0, 0.0, 1.0); // red
#         }
#       }
#     }
#   }
# }
SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 7
; Bound: 57
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %27
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %8 "j"
               OpName %27 "_GLF_color"
               OpName %53 "a"
               OpDecorate %8 RelaxedPrecision
               OpDecorate %15 RelaxedPrecision
               OpDecorate %19 RelaxedPrecision
               OpDecorate %27 Location 0
               OpDecorate %31 RelaxedPrecision
               OpDecorate %36 RelaxedPrecision
               OpDecorate %41 RelaxedPrecision
               OpDecorate %55 RelaxedPrecision
               OpDecorate %56 RelaxedPrecision
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeInt 32 1
          %7 = OpTypePointer Function %6
          %9 = OpConstant %6 0
         %16 = OpConstant %6 2
         %17 = OpTypeBool
         %20 = OpConstant %6 1
         %24 = OpTypeFloat 32
         %25 = OpTypeVector %24 4
         %26 = OpTypePointer Output %25
         %27 = OpVariable %26 Output
         %28 = OpConstant %24 1
         %29 = OpConstant %24 0
         %30 = OpConstantComposite %25 %28 %29 %29 %28
         %32 = OpConstant %6 3
         %37 = OpConstant %6 4
         %42 = OpConstant %6 5
         %47 = OpTypeInt 32 0
         %48 = OpConstant %47 0
         %49 = OpTypePointer Output %24
         %52 = OpTypePointer Function %24
          %4 = OpFunction %2 None %3
          %5 = OpLabel
          %8 = OpVariable %7 Function
         %53 = OpVariable %52 Function
               OpStore %8 %9
               OpBranch %10
         %10 = OpLabel
               OpLoopMerge %12 %13 None
               OpBranch %14
         %14 = OpLabel
         %15 = OpLoad %6 %8
         %18 = OpSLessThan %17 %15 %16
               OpBranchConditional %18 %11 %12
         %11 = OpLabel
         %19 = OpLoad %6 %8
         %21 = OpSLessThan %17 %19 %20
               OpSelectionMerge %23 None
               OpBranchConditional %21 %22 %23
         %22 = OpLabel
               OpStore %27 %30
               OpBranch %23
         %23 = OpLabel
         %31 = OpLoad %6 %8
         %33 = OpINotEqual %17 %31 %32
               OpSelectionMerge %35 None
               OpBranchConditional %33 %34 %35
         %34 = OpLabel
         %36 = OpLoad %6 %8
         %38 = OpINotEqual %17 %36 %37
               OpSelectionMerge %40 None
               OpBranchConditional %38 %39 %40
         %39 = OpLabel
         %41 = OpLoad %6 %8
         %43 = OpIEqual %17 %41 %42
               OpSelectionMerge %45 None
               OpBranchConditional %43 %44 %51
         %44 = OpLabel
         %46 = OpExtInst %24 %1 Ldexp %28 %16
         %50 = OpAccessChain %49 %27 %48
               OpStore %50 %46
               OpBranch %45
         %51 = OpLabel
         %54 = OpExtInst %24 %1 Ldexp %28 %16
               OpStore %53 %54
               OpStore %27 %30
               OpBranch %45
         %45 = OpLabel
               OpBranch %40
         %40 = OpLabel
               OpBranch %35
         %35 = OpLabel
               OpBranch %13
         %13 = OpLabel
         %55 = OpLoad %6 %8
         %56 = OpIAdd %6 %55 %20
               OpStore %8 %56
               OpBranch %10
         %12 = OpLabel
               OpReturn
               OpFunctionEnd
END

# uniforms for variant


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
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
