Первое что стоит понимать, у Skia апи, которое соотвествует скорее софтварной растеризации, а бекенд под OpenGL, Vulkan, etc появился позже. Хотя возможно правильнее называть это path renderer. Поэтому если вам не нужны например кривые безье, то кажется можно меньшеми усилиями и возможно с лучшим первом добиться аналогичного результа.
Нас интересует метод drawPath, а именно как рисуется Round/Miter/Bevel соединения ребер. Они создают треугольники в тесселяционном шейдере: Из явных плюсов создания треугольников на лету, меньшее потребление памяти, загруженность шины, из минусов, большее количество вычислений, загрузка гпу.
В целом гпу рендер работает как-то так:
- тесселяция пути
- рисование в стенсил
- рисование цвета Собственно вот ссылочка на статью https://www.researchgate.net/publication/262357352_GPU-accelerated_Path_Rendering с более подробным описанием.
https://skia.googlesource.com/skia/+/refs/heads/master/src/gpu/tessellate/GrStrokeTessellateShader.h#26 https://github.com/google/skia/blob/master/src/gpu/tessellate/GrStrokeTessellateShader.cpp#L271 Собственно то что нас инетересует как происходит соединение сегметов. Тут мы видим передается в шейдер сколько не полноценных сегментов нам понадобится. Для round 0 так как зависит от угла. Бтв я делал по другому, считал честные треугольники сегмента линии, в угле двигая смежные вершины на биссектрису и добавляя доп треугольник(и), но это не будет работать с не линями. Собственно статья на тему с пояснениям, что да как https://arxiv.org/pdf/2007.00308.pdf https://github.com/google/skia/blob/master/src/gpu/tessellate/GrStrokeTessellateShader.cpp#L822
По поводу софтварной реализации, как-то ничего не нашел (есть такое: https://github.com/google/skia/blame/master/src/gpu/ops/GrAAConvexTessellator.cpp#L589, но это не совсем то, как минимум потому что про другое, а как максимум потому что нет Round) Есть подозрения, что ничего не мешает им запускать тесселяцию в своих шейдерах на процессоре (https://skia.googlesource.com/skia/+/refs/heads/master/src/gpu/tessellate/GrStrokeTessellateShader.h#31), хотя возможно я не прав.
https://github.com/google/skia/tree/master/src/gpu/ccpr если вдруг заинтересует это про их метод пиксельного сглаживания пути, эти нехорошие люди даже патент вроде получили лол, метод основывается на каком то хитром подсчете площади покрытия пикселя путем.