#!amber

# Copyright 2018 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 bug found by GraphicsFuzz.

# A fragment shader that uses pow.
# Derived from the following GLSL fragment shader.
# We check that all pixels are red. The test passes because main does
# some computation and then writes red to _GLF_color.

# #version 310 es
#
# precision highp float;
# precision highp int;
#
# layout(location = 0) out vec4 _GLF_color;
#
# void main()
# {
#  vec2 a = vec2(1.0);
#  vec4 b = vec4(1.0);
#  pow(vec4(a, vec2(1.0)), b);
#  _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
# }

SHADER vertex variant_vertex_shader PASSTHROUGH

SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
; SPIR-V
; Version: 1.0
; Generator: Khronos SPIR-V Tools Assembler; 0
; Bound: 28
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %2 "main" %3
               OpExecutionMode %2 OriginUpperLeft
               OpSource ESSL 310
               OpName %2 "main"
               OpName %4 "a"
               OpName %5 "b"
               OpName %3 "_GLF_color"
               OpDecorate %3 Location 0
          %6 = OpTypeVoid
          %7 = OpTypeFunction %6
          %8 = OpTypeFloat 32
          %9 = OpTypeVector %8 2
         %10 = OpTypePointer Function %9
         %11 = OpConstant %8 1
         %12 = OpConstantComposite %9 %11 %11
         %13 = OpTypeVector %8 4
         %14 = OpTypePointer Function %13
         %15 = OpConstantComposite %13 %11 %11 %11 %11
         %16 = OpTypePointer Output %13
          %3 = OpVariable %16 Output
         %17 = OpConstant %8 0
         %18 = OpConstantComposite %13 %11 %17 %17 %11
          %2 = OpFunction %6 None %7
         %19 = OpLabel
          %4 = OpVariable %10 Function
          %5 = OpVariable %14 Function
               OpStore %4 %12
               OpStore %5 %15
         %20 = OpLoad %9 %4
         %21 = OpCompositeExtract %8 %20 0
         %22 = OpCompositeExtract %8 %20 1
         %23 = OpCompositeExtract %8 %12 0
         %24 = OpCompositeExtract %8 %12 1
         %25 = OpCompositeConstruct %13 %21 %22 %23 %24
         %26 = OpLoad %13 %5
         %27 = OpExtInst %13 %1 Pow %25 %26
               OpStore %3 %18
               OpReturn
               OpFunctionEnd
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
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
