#!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 unreachable continue statement

# The test passes because the shader always writes the color red.

# Optimized using spirv-opt with the following arguments:
# '--eliminate-local-single-store'
# '--simplify-instructions'
# '--eliminate-dead-branches'
# '--merge-blocks'
# '--combine-access-chains'
# '--vector-dce'
# '--eliminate-dead-branches'
# spirv-opt commit hash: 06407250a169c6a03b3765e86619075af1a8c187



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;
#
# layout(set = 0, binding = 0) uniform buf0
# {
#     vec2 injectionSwitch;
# };
# vec3 computeColor()
# {
#     _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
#
#     for (
#         int _injected_loop_counter = 1;
#         true;
#         1)
#     {
#         if (injectionSwitch.x > 1.0) // Always false
#         {
#             if (injectionSwitch.x > 1.0)
#             {
#             }
#             continue;
#         }
#         return vec3(1.0);
#     }
#     return vec3(1.0);
# }
# void main()
# {
#     computeColor();
# }
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" %13
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %9 "computeColor("
               OpName %13 "_GLF_color"
               OpName %19 "_injected_loop_counter"
               OpName %29 "buf0"
               OpMemberName %29 0 "injectionSwitch"
               OpName %31 ""
               OpDecorate %13 Location 0
               OpDecorate %19 RelaxedPrecision
               OpMemberDecorate %29 0 Offset 0
               OpDecorate %29 Block
               OpDecorate %31 DescriptorSet 0
               OpDecorate %31 Binding 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeFloat 32
          %7 = OpTypeVector %6 3
          %8 = OpTypeFunction %7
         %11 = OpTypeVector %6 4
         %12 = OpTypePointer Output %11
         %13 = OpVariable %12 Output
         %14 = OpConstant %6 1
         %15 = OpConstant %6 0
         %16 = OpConstantComposite %11 %14 %15 %15 %14
         %17 = OpTypeInt 32 1
         %18 = OpTypePointer Function %17
         %20 = OpConstant %17 1
         %26 = OpTypeBool
         %27 = OpConstantTrue %26
         %28 = OpTypeVector %6 2
         %29 = OpTypeStruct %28
         %30 = OpTypePointer Uniform %29
         %31 = OpVariable %30 Uniform
         %32 = OpConstant %17 0
         %33 = OpTypeInt 32 0
         %34 = OpConstant %33 0
         %35 = OpTypePointer Uniform %6
         %47 = OpConstantComposite %7 %14 %14 %14
          %4 = OpFunction %2 None %3
          %5 = OpLabel
         %51 = OpFunctionCall %7 %9
               OpReturn
               OpFunctionEnd
          %9 = OpFunction %7 None %8
         %10 = OpLabel
         %19 = OpVariable %18 Function
               OpStore %13 %16
               OpStore %19 %20
               OpBranch %21
         %21 = OpLabel
               OpLoopMerge %23 %45 None
               OpBranch %22
         %22 = OpLabel
         %36 = OpAccessChain %35 %31 %32 %34
         %37 = OpLoad %6 %36
         %38 = OpFOrdGreaterThan %26 %37 %14
               OpSelectionMerge %40 None
               OpBranchConditional %38 %39 %40
         %39 = OpLabel
         %41 = OpAccessChain %35 %31 %32 %34
         %42 = OpLoad %6 %41
         %43 = OpFOrdGreaterThan %26 %42 %14
               OpSelectionMerge %45 None
               OpBranchConditional %43 %44 %45
         %44 = OpLabel
               OpBranch %45
         %45 = OpLabel
               OpBranch %21
         %40 = OpLabel
               OpReturnValue %47
         %23 = OpLabel
               OpUnreachable
               OpFunctionEnd
END

# uniforms for variant

# injectionSwitch
BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
 0.0 1.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_injectionSwitch 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
