#!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 inst combine and or xor 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_0 _GLF_uniform_int_values[0]
# #define _int_1 _GLF_uniform_int_values[1]
# #define _float_0_0 _GLF_uniform_float_values[0]
# #define _float_1_0 _GLF_uniform_float_values[1]
#
# precision highp float;
#
# precision highp int;
#
# // Contents of _GLF_uniform_int_values: [0, 1]
# layout(set = 0, binding = 0) uniform buf0
# {
#     int _GLF_uniform_int_values[2];
# };
#
# // Contents of _GLF_uniform_float_values: [0.0, 1.0]
# layout(set = 0, binding = 1) uniform buf1
# {
#     float _GLF_uniform_float_values[2];
# };
#
# layout(location = 0) out vec4 _GLF_color;
#
# void main()
# {
#     float data[2];
#     data[_int_0] = _float_0_0;
#     data[_int_1] = _float_1_0;
#     float a = data[(1 ^ (_int_1 & 2))];
#     if (a == _float_1_0)
#     {
#         _GLF_color = vec4(_float_1_0, _float_0_0, _float_0_0, _float_1_0);
#     }
#     else
#     {
#         _GLF_color = vec4(_float_0_0);
#     }
# }
SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 8
; Bound: 67
; 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 %11 "data"
               OpName %14 "buf0"
               OpMemberName %14 0 "_GLF_uniform_int_values"
               OpName %16 ""
               OpName %22 "buf1"
               OpMemberName %22 0 "_GLF_uniform_float_values"
               OpName %24 ""
               OpName %36 "a"
               OpName %53 "_GLF_color"
               OpDecorate %13 ArrayStride 16
               OpMemberDecorate %14 0 Offset 0
               OpDecorate %14 Block
               OpDecorate %16 DescriptorSet 0
               OpDecorate %16 Binding 0
               OpDecorate %21 ArrayStride 16
               OpMemberDecorate %22 0 Offset 0
               OpDecorate %22 Block
               OpDecorate %24 DescriptorSet 0
               OpDecorate %24 Binding 1
               OpDecorate %53 Location 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeFloat 32
          %7 = OpTypeInt 32 0
          %8 = OpConstant %7 2
          %9 = OpTypeArray %6 %8
         %10 = OpTypePointer Function %9
         %12 = OpTypeInt 32 1
         %13 = OpTypeArray %12 %8
         %14 = OpTypeStruct %13
         %15 = OpTypePointer Uniform %14
         %16 = OpVariable %15 Uniform
         %17 = OpConstant %12 0
         %18 = OpTypePointer Uniform %12
         %21 = OpTypeArray %6 %8
         %22 = OpTypeStruct %21
         %23 = OpTypePointer Uniform %22
         %24 = OpVariable %23 Uniform
         %25 = OpTypePointer Uniform %6
         %28 = OpTypePointer Function %6
         %30 = OpConstant %12 1
         %39 = OpConstant %12 2
         %47 = OpTypeBool
         %51 = OpTypeVector %6 4
         %52 = OpTypePointer Output %51
         %53 = OpVariable %52 Output
          %4 = OpFunction %2 None %3
          %5 = OpLabel
         %11 = OpVariable %10 Function
         %36 = OpVariable %28 Function
         %19 = OpAccessChain %18 %16 %17 %17
         %20 = OpLoad %12 %19
         %26 = OpAccessChain %25 %24 %17 %17
         %27 = OpLoad %6 %26
         %29 = OpAccessChain %28 %11 %20
               OpStore %29 %27
         %31 = OpAccessChain %18 %16 %17 %30
         %32 = OpLoad %12 %31
         %33 = OpAccessChain %25 %24 %17 %30
         %34 = OpLoad %6 %33
         %35 = OpAccessChain %28 %11 %32
               OpStore %35 %34
         %37 = OpAccessChain %18 %16 %17 %30
         %38 = OpLoad %12 %37
         %40 = OpBitwiseAnd %12 %38 %39
         %41 = OpBitwiseXor %12 %30 %40
         %42 = OpAccessChain %28 %11 %41
         %43 = OpLoad %6 %42
               OpStore %36 %43
         %44 = OpLoad %6 %36
         %45 = OpAccessChain %25 %24 %17 %30
         %46 = OpLoad %6 %45
         %48 = OpFOrdEqual %47 %44 %46
               OpSelectionMerge %50 None
               OpBranchConditional %48 %49 %63
         %49 = OpLabel
         %54 = OpAccessChain %25 %24 %17 %30
         %55 = OpLoad %6 %54
         %56 = OpAccessChain %25 %24 %17 %17
         %57 = OpLoad %6 %56
         %58 = OpAccessChain %25 %24 %17 %17
         %59 = OpLoad %6 %58
         %60 = OpAccessChain %25 %24 %17 %30
         %61 = OpLoad %6 %60
         %62 = OpCompositeConstruct %51 %55 %57 %59 %61
               OpStore %53 %62
               OpBranch %50
         %63 = OpLabel
         %64 = OpAccessChain %25 %24 %17 %17
         %65 = OpLoad %6 %64
         %66 = OpCompositeConstruct %51 %65 %65 %65 %65
               OpStore %53 %66
               OpBranch %50
         %50 = OpLabel
               OpReturn
               OpFunctionEnd
END

# uniforms for variant

# _GLF_uniform_float_values
BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
 0.0 1.0
END
# _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_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
  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
