#!amber

# Copyright 2020 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 coverage-gap found by the GraphicsFuzz project.

# Short description: A fragment shader that covers a specific instruction simplify code path

# The test passes because the shader always writes red.

SHADER vertex variant_vertex_shader PASSTHROUGH

# variant_fragment_shader is derived from the following GLSL:
# #version 310 es
# #define _int_1 _GLF_uniform_int_values[0]
# #define _int_0 _GLF_uniform_int_values[1]
#
# precision highp float;
# precision highp int;
#
# // Contents of _GLF_uniform_int_values: [1, 0]
# layout(set = 0, binding = 0) uniform buf0 {
#  int _GLF_uniform_int_values[2];
# };
#
# layout(location = 0) out vec4 _GLF_color;
#
# void main()
# {
#     int a = _int_0;
#     for (int i = -_int_1; (i | _int_1) < _int_1; i++)
#     {
#         a = i * _int_1;
#     }
#
#     if (a == -_int_1)
#     {
#         _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
#     }
#     else
#     {
#         _GLF_color = vec4(a);
#     }
# }
SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 8
; Bound: 71
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %53
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %8 "a"
               OpName %12 "buf0"
               OpMemberName %12 0 "_GLF_uniform_int_values"
               OpName %14 ""
               OpName %20 "i"
               OpName %53 "_GLF_color"
               OpDecorate %11 ArrayStride 16
               OpMemberDecorate %12 0 Offset 0
               OpDecorate %12 Block
               OpDecorate %14 DescriptorSet 0
               OpDecorate %14 Binding 0
               OpDecorate %53 Location 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeInt 32 1
          %7 = OpTypePointer Function %6
          %9 = OpTypeInt 32 0
         %10 = OpConstant %9 2
         %11 = OpTypeArray %6 %10
         %12 = OpTypeStruct %11
         %13 = OpTypePointer Uniform %12
         %14 = OpVariable %13 Uniform
         %15 = OpConstant %6 0
         %16 = OpConstant %6 1
         %17 = OpTypePointer Uniform %6
         %35 = OpTypeBool
         %50 = OpTypeFloat 32
         %51 = OpTypeVector %50 4
         %52 = OpTypePointer Output %51
         %53 = OpVariable %52 Output
          %4 = OpFunction %2 None %3
          %5 = OpLabel
          %8 = OpVariable %7 Function
         %20 = OpVariable %7 Function
         %18 = OpAccessChain %17 %14 %15 %16
         %19 = OpLoad %6 %18
               OpStore %8 %19
         %21 = OpAccessChain %17 %14 %15 %15
         %22 = OpLoad %6 %21
         %23 = OpSNegate %6 %22
               OpStore %20 %23
               OpBranch %24
         %24 = OpLabel
               OpLoopMerge %26 %27 None
               OpBranch %28
         %28 = OpLabel
         %29 = OpLoad %6 %20
         %30 = OpAccessChain %17 %14 %15 %15
         %31 = OpLoad %6 %30
         %32 = OpBitwiseOr %6 %29 %31
         %33 = OpAccessChain %17 %14 %15 %15
         %34 = OpLoad %6 %33
         %36 = OpSLessThan %35 %32 %34
               OpBranchConditional %36 %25 %26
         %25 = OpLabel
         %37 = OpLoad %6 %20
         %38 = OpAccessChain %17 %14 %15 %15
         %39 = OpLoad %6 %38
         %40 = OpIMul %6 %37 %39
               OpStore %8 %40
               OpBranch %27
         %27 = OpLabel
         %41 = OpLoad %6 %20
         %42 = OpIAdd %6 %41 %16
               OpStore %20 %42
               OpBranch %24
         %26 = OpLabel
         %43 = OpLoad %6 %8
         %44 = OpAccessChain %17 %14 %15 %15
         %45 = OpLoad %6 %44
         %46 = OpSNegate %6 %45
         %47 = OpIEqual %35 %43 %46
               OpSelectionMerge %49 None
               OpBranchConditional %47 %48 %67
         %48 = OpLabel
         %54 = OpAccessChain %17 %14 %15 %15
         %55 = OpLoad %6 %54
         %56 = OpConvertSToF %50 %55
         %57 = OpAccessChain %17 %14 %15 %16
         %58 = OpLoad %6 %57
         %59 = OpConvertSToF %50 %58
         %60 = OpAccessChain %17 %14 %15 %16
         %61 = OpLoad %6 %60
         %62 = OpConvertSToF %50 %61
         %63 = OpAccessChain %17 %14 %15 %15
         %64 = OpLoad %6 %63
         %65 = OpConvertSToF %50 %64
         %66 = OpCompositeConstruct %51 %56 %59 %62 %65
               OpStore %53 %66
               OpBranch %49
         %67 = OpLabel
         %68 = OpLoad %6 %8
         %69 = OpConvertSToF %50 %68
         %70 = OpCompositeConstruct %51 %69 %69 %69 %69
               OpStore %53 %70
               OpBranch %49
         %49 = OpLabel
               OpReturn
               OpFunctionEnd
END

# uniforms for variant

# _GLF_uniform_int_values
BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
 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__GLF_uniform_int_values 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
