# Copyright 2019 The Amber Authors.
#
# 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
#
#     https://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.

[vertex shader]
#version 430

layout(location = 0) in vec4 position;
layout(location = 0) out vec4 frag_color;

void main() {
  const vec4 color[4] =
    { vec4(1.,0.,0.,1.),
      vec4(0.,1.,0.,1.),
      vec4(0.,0.,1.,1.),
      vec4(1.,0.,1.,1.)};

  const vec4 pos[4] =
    { vec4(0. ,0. ,0. ,0. ),
      vec4(0. ,1. ,0. ,0.),
      vec4(1., 0., 0., 0),
      vec4(1. ,1.,0., 0.)};

  gl_Position = position + pos[gl_InstanceIndex % 4];
  frag_color = color[gl_InstanceIndex % 4];
}

[fragment shader]
#version 430

layout(location = 0) in vec4 frag_color;
layout(location = 0) out vec4 final_color;

void main() {
  final_color = frag_color;
}

[vertex data]
#        position
     0/R8G8_SNORM

#   Quarter frame
#         R8   G8
        -128  -128
           0  -128
           0     0

        -128   -128
        -128      0
           0      0

[test]
clear

draw arrays instanced TRIANGLE_LIST 0 6 4
relative probe rect rgba (0.0, 0.0, 0.5, 0.5) (1.0, 0.0, 0.0, 1.0)
relative probe rect rgba (0.5, 0.0, 0.5, 0.5) (0.0, 0.0, 1.0, 1.0)
relative probe rect rgba (0.0, 0.5, 0.5, 0.5) (0.0, 1.0, 0.0, 1.0)
relative probe rect rgba (0.5, 0.5, 0.5, 0.5) (1.0, 0.0, 1.0, 1.0)
