#!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 discards in loops and conditionals

# The test passes because the fragment shader writes a red pixel, and then
# terminates without further output manipulation (the discards are not
# dynamically reachable)

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(void)
# {
#  _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
#  if(int(gl_FragCoord.x) < 2000) {
#  } else {
#    for(int ll = 0; ; ll++) {
#      if(gl_FragCoord.x < 0.0) {
#        discard;
#      }
#      if(ll >= 5) {
#        break;
#      }
#    }
#    if(int(gl_FragCoord.x) >= 2000) {
#      discard;
#    }
#  }
# }
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" %9 %14
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %9 "_GLF_color"
               OpName %14 "gl_FragCoord"
               OpName %29 "ll"
               OpDecorate %9 Location 0
               OpDecorate %14 BuiltIn FragCoord
               OpDecorate %29 RelaxedPrecision
               OpDecorate %41 RelaxedPrecision
               OpDecorate %47 RelaxedPrecision
               OpDecorate %49 RelaxedPrecision
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeFloat 32
          %7 = OpTypeVector %6 4
          %8 = OpTypePointer Output %7
          %9 = OpVariable %8 Output
         %10 = OpConstant %6 1
         %11 = OpConstant %6 0
         %12 = OpConstantComposite %7 %10 %11 %11 %10
         %13 = OpTypePointer Input %7
         %14 = OpVariable %13 Input
         %15 = OpTypeInt 32 0
         %16 = OpConstant %15 0
         %17 = OpTypePointer Input %6
         %20 = OpTypeInt 32 1
         %22 = OpConstant %20 2000
         %23 = OpTypeBool
         %28 = OpTypePointer Function %20
         %30 = OpConstant %20 0
         %42 = OpConstant %20 5
         %48 = OpConstant %20 1
          %4 = OpFunction %2 None %3
          %5 = OpLabel
         %29 = OpVariable %28 Function
               OpStore %9 %12
         %18 = OpAccessChain %17 %14 %16
         %19 = OpLoad %6 %18
         %21 = OpConvertFToS %20 %19
         %24 = OpSLessThan %23 %21 %22
               OpSelectionMerge %26 None
               OpBranchConditional %24 %25 %27
         %25 = OpLabel
               OpBranch %26
         %27 = OpLabel
               OpStore %29 %30
               OpBranch %31
         %31 = OpLabel
               OpLoopMerge %33 %34 None
               OpBranch %32
         %32 = OpLabel
         %35 = OpAccessChain %17 %14 %16
         %36 = OpLoad %6 %35
         %37 = OpFOrdLessThan %23 %36 %11
               OpSelectionMerge %39 None
               OpBranchConditional %37 %38 %39
         %38 = OpLabel
               OpKill
         %39 = OpLabel
         %41 = OpLoad %20 %29
         %43 = OpSGreaterThanEqual %23 %41 %42
               OpSelectionMerge %45 None
               OpBranchConditional %43 %44 %45
         %44 = OpLabel
               OpBranch %33
         %45 = OpLabel
               OpBranch %34
         %34 = OpLabel
         %47 = OpLoad %20 %29
         %49 = OpIAdd %20 %47 %48
               OpStore %29 %49
               OpBranch %31
         %33 = OpLabel
         %50 = OpAccessChain %17 %14 %16
         %51 = OpLoad %6 %50
         %52 = OpConvertFToS %20 %51
         %53 = OpSGreaterThanEqual %23 %52 %22
               OpSelectionMerge %55 None
               OpBranchConditional %53 %54 %55
         %54 = OpLabel
               OpKill
         %55 = OpLabel
               OpBranch %26
         %26 = 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
