#!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 condition being always false

# An always false condition is passed to a for loop inside a function. The test passes if red color is written after the for loop.

# Optimized using spirv-opt with the following arguments:
# '--eliminate-dead-branches'
# '--merge-blocks'
# '--vector-dce'
# '--eliminate-dead-branches'
# '--merge-blocks'
# '--eliminate-dead-code-aggressive'
# '--eliminate-local-single-block'
# '--private-to-local'
# '--convert-local-access-chains'
# '--simplify-instructions'
# '--eliminate-dead-inserts'
# '--copy-propagate-arrays'
# '--simplify-instructions'
# '--eliminate-dead-code-aggressive'
# '--eliminate-local-multi-store'
# spirv-opt commit hash: 9559cdbdf011c487f67f89e2d694bd4a18d5c1e0

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 color;
#
# vec3 drawShape(vec2 pos)
# {
#  bool c3;
#  c3 = pos.y < 1.0;
#  for(
#      ivec2(8576, 72916);
#      c3;
#      bvec2(false, false)
#  )
#   {
#    return vec3(1.0);
#   }
#  return vec3(1.0);
# }
# void main()
# {
#  drawShape(vec2(1.0));
#  color = vec4(1, 0, 0, 1);
# }
SHADER fragment variant_fragment_shader SPIRV-ASM
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 7
; Bound: 52
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %47
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %12 "drawShape(vf2;"
               OpName %11 "pos"
               OpName %16 "c3"
               OpName %43 "param"
               OpName %47 "color"
               OpDecorate %47 Location 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeFloat 32
          %7 = OpTypeVector %6 2
          %8 = OpTypePointer Function %7
          %9 = OpTypeVector %6 3
         %10 = OpTypeFunction %9 %8
         %14 = OpTypeBool
         %15 = OpTypePointer Function %14
         %17 = OpTypeInt 32 0
         %18 = OpConstant %17 1
         %19 = OpTypePointer Function %6
         %22 = OpConstant %6 1
         %35 = OpConstantComposite %9 %22 %22 %22
         %42 = OpConstantComposite %7 %22 %22
         %45 = OpTypeVector %6 4
         %46 = OpTypePointer Output %45
         %47 = OpVariable %46 Output
         %48 = OpConstant %6 0
         %49 = OpConstantComposite %45 %22 %48 %48 %22
         %51 = OpUndef %14
          %4 = OpFunction %2 None %3
          %5 = OpLabel
         %43 = OpVariable %8 Function
               OpStore %43 %42
         %44 = OpFunctionCall %9 %12 %43
               OpStore %47 %49
               OpReturn
               OpFunctionEnd
         %12 = OpFunction %9 None %10
         %11 = OpFunctionParameter %8
         %13 = OpLabel
         %16 = OpVariable %15 Function
         %20 = OpAccessChain %19 %11 %18
         %21 = OpLoad %6 %20
         %23 = OpFOrdLessThan %14 %21 %22
               OpStore %16 %23
               OpBranch %29
         %29 = OpLabel
         %50 = OpPhi %14 %23 %13 %51 %32
               OpLoopMerge %31 %32 None
               OpBranchConditional %50 %30 %31
         %30 = OpLabel
               OpReturnValue %35
         %32 = OpLabel
               OpBranch %29
         %31 = OpLabel
               OpReturnValue %35
               OpFunctionEnd
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
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
