blob: 3748a7a0f39733f5d6fac43c0da50a0c8cbc1cfb [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];
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 = count_sums[cubics.count - 1];
for (uint i = 0; i < quad_count; i++) {
uint offset = count_sums[ident] - quad_count;
quads.data[offset + i] = GenerateQuadraticFromCubic(cubic, i, quad_count);
}
}