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

DEVICE_FEATURE fragmentStoresAndAtomics

SHADER vertex vert_shader PASSTHROUGH
SHADER fragment frag_shader GLSL
#version 430

struct SubData {
  int c;
  float d;
};

layout(location = 0) out vec4 color_out;
layout(std140, binding = 0) readonly buffer InData {
  float a;
  int b;
  SubData e;
} in_data;

layout(std140, binding = 1) writeonly buffer OutData {
  float a;
  int b;
  SubData e;
} out_data;

void main() {
  color_out = vec4(1, 1, 1, 1);
  out_data.a = in_data.a;
  out_data.b = in_data.b;
  out_data.e.c = in_data.e.c;
  out_data.e.d = in_data.e.d;
}
END

STRUCT sub_data
  int32 c
  float d
END

STRUCT my_data
  float a
  int32 b
  sub_data e
END

BUFFER in_data DATA_TYPE my_data STD140 DATA
1.1  # a
220  # b
1024 # e.c
2.4  # e.d
END

BUFFER out_data DATA_TYPE my_data STD140 SIZE 1 FILL 0

BUFFER framebuffer FORMAT B8G8R8A8_UNORM

PIPELINE graphics my_pipeline
  ATTACH vert_shader
  ATTACH frag_shader

  BIND BUFFER framebuffer AS color LOCATION 0
  BIND BUFFER in_data AS storage DESCRIPTOR_SET 0 BINDING 0
  BIND BUFFER out_data AS storage DESCRIPTOR_SET 0 BINDING 1
END

RUN my_pipeline DRAW_RECT POS 0 0 SIZE 250 250
EXPECT out_data EQ_BUFFER in_data
EXPECT out_data IDX 0 EQ 1.1 220 1024 2.4
