In order to draw a bezier path, it needs to be broken into triangles somehow for GL to process. The solution I opted for was to use the same scanline rasterisation algorithm as the software renderer uses, so that it's effectively building the shape out of one-pixel-high rectangles. This gives the exact same anti-aliasing as the software renderer gets, but is faster because it doesn't need to do any compositing.
The alternative way to do it is to triangulate the path, but that's really not much easiler in terms of algorithmic complexity, and although it's fewer triangles for the GPU to handle, it means that the only way to anti-alias is relies on the GPU multi-sampling, which isn't available (or very good) on all devices.
But in either method the bottleneck is the CPU flattening beziers into something the GPU can process.. Ideally, we'd like to just throw the raw bezier data at the GPU and let it handle it while the CPU does something else, but GLSL isn't built for that kind of task. It can be done with openCL, but that's not available on all devices.. The next-gen APIs will be better though - AFAICT Metal/Vulkan are a bit more openCL-like, so we should be able to build a really great renderer on there.
