// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#extension GL_KHR_shader_subgroup_arithmetic : enable

#define N_ROWS 8
#define LG_WG_SIZE 9
#define WG_SIZE (1 << LG_WG_SIZE)

layout(local_size_x = WG_SIZE, local_size_y = 1) in;
layout(std430) buffer;

layout(binding = 0) buffer Polyline {
  uint count;
  vec2 data[];
}
polyline;

layout(binding = 1) buffer VertexBuffer {
  vec2 position[];
}
vertex_buffer;

layout(binding = 2) buffer VertexBufferCount {
  uint count;
}
vertex_buffer_count;

uniform Config {
  float width;
  uint cap;
  uint join;
  float miter_limit;
}
config;

vec2 compute_offset(uint index) {
  vec2 direction = normalize(polyline.data[index + 1] - polyline.data[index]);
  return vec2(-direction.y, direction.x) * config.width * .5;
}

void main() {
  uint ident = gl_GlobalInvocationID.x;
  if (ident >= polyline.count || ident == 0) {
    return;
  }

  atomicAdd(vertex_buffer_count.count, 4);

  uint index = ident - 1;
  vec2 offset = compute_offset(index);
  vertex_buffer.position[index * 4 + 0] = polyline.data[ident - 1] + offset;
  vertex_buffer.position[index * 4 + 1] = polyline.data[ident - 1] - offset;
  vertex_buffer.position[index * 4 + 2] = polyline.data[ident] + offset;
  vertex_buffer.position[index * 4 + 3] = polyline.data[ident] - offset;

  // TODO(dnfield): Implement other cap/join mechanisms.
  if (ident == polyline.count - 1) {
    vertex_buffer.position[index * 4 + 4] = vec2(140, 20);
    vertex_buffer.position[index * 4 + 5] = vec2(140, 20);
    atomicAdd(vertex_buffer_count.count, 2);
  }
}
