blob: e581775bbac44698d3b4ac629b1676eece21b683 [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];
uint ComputePosition(uint index) {
if (index < gl_SubgroupSize) {
return count_sums[index];
}
int position = -1;
uint count_sum = count_sums[index];
do {
position += int(gl_SubgroupSize);
count_sum += count_sums[position];
} while (position < index);
return count_sum;
}
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 = ComputePosition(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.
uint position = ComputePosition(ident);
uint offset = position - uint(decomposition.line_count);
for (uint i = 1; i < decomposition.line_count; i += 1) {
polyline.data[offset + i] = GenerateLineFromQuad(quad, i, decomposition);
}
polyline.data[position] = quad.p2;
}