Vello contains two renderer families:
vello_cpu, a CPU-only renderer, andvello_gpu, a GPU-accelerated renderer, both based on the Sparse Strips architecture.- The experimental
vellorenderer, which is based on compute shaders.
See the project README for renderer selection and package migration guidance.
The project aims to provide high-quality, high-performance 2D rendering for GUI applications, creative tools, scientific visualization, and similar workloads. Its implementations explore how CPU SIMD, multithreading, conventional GPU rasterization, and GPU compute can be applied to vector graphics.
Vello CPU and Vello GPU share a CPU-side pipeline implemented primarily in
vello_common. Paths are flattened, binned into tiles, and represented as
sparse horizontal strips. Coverage data is retained where it is needed around
path boundaries, while fully covered regions can be represented compactly. This
limits intermediate work and memory to the parts of the scene that affect the
final image.
The resulting representation can be consumed by different backends:
vello_cpurasterizes and composites the strips into a CPU pixmap. It uses SIMD and can use multiple threads, but requires no GPU.vello_gpuperforms the same broad preprocessing on the CPU, then uploads scheduled strips and paint data for GPU rasterization and compositing. Its wgpu and WebGL2 backends use vertex and fragment rendering rather than requiring compute shaders.
The two renderers share geometry, tiling, paint, image, filter, and strip data
structures through vello_common, as well as test scenes and snapshot
infrastructure under vello_tests. Text and glyph-run support is shared through
glifo.
The design grew from the sparse rendering approach described in Potato: a hybrid CPU/GPU 2D renderer design. The Vello CPU thesis provides a more detailed explanation of the pipeline, although parts of the description in the thesis are already outdated and implementation details continue to evolve.
The package published as vello is the original compute-centric renderer. A
scene is encoded into compact path, draw, transform, and resource buffers. Those
buffers are resolved into a Recording of GPU operations, and WgpuEngine
uploads resources and dispatches the compute pipeline. Prefix-scan algorithms
parallelize work that traditional renderers often perform sequentially.
This approach can perform very well on dynamic, vector-heavy scenes, but it
requires compute shader support and has different compatibility and memory
trade-offs from the Sparse Strips renderers. It remains under research/
together with its dedicated shaders, examples, tests, and design history.
CPU implementations of parts of the compute pipeline live in
research/vello_shaders/src/cpu. They are used for testing and debugging; they
do not provide a complete standalone CPU renderer. Use vello_cpu for that.
The user-facing Sparse Strips implementation is organized at the root:
vello_common/— shared geometry, tiling, paint, and strip infrastructure.vello_cpu/— CPU renderer.vello_gpu/— GPU renderer with CPU-side preprocessing.vello_gpu_shaders/— WESL sources and generated WGSL/GLSL used byvello_gpu.glifo/— text and glyph-run support shared by the Sparse Strips renderers.vello_tests/— shared integration tests, snapshots, scenes, and browser tooling.vello_bench/— Sparse Strips benchmarks.
Compute-centric packages and support code are grouped under research/:
research/vello_research/— source for the publishedvellopackage.research/vello_encoding/— compact scene encoding used byvello.research/vello_shaders/— compute shaders, preprocessing, and CPU reference kernels.research/vello_research_tests/— compute-renderer tests and snapshots.research/examples/— standalone compute-renderer examples.research/xtask/— snapshot and comparison maintenance tooling.research/doc/— historical design documents, roadmaps, and blog links.
Vello GPU shaders are authored as WESL in vello_gpu_shaders/shaders. The crate
links them into WGSL and can generate GLSL plus reflection metadata for the
WebGL2 backend.
The compute renderer uses WGSL sources in research/vello_shaders/shader.
Because WGSL has no built-in metaprogramming, these shaders use a small
preprocessor supporting:
import, which imports shared code fromshader/shared.ifdef,ifndef,else, andendif, controlled by definitions supplied outside the shader.
This format is compatible with wgsl-analyzer. New imports must also be
listed in .vscode/settings.json for editor support.
Historical documents about the compute renderer are in research/doc/.
blogs.md links to development articles, and the
2023 roadmap records earlier project goals. The
path segment encoding document describes the compute
renderer's compact path representation.