#!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 GraphicsFuzz.

# Short description: A fragment shader that covers a specific IR builder path.

# The test passes because shader always writes red.

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
# {
#     float one;
# };
#
# void main()
# {
#     mat4 m = mat4(1.0, 1.0, 0.0, 1.0,
#                   0.0, 0.0, 1.0, 1.0,
#                   0.0, 0.0, one, 0.0,
#                   0.0, 0.0, 0.0, 0.0);
#
#     if(abs(determinant(m)) < 0.01)
#         _GLF_color = vec4(1, 0, 0, 1);
#     else
#         _GLF_color = vec4(0);
# }
SHADER fragment variant_fragment_shader SPIRV-ASM
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 8
; Bound: 39
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %35
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %10 "m"
               OpName %13 "buf0"
               OpMemberName %13 0 "one"
               OpName %15 ""
               OpName %35 "_GLF_color"
               OpMemberDecorate %13 0 Offset 0
               OpDecorate %13 Block
               OpDecorate %15 DescriptorSet 0
               OpDecorate %15 Binding 0
               OpDecorate %35 Location 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeFloat 32
          %7 = OpTypeVector %6 4
          %8 = OpTypeMatrix %7 4
          %9 = OpTypePointer Function %8
         %11 = OpConstant %6 1
         %12 = OpConstant %6 0
         %13 = OpTypeStruct %6
         %14 = OpTypePointer Uniform %13
         %15 = OpVariable %14 Uniform
         %16 = OpTypeInt 32 1
         %17 = OpConstant %16 0
         %18 = OpTypePointer Uniform %6
         %29 = OpConstant %6 0.00999999978
         %30 = OpTypeBool
         %34 = OpTypePointer Output %7
         %35 = OpVariable %34 Output
         %36 = OpConstantComposite %7 %11 %12 %12 %11
         %38 = OpConstantComposite %7 %12 %12 %12 %12
          %4 = OpFunction %2 None %3
          %5 = OpLabel
         %10 = OpVariable %9 Function
         %19 = OpAccessChain %18 %15 %17
         %20 = OpLoad %6 %19
         %21 = OpCompositeConstruct %7 %11 %11 %12 %11
         %22 = OpCompositeConstruct %7 %12 %12 %11 %11
         %23 = OpCompositeConstruct %7 %12 %12 %20 %12
         %24 = OpCompositeConstruct %7 %12 %12 %12 %12
         %25 = OpCompositeConstruct %8 %21 %22 %23 %24
               OpStore %10 %25
         %26 = OpLoad %8 %10
         %27 = OpExtInst %6 %1 Determinant %26
         %28 = OpExtInst %6 %1 FAbs %27
         %31 = OpFOrdLessThan %30 %28 %29
               OpSelectionMerge %33 None
               OpBranchConditional %31 %32 %37
         %32 = OpLabel
               OpStore %35 %36
               OpBranch %33
         %37 = OpLabel
               OpStore %35 %38
               OpBranch %33
         %33 = OpLabel
               OpReturn
               OpFunctionEnd
END

# uniforms for variant

# one
BUFFER variant_one DATA_TYPE float 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_one 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
