Changelog

The latest published Vello release is 0.6.0 which was released on 2025-10-03. You can find its changes documented below.

Unreleased

This release has an MSRV of 1.86.

0.6.0 - 2025-10-03

This release has an MSRV of 1.86.

Added

  • register_texture, a helper for using wgpu textures in a Vello Renderer. (#1161 by @DJMcNab)
  • push_luminance_mask_layer, content within which is used as a luminance mask. (#1183 by @DJMcNab).
    This is a breaking change to Vello Encoding.
  • push_clip_layer, which replaces the previous push_layer using Mix::Clip, and has fewer footguns. (#1192 by @DJMcNab)
    This is not a breaking change, as Mix::Clip is still supported (although it is deprecated).
  • Support for BGRA format images (as input). (#1173 by @sagudev)

Changed

  • Breaking change: wgpu has been updated to wgpu 26. (#1096 by @waywardmonkeys)
    This has been chosen to match the version used by Bevy 0.17. (Note that we do not guarantee that our latest release will always match Bevy's wgpu version.)
  • Breaking change: Put wgpu‘s default features behind a wgpu_default feature flag. (#1229 by @StT191)
    If you’re using Vello with default features enabled, then no change is needed.
  • Breaking change: Updated Peniko to v0.5.0. (#1224 by @DJMcNab)
    This brings several important changes which allow Vello to be used in more use cases:
    • Breaking change: Gradients must have their alpha interpolation space specified. For this, you should use InterpolationAlphaSpace::Premultiplied, unless you are implementing a specification which indicates otherwise. Currently, only InterpolationAlphaSpace::Premultiplied is supported.
    • Breaking change: Gradient kinds now have a corresponding struct. For example, GradientKind::Linear {...} is now LinearGradientPosition {...}.into(). This makes it possible to pass individual gradient kinds between functions.
    • GradientKind::Sweep's defined semantics now match those which Vello previously implemented.
    • Breaking change: Image has been renamed to ImageBrush, consisting of an ImageData and an ImageSampler. The equivalent to the old Image::new($data, $format, $width, $height) is ImageBrush::new(ImageData { data: $data, format: $format, width: $width, height: $height, alpha_type: ImageAlphaType::Alpha }) (or ImageData { ... }.into() if you don't need to set sampler parameters).
    • Breaking change: vello::peniko::Font is now called vello::peniko::FontData. This type is also now provided by Linebender Resource Handle.
  • We now treat Vello‘s shaders as trusted for memory safety purposes. (#1093 by @sagudev)
    If you’re using Vello in a security critical environment with user-controlled content, you should audit these shaders yourself, or open an issue to request that these bounds checks are re-enabled.

Linebender Resource Handle

The vello::peniko::Font type used in Vello used to be provided by the Peniko crate, and this was used as vocabulary types for font resources between crates. However, this means that when Peniko made semver-incompatible releases, crates which used this type could no longer (easily) interoperate. To resolve this, vello::peniko::FontData (which is the same type but renamed) is now a re-export from a new crate called Linebender Resource Handle. These types have identical API as in previous releases, but will now be the same type across Peniko versions.

Fixed

  • Examples crashing when window is resized to zero. (#1182 by @xStrom)
  • Correct flattening tolerance calculation from 2D affine transforms. (#1187 by @tomcur)
  • Zero-width strokes were previously treated as fills. (#785 by @DJMcNab)
  • Vello no longer writes to the console, instead outputting to log. (#1017 by @DJMcNab)

0.5.1 - 2025-08-22

This release has an MSRV of 1.85.

Changed

0.5.0 - 2025-05-08

This release has an MSRV of 1.85.

Added

 RendererOptions {
     // ...
+    ..Default::default()
 }

Removed

  • Breaking: Renderer::render_to_surface has been removed. (#803 by @DJMcNab)
    This API was not fit for purpose, as it assumed that you would only ever use a single window. The new recommended way to use Vello to render to a surface is to use Renderer::render_to_texture to render to an intermediate texture, then blit from that to the surface yourself. We suggest using the TextureBlitter utility from wgpu. For users of the util module, it has been updated to create a suitable blit pipeline and intermediate texture for each surface.
+let target_view = /* cached: device.create_texture(/* size of surface*/).create_view(...) */;
- device.render_to_surface(..., &surface_texture, ...);
+ device.render_to_texture(..., &target_view, ...);
+let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
+    label: Some("Surface Blit"),
+});
+blitter.copy(
+    &device,
+    &mut encoder,
+    &target_view,
+    &surface_texture.create_view(&wgpu::TextureViewDescriptor::default()),
+);
+queue.submit([encoder.finish()]);

Changed

  • Breaking: wgpu has been updated to wgpu 24. (#791 by @songhuaixu) This has been chosen to match the version used by Bevy 0.16. (Note that we do not guarantee that our latest release will always match Bevy's wgpu version)
  • Breaking: override_image has been updated to remove its use of Arc, as wgpu::Textures are now internally reference counted. (#802 by @DJMcNab)

0.4.1 - 2025-03-10

This release has an MSRV of 1.82.

Fixed

  • Incorrect COLR Emoji Rendering (#841 by @dfrg)

0.4.0 - 2025-01-20

This release has an MSRV of 1.82.

Highlights

As part of an initiative to improve color handling across the ecosystem (and especially within Linebender crates), Vello is now using the new color crate. This is the first step towards providing richer color functionality, better handling of color interpolation, and more.

This release intentionally uses wgpu 23.0.1 rather than 24.0.0 so that it can match the version used in Bevy 0.15.

Changed

  • Breaking: Updated wgpu to 23.0.1 (#735, #743 by @waywardmonkeys)
  • Breaking: Updated to new peniko and color is now used for all colors (#742 by @waywardmonkeys)
  • Breaking: As part of the update to color, the byte order of vello_encoding::DrawColor is changed (#758 by @waywardmonkeys, #796 by @tomcur).
  • Breaking: The full feature is no longer present as the full pipeline is now always built (#754 by @waywardmonkeys)
  • The r8 permutation of the shaders is no longer available (#756 by @waywardmonkeys)
  • Breaking: The buffer_labels feature is no longer present as the labels are always configured (#757 by @waywardmonkeys)
  • Breaking: Use a type alias for i16 rather than skrifa::NormalizedCoord in the public API (#747 by @nicoburns)

Fixed

  • Offset in image rendering, and sampling outside correct atlas area (#722 by @dfrg)
  • Inference conflict when using Kurbo's schemars feature (#733 by @ratmice)
  • Detection of PNG format bitmap fonts, primarily for Apple systems (#740 by @LaurenzV)
  • Support image extend modes, nearest-neighbor sampling and alpha (#766 by @dfrg)
  • Correct vertical offset for Apple Color Emoji (#792 by @dfrg)

0.3.0 - 2024-10-04

This release has an MSRV of 1.75.

Highlights

Added

  • Access to the Adapter from the utils DeviceHandle (#634 by @cfagot)
  • Support for compositing existing wgpu::Textures into a Vello scene (#636, #655 by @DJMcNab, @TrueDoctor)
  • Utilities for constructing an AaSupport from a set of AaConfigs (#654 by @simbleau)
  • An example which uses sdl2 (#671 by @TheNachoBIT)
  • The underlying Encoding for a scene can now be modified, circumventing guardrails for advanced use-cases (#701 by @timtom-dev)

Changed

Fixed

  • Example code in the repository README (#627 by @kmoon2437)
  • A possible crash on iOS working around an invariant undocumented by Apple (#639 by @DJMcNab)
  • Large number of clips now work (#659 by @raphlinus)
  • Empty clips now no longer cause artifacts (#651 by @raphlinus)
  • A potential panic in the presence of a weaker than default allocator (#675 by @timtom-dev)
  • Watertightness breaks causing artifacts with some rounded rectangles (#695 by @raphlinus)

Removed

  • Breaking: Pipelines API from vello_shaders (#612 by @DJMcNab)
  • The wgpu_profiler profiler feature is no longer stable (#694 by @DJMcNab)
  • Breaking: Moved the Recording abstraction into a low_level module, as almost all users should prefer the higher-level Renderer (#711 by @DJMcNab)

0.2.1 - 2024-07-16

This release has an MSRV of 1.75.

Fixed

Changed

0.2.0 - 2024-06-08

This release has an MSRV of 1.75.

Added

Changed

Removed

Fixed

0.1.0 - 2024-03-04

  • Initial release