#!amber
# Copyright 2020 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 vec4 position;
layout(location = 0) out vec4 frag_color;

layout(set = 0, binding = 1) readonly uniform block0
{
    vec4 in_color;
};

void main()
{
    gl_Position = position;
    frag_color = in_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 buf_unused DATA_TYPE vec4<float> DATA
0.0 0.0 0.0 0.0
1.0 1.0 1.0 1.0
2.0 2.0 2.0 2.0
END

# The Vulkan spec lists the maximum value of minStorageBufferOffsetAlignment
# (i.e. the maximum possible alignment requirement) as 256 bytes.
# Meaningful data is placed at this offset.
BUFFER buf DATA_TYPE vec4<float> DATA
1.0 0.0 0.0 1.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 1.0 0.0 1.0
END

BUFFER framebuffer FORMAT B8G8R8A8_UNORM

PIPELINE graphics pipeline0
  ATTACH vtex_shader
  ATTACH frag_shader

  BIND BUFFER buf_unused AS uniform_dynamic DESCRIPTOR_SET 0 BINDING 0 OFFSET 0
  BIND BUFFER buf AS uniform_dynamic DESCRIPTOR_SET 0 BINDING 1 OFFSET 0
  BIND BUFFER framebuffer AS color LOCATION 0

  FRAMEBUFFER_SIZE 256 256
END

PIPELINE graphics pipeline1
  ATTACH vtex_shader
  ATTACH frag_shader

  BIND BUFFER buf AS uniform_dynamic DESCRIPTOR_SET 0 BINDING 1 OFFSET 256
  BIND BUFFER framebuffer AS color LOCATION 0

  FRAMEBUFFER_SIZE 256 256
END

CLEAR_COLOR pipeline0 0 0 0 255
CLEAR pipeline0
RUN pipeline0 DRAW_RECT POS 0 0 SIZE 128 128
RUN pipeline1 DRAW_RECT POS 128 128 SIZE 128 128

EXPECT framebuffer IDX 0 0 SIZE 128 128 EQ_RGBA 255 0 0 255
EXPECT framebuffer IDX 128 0 SIZE 128 128 EQ_RGBA 0 0 0 255
EXPECT framebuffer IDX 128 128 SIZE 128 128 EQ_RGBA 0 255 0 255
EXPECT framebuffer IDX 0 128 SIZE 128 128 EQ_RGBA 0 0 0 255
