blob: a2249f56cafc9fe21ea81d7640f972442aef4110 [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) readonly buffer Cubics {
uint count;
CubicData data[];
}
cubics;
layout(binding = 1) buffer Quads {
uint count;
QuadData data[];
}
quads;
uniform Config {
float accuracy;
}
config;
shared uint quad_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;
CubicData cubic;
uint quad_count = 0;
if (ident < cubics.count) {
cubic = cubics.data[ident];
quad_count = EstimateQuadraticCount(cubic, config.accuracy);
quad_counts[ident] = quad_count;
}
barrier();
if (quad_count == 0) {
return;
}
count_sums[ident] = subgroupInclusiveAdd(quad_counts[ident]);
quads.count = ComputePosition(cubics.count - 1);
uint offset = ComputePosition(ident) - quad_count;
for (uint i = 0; i < quad_count; i++) {
quads.data[offset + i] = GenerateQuadraticFromCubic(cubic, i, quad_count);
}
}