blob: b483da8e35af88eeb6dff9682a035a84ecb54501 [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 = 512, local_size_y = 1) in;
layout(std430) buffer;
#include <impeller/path.glsl>
layout(binding = 0) buffer Quads {
uint count;
QuadData data[];
}
quads;
layout(binding = 1) buffer Polyline {
uint count;
vec2 data[];
}
polyline;
uniform Config {
float tolerance;
}
config;
shared uint point_counts[512];
shared uint count_sums[512];
void main() {
uint ident = gl_GlobalInvocationID.x;
QuadData quad;
QuadDecomposition decomposition;
if (ident < quads.count) {
quad = quads.data[ident];
decomposition = DecomposeQuad(quad, config.tolerance);
point_counts[ident] = uint(decomposition.line_count);
}
barrier();
if (decomposition.line_count == 0) {
return;
}
count_sums[ident] = subgroupInclusiveAdd(point_counts[ident]);
polyline.count = count_sums[quads.count - 1] + 1;
polyline.data[0] = quads.data[0].p1;
// In theory this could be unrolled into a separate shader, but in practice
// line_count usually pretty low and currently lack benchmark data to show
// how much it would even help.
for (uint i = 1; i < decomposition.line_count; i += 1) {
uint offset = count_sums[ident] - uint(decomposition.line_count);
polyline.data[offset + i] = GenerateLineFromQuad(quad, i, decomposition);
}
polyline.data[count_sums[ident]] = quad.p2;
}