#!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: Covers specific DAG combiner and legalize vector ops code paths

# 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 int;
#
# precision highp float;
#
# // 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()
# {
#     // a becomes -2147483648.
#     int a = bitfieldReverse(1);
#
#     // a is negative therefore this results in an undefined value, but not in undefined behavior.
#     int b = 1 << a;
#
#     int c = findMSB(b);
#
#     _GLF_color = vec4(c);
#
#     if (a == -2147483648)
#     {
#         _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
#     }
#     else
#     {
#         _GLF_color = vec4(_int_0);
#     }
# }
SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 56
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %20
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %8 "a"
               OpName %11 "b"
               OpName %14 "c"
               OpName %20 "_GLF_color"
               OpName %33 "buf0"
               OpMemberName %33 0 "_GLF_uniform_int_values"
               OpName %35 ""
               OpDecorate %20 Location 0
               OpDecorate %32 ArrayStride 16
               OpMemberDecorate %33 0 Offset 0
               OpDecorate %33 Block
               OpDecorate %35 DescriptorSet 0
               OpDecorate %35 Binding 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeInt 32 1
          %7 = OpTypePointer Function %6
          %9 = OpConstant %6 1
         %17 = OpTypeFloat 32
         %18 = OpTypeVector %17 4
         %19 = OpTypePointer Output %18
         %20 = OpVariable %19 Output
         %25 = OpConstant %6 -2147483648
         %26 = OpTypeBool
         %30 = OpTypeInt 32 0
         %31 = OpConstant %30 2
         %32 = OpTypeArray %6 %31
         %33 = OpTypeStruct %32
         %34 = OpTypePointer Uniform %33
         %35 = OpVariable %34 Uniform
         %36 = OpConstant %6 0
         %37 = OpTypePointer Uniform %6
          %4 = OpFunction %2 None %3
          %5 = OpLabel
          %8 = OpVariable %7 Function
         %11 = OpVariable %7 Function
         %14 = OpVariable %7 Function
         %10 = OpBitReverse %6 %9
               OpStore %8 %10
         %12 = OpLoad %6 %8
         %13 = OpShiftLeftLogical %6 %9 %12
               OpStore %11 %13
         %15 = OpLoad %6 %11
         %16 = OpExtInst %6 %1 FindSMsb %15
               OpStore %14 %16
         %21 = OpLoad %6 %14
         %22 = OpConvertSToF %17 %21
         %23 = OpCompositeConstruct %18 %22 %22 %22 %22
               OpStore %20 %23
         %24 = OpLoad %6 %8
         %27 = OpIEqual %26 %24 %25
               OpSelectionMerge %29 None
               OpBranchConditional %27 %28 %51
         %28 = OpLabel
         %38 = OpAccessChain %37 %35 %36 %36
         %39 = OpLoad %6 %38
         %40 = OpConvertSToF %17 %39
         %41 = OpAccessChain %37 %35 %36 %9
         %42 = OpLoad %6 %41
         %43 = OpConvertSToF %17 %42
         %44 = OpAccessChain %37 %35 %36 %9
         %45 = OpLoad %6 %44
         %46 = OpConvertSToF %17 %45
         %47 = OpAccessChain %37 %35 %36 %36
         %48 = OpLoad %6 %47
         %49 = OpConvertSToF %17 %48
         %50 = OpCompositeConstruct %18 %40 %43 %46 %49
               OpStore %20 %50
               OpBranch %29
         %51 = OpLabel
         %52 = OpAccessChain %37 %35 %36 %9
         %53 = OpLoad %6 %52
         %54 = OpConvertSToF %17 %53
         %55 = OpCompositeConstruct %18 %54 %54 %54 %54
               OpStore %20 %55
               OpBranch %29
         %29 = 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
