#!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 nested if

# The test passes because main always writes color red.
# Running code after writing red does not matter.

# Optimized using spirv-opt with the following arguments:
# '--copy-propagate-arrays'
# '--if-conversion'
# '--convert-local-access-chains'
# '--convert-local-access-chains'
# '--vector-dce'
# '--reduce-load-size'
# '--reduce-load-size'
# '--eliminate-dead-branches'
# '--merge-blocks'
# '--inline-entry-points-exhaustive'
# '--redundancy-elimination'
# '--private-to-local'
# '--eliminate-dead-code-aggressive'
# '--ccp'
# '--simplify-instructions'
# '--eliminate-dead-branches'
# '--inline-entry-points-exhaustive'
# '--eliminate-dead-inserts'
# '--eliminate-dead-branches'
# spirv-opt commit hash: 6b072126595dd8c2448eb1fda616251c5e6d7079



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;
# };
# void main()
# {
#     _GLF_color = vec4(1.0, 0.0, 0.0, 1.0); // Write color red
#
#     do
#     {
#         if (injectionSwitch.y < 0.0) // Always false
#         {
#             bool GLF_live12c5 = false;
#             if (GLF_live12c5)
#             {
#             }
#             continue;
#         }
#         break;
#     } while (false);
# }
SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 7
; Bound: 39
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %9
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %9 "_GLF_color"
               OpName %18 "buf0"
               OpMemberName %18 0 "injectionSwitch"
               OpName %20 ""
               OpName %33 "GLF_live12c5"
               OpDecorate %9 Location 0
               OpMemberDecorate %18 0 Offset 0
               OpDecorate %18 Block
               OpDecorate %20 DescriptorSet 0
               OpDecorate %20 Binding 0
          %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
         %17 = OpTypeVector %6 2
         %18 = OpTypeStruct %17
         %19 = OpTypePointer Uniform %18
         %20 = OpVariable %19 Uniform
         %21 = OpTypeInt 32 1
         %22 = OpConstant %21 0
         %23 = OpTypeInt 32 0
         %24 = OpConstant %23 1
         %25 = OpTypePointer Uniform %6
         %28 = OpTypeBool
         %32 = OpTypePointer Function %28
         %34 = OpConstantFalse %28
          %4 = OpFunction %2 None %3
          %5 = OpLabel
         %33 = OpVariable %32 Function
               OpStore %9 %12
               OpBranch %13
         %13 = OpLabel
               OpLoopMerge %15 %37 None
               OpBranch %14
         %14 = OpLabel
         %26 = OpAccessChain %25 %20 %22 %24
         %27 = OpLoad %6 %26
         %29 = OpFOrdLessThan %28 %27 %11
               OpSelectionMerge %31 None
               OpBranchConditional %29 %30 %31
         %30 = OpLabel
               OpStore %33 %34
         %35 = OpLoad %28 %33
               OpSelectionMerge %38 None
               OpBranchConditional %35 %36 %37
         %36 = OpLabel
               OpBranch %37
         %38 = OpLabel
               OpBranch %37
         %37 = OpLabel
               OpBranchConditional %34 %13 %15
         %31 = OpLabel
               OpBranch %15
         %15 = OpLabel
               OpReturn
               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
