#!amber

# Copyright 2021 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 specific LLVM 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 320 es
# #define _int_0 _GLF_uniform_int_values[0]
# #define _int_1 _GLF_uniform_int_values[1]
#
# precision highp int;
# precision highp float;
#
# // Contents of _GLF_uniform_int_values: [0, 1]
# layout(set = 0, binding = 0) uniform buf0
# {
#     int _GLF_uniform_int_values[2];
# };
#
# layout(location = 0) out vec4 _GLF_color;
#
# // This function returns 0.
# int func()
# {
#     return findLSB(ivec2(1)).g;
# }
#
# void main()
# {
#     // Always true.
#     if(func() == _int_0)
#     {
#         _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: 58
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %39
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 320
               OpName %4 "main"
               OpName %8 "func("
               OpName %25 "buf0"
               OpMemberName %25 0 "_GLF_uniform_int_values"
               OpName %27 ""
               OpName %39 "_GLF_color"
               OpDecorate %13 RelaxedPrecision
               OpDecorate %16 RelaxedPrecision
               OpDecorate %24 ArrayStride 16
               OpMemberDecorate %25 0 Offset 0
               OpDecorate %25 Block
               OpDecorate %27 DescriptorSet 0
               OpDecorate %27 Binding 0
               OpDecorate %39 Location 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeInt 32 1
          %7 = OpTypeFunction %6
         %10 = OpTypeVector %6 2
         %11 = OpConstant %6 1
         %12 = OpConstantComposite %10 %11 %11
         %14 = OpTypeInt 32 0
         %15 = OpConstant %14 1
         %17 = OpTypePointer Function %6
         %23 = OpConstant %14 2
         %24 = OpTypeArray %6 %23
         %25 = OpTypeStruct %24
         %26 = OpTypePointer Uniform %25
         %27 = OpVariable %26 Uniform
         %28 = OpConstant %6 0
         %29 = OpTypePointer Uniform %6
         %32 = OpTypeBool
         %36 = OpTypeFloat 32
         %37 = OpTypeVector %36 4
         %38 = OpTypePointer Output %37
         %39 = OpVariable %38 Output
          %4 = OpFunction %2 None %3
          %5 = OpLabel
         %22 = OpFunctionCall %6 %8
         %30 = OpAccessChain %29 %27 %28 %28
         %31 = OpLoad %6 %30
         %33 = OpIEqual %32 %22 %31
               OpSelectionMerge %35 None
               OpBranchConditional %33 %34 %53
         %34 = OpLabel
         %40 = OpAccessChain %29 %27 %28 %11
         %41 = OpLoad %6 %40
         %42 = OpConvertSToF %36 %41
         %43 = OpAccessChain %29 %27 %28 %28
         %44 = OpLoad %6 %43
         %45 = OpConvertSToF %36 %44
         %46 = OpAccessChain %29 %27 %28 %28
         %47 = OpLoad %6 %46
         %48 = OpConvertSToF %36 %47
         %49 = OpAccessChain %29 %27 %28 %11
         %50 = OpLoad %6 %49
         %51 = OpConvertSToF %36 %50
         %52 = OpCompositeConstruct %37 %42 %45 %48 %51
               OpStore %39 %52
               OpBranch %35
         %53 = OpLabel
         %54 = OpAccessChain %29 %27 %28 %28
         %55 = OpLoad %6 %54
         %56 = OpConvertSToF %36 %55
         %57 = OpCompositeConstruct %37 %56 %56 %56 %56
               OpStore %39 %57
               OpBranch %35
         %35 = OpLabel
               OpReturn
               OpFunctionEnd
          %8 = OpFunction %6 None %7
          %9 = OpLabel
         %18 = OpVariable %17 Function
         %13 = OpExtInst %10 %1 FindILsb %12
         %16 = OpCompositeExtract %6 %13 1
               OpStore %18 %16
         %19 = OpLoad %6 %18
               OpReturnValue %19
               OpFunctionEnd
END

# uniforms for variant

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