blob: 5d9cf55fafa4b4b851e123732a6e3cad9fdfc5bb [file] [log] [blame]
// 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
layout(local_size_x = 256, 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) {
// This is ok because there is no barrier() below.
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] = polyline.data[ident] + offset;
vertex_buffer.position[index * 4 + 5] = polyline.data[ident] - offset;
atomicAdd(vertex_buffer_count.count, 2);
}
}