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

SHADER vertex vtex_shader GLSL
#version 430

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


void main() {
  gl_Position = vec4(position, 1.0);
  frag_color = ver_color;
}
END

SHADER fragment frag_shader GLSL
#version 430

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

void main() {
  final_color = frag_color;
}
END

BUFFER position_buf DATA_TYPE vec3<float> DATA
-1  1 0
-1 -1 0
 1  1 0
 1 -1 0
-1 -1 0
 1  1 0
END

BUFFER vert_color_buf DATA_TYPE R8G8B8A8_UNORM DATA
255   0   0 255
255   0   0 255
255   0   0 255
255   0   0 255
255   0   0 255
255   0   0 255
END

BUFFER framebuffer FORMAT B8G8R8A8_UNORM

PIPELINE graphics pipeline
  ATTACH vtex_shader
  ATTACH frag_shader

  VERTEX_DATA position_buf LOCATION 0
  VERTEX_DATA vert_color_buf LOCATION 1

  FRAMEBUFFER_SIZE 250 250
  BIND BUFFER framebuffer AS color LOCATION 0

END

RUN pipeline DRAW_RECT POS 100 100 SIZE 100 100
EXPECT framebuffer IDX 100 100 SIZE 100 100 EQ_RGBA 255 0 0 255
