Changelog

Unreleased

This release has an MSRV of 1.89.

Added

  • Renderer probing in the wgpu backend through Renderer::probe, with the probe feature. (by @LaurenzV)
  • WebGlRenderer::begin_with_precompiled adopts the canvas, WebGL context, and shader programs set up by the JavaScript module in vello_gpu_shaders::webgl_bootstrap::JS_MODULE, so compilation can start before the WebAssembly module is downloaded and instantiated. Programs that can't be adopted are reported with WebGlError::IncompatiblePrecompiledShaders.
  • WebGlRendererInit::is_ready for non-blocking readiness checks. WebGL initialization now flushes compile commands immediately, so compilation starts even if the caller keeps the main thread busy.

Fixed

  • A potential division by zero in clip_color for gray colors in the Color and Luminosity blend modes. (#2000 by @zlstringham)

0.3.0 - 2026-10-02

This release has an MSRV of 1.89.

As part of this release, “Vello Hybrid” has been renamed into “Vello GPU”.

Added

  • An unminified feature in vello_gpu_shaders for readable shader output. (#1851 by @grebmeg)
  • Non-blocking WebGL initialization through WebGlRenderer::begin and begin_with. (#1823 by @grebmeg)
  • Scene::push_clip_rect for non-isolated rectangular clipping. (#1916 by @LaurenzV)
  • Support for ImageSampler::alpha. (#1880 by @LaurenzV)

Changed

  • Breaking change: Renamed the vello_hybrid crate to vello_gpu. HybridGlyphRunBackend is now GpuGlyphRunBackend. (#1883 by @grebmeg, #1918 by @LaurenzV)
  • Breaking change: Updated wgpu to v30 and fearless_simd to v0.7.0. (#1909, #1853 by @LaurenzV)
  • Breaking change: External textures now use Scene::set_paint, replacing draw_texture_rects and adding support for arbitrary shapes, extend modes, and transparency hints. (#1812, #1813, #1824 by @LaurenzV)
  • Breaking change: Depth buffering is now optional, with caller-owned depth textures in wgpu and a use_depth_buffer argument in WebGL. (#1808, #1810 by @grebmeg)
  • Breaking change: Rendering now accepts configurable target clears through TargetInit in wgpu and a clear color in WebGL. (#1869 by @LaurenzV)
  • Breaking change: WebGL operations now return structured WebGlError results. (#1892 by @LaurenzV, #1921 by @grebmeg)
  • Breaking change: RenderSize, RenderTargetConfig, atlas configuration, and related dimensions now use u16. (#1826, #1891 by @LaurenzV)
  • Breaking change: Image atlases now use individual 2D textures, and atlas_texture takes an AtlasId. (#1859 by @LaurenzV)
  • Breaking change: WebGL probes now support configurable features, depth-buffer testing, and per-cell statistics. (#1900, #1901, #1908 by @LaurenzV)
  • Breaking change: Renamed Scene::pop_clip_path to pop_clip. (#1942 by @LaurenzV)
  • Breaking change: GlyphRunBuilder::fill_glyphs and stroke_glyphs now return Result<(), glifo::GlyphRenderError>. (#1944 by @LaurenzV)
  • Expanded shared type re-exports. (#1881 by @LaurenzV)
  • WebGL context creation now requests failIfMajorPerformanceCaveat. (#1806 by @LaurenzV)
  • Bitmap glyphs now consistently use bilinear sampling (ImageQuality::Medium) instead of switching to bicubic sampling when downscaled. (#1970 by @LaurenzV)

Fixed

  • Fully transparent draws are no longer skipped, fixing missing output from filters such as flood effects. (#1966 by @AdrianEddy, @LaurenzV)
  • The std feature no longer implicitly enables wgpu. (#1822 by @taj-p)
  • Safari 15 probe crashes and incorrect filter rendering. (#1814, #1821 by @LaurenzV)
  • WebGL hangs on affected Intel GPUs. (#1830 by @LaurenzV)
  • Incorrect layer rendering and probe failures on affected Apple Silicon/Chrome versions. (#1864 by @LaurenzV)
  • Removed an artificial image-sampling offset. (#1878 by @LaurenzV)
  • Gradient cache collisions between premultiplied and unpremultiplied alpha interpolation. (#1932 by @LaurenzV)
  • Draws with non-invertible paint transforms are now skipped. (#1949 by @grebmeg)
  • Resetting a scene now also resets the aliasing threshold. (#1945 by @LaurenzV)
  • Incorrect placement of non-Apple sbix glyphs caused by the Apple Color Emoji workaround. (#1936 by @LaurenzV)
  • Incorrect sbix glyph placement caused by sign errors in bearing offsets. (#1939 by @LaurenzV)

Optimized

0.2.0 - 2026-08-07

This release has an MSRV of 1.88.

Added

  • Support for sampling from external textures through Scene::draw_texture_rects in the webgl backend, bringing it to parity with the wgpu backend. Textures are bound at render time through the new WebGlTextureBindings. (#1792 by @grebmeg)
  • ProbeResult::statistics, ProbeStatistics, and ProbeFeature for diagnosing which renderer-probe features and pixels differ from the reference output. (#1779 by @LaurenzV)
  • PROBE_ELEMENTS for inspecting the active features used by the WebGL compatibility probe. (#1801 by @LaurenzV)

Changed

  • Breaking change: Renderer::new, Renderer::new_with, WebGlRenderer::new, and WebGlRenderer::new_with now return the renderer and its associated Resources as a tuple. Resources can no longer be constructed directly and must only be used with the renderer instance that generated it. (#1794 by @LaurenzV)
  • Breaking change: Scene::new_with now takes a Level instead of RenderSettings. (#1794 by @LaurenzV)
  • Breaking change: WebGlRenderer::render and WebGlRenderer::render_to_atlas now take WebGlTextureBindings, providing the external textures referenced by the scene. Pass &WebGlTextureBindings::new() if the scene does not use any. (#1792 by @grebmeg)
  • Breaking change: Image-atlas allocation errors now include allocation and free-space diagnostics, while intermediate-texture failures use the new IntermediateTextureError variants for oversized allocations and texture-count limits. (#1778 by @grebmeg)

Fixed

  • Image tints with zero opacity now make the image fully transparent. (#1791 by @LaurenzV)
  • WebGL image-atlas allocation and growth on Mali-G52 GPUs, avoiding application-not-responding errors. (#1800 by @grebmeg)

Optimized

  • WebGL intermediate textures are destroyed before resized replacements are allocated, reducing peak texture memory while render targets grow. (#1781 by @LaurenzV)

0.1.0 - 2026-07-29

This release has an MSRV of 1.88.

Added

  • Inverse blurred rounded rectangles through the new invert parameter on Scene::fill_blurred_rounded_rect, enabling inset box shadows. (#1715 by @nicoburns)
  • Resources::new_with_config for configuring the image and glyph atlas used by resources. (#1750 by @grebmeg)
  • FilterPrimitive::DropShadowOnly for rendering a drop shadow without compositing the original input over it. (#1763 by @LaurenzV)
  • Scene::reset_and_resize, allowing a scene to be reused after its target size changes. (#1769 by @LaurenzV)

Changed

  • Breaking change: WebGlRenderer::probe is now asynchronous. It returns a WebGlPendingProbe, which can be polled with try_finish, avoiding a synchronous GPU-to-CPU readback stall and providing specific WebGL error codes on failure. (#1671, #1735 by @LaurenzV)
  • Breaking change: Vello Hybrid's core scene scheduling and rendering architecture has been rewritten, removing coarse rasterization. The rewrite improves layer performance, allows filter output beyond the root viewport, reduces memory use for filter-heavy scenes, and removes the need for scene constraints. (#1759 by @LaurenzV)
  • Breaking change: RenderSettings now contains MemorySettings, with separate image-atlas and intermediate-layer configuration. SceneConstraints and RenderError::SlotsExhausted have been removed, and LayersConfig allows applications to limit and tune intermediate textures. (#1759 by @LaurenzV)
  • WebGL APIs are now exported whenever the webgl feature is enabled, including on non-Wasm targets. (#1682 by @jesses-canva)
  • Relaxed the minimum versions of wasm-bindgen-related dependencies. (#1683 by @LaurenzV)

Fixed

  • Opaque image rendering when blend modes or masks are active. (#1697 by @LaurenzV)
  • Gaussian blur strength changing abruptly at decimation thresholds. (#1720 by @grebmeg)
  • Fast rectangle rendering at the maximum u16 coordinates. (#1666 by @dipeshbabu)
  • WebGL renderer resources are now deleted when dropped instead of relying on garbage collection, allowing renderers to be recreated safely after context loss. (#1674 by @LaurenzV)
  • WebGL probing after rendering filter layers no longer corrupts the renderer's atlas state. (#1734 by @LaurenzV)

Optimized

  • Image-atlas textures and intermediate filter/layer textures are allocated lazily, substantially reducing initial GPU memory use for scenes that do not use images, layers, or filters. (#1747, #1757, #1759 by @grebmeg, @LaurenzV)
  • Clip-path intersection by skipping rows outside the paths' shared vertical extent and locating the first relevant strip with binary search. (#1690, #1691 by @LaurenzV)
  • Gradient lookup-table generation. (#1726 by @LaurenzV)
  • Rendering opaque peniko::ImageData by computing and retaining its transparency hint during conversion. (#1760 by @tronical)

0.0.9 - 2026-05-30

This release has an MSRV of 1.88.

Fixed

0.0.8 - 2026-05-15

This release has an MSRV of 1.88.

Added

  • Support for sampling from external textures through Scene::draw_texture_rects. (#1552 by @tomcur)

    This method can sample many regions from a texture at once, allowing the texture to be used as an atlas. You bind the textures at render-time (as opposed to scene-construction time), allowing drawing of quickly-changing textures without interning them into the renderer.

    External textures are not yet supported by the webgl backend.

  • Bicubic image sampling in the sparse shader path, improving high-quality image rendering. (#1557 by @waywardmonkeys)

  • WebGlRenderer::probe behind the probe feature to sanity-check WebGL device compatibility by rendering a small reference scene and comparing the output. (#1596 by @LaurenzV)

  • render_decoration on glyph run builders for rendering text decorations with skip-ink behavior. (#1592 by @taj-p)

  • Support for rendering VARC glyphs in text paths. (#1594 by @nicoburns, @oscargus)

  • Support for synthetic font emboldening in text glyph runs via GlyphRunBuilder::font_embolden and glifo::FontEmbolden. (#1628 by @jrmoulton)

Changed

  • Updated wgpu to v29. (#1534 by @nicoburns)
  • Migrated text rendering to glifo; renderer resources are now managed through Resources, which must be passed to text, image upload, and render operations such as Scene::glyph_run, Renderer::render, and Renderer::upload_image. (#1562 by @LaurenzV)
  • Renamed image transparency hint APIs from may_have_opacities and *_opacity_hint to may_have_transparency and *_transparency_hint. (#1613 by @upsuper)
  • Renderer::destroy_image and WebGlRenderer::destroy_image now take &mut Resources instead of &mut ImageCache, allowing clients to destroy images through the public resource container. (#1580 by @LaurenzV)
  • TextureBindings now owns wgpu::TextureViews, allowing bindings to be held across frames more easily. insert now takes a TextureView by value and remove returns the removed view if present. (#1639 by @tomcur)

Removed

  • Experimental vello_api integration and api module. (#1602 by @waywardmonkeys)
  • Support for recordings. This decision was made due to a number of downsides that came with the implementation. See the corresponding PR and Zulip thread for more information. (#1611 by @LaurenzV)

Fixed

  • Rendering of rare degenerate radial gradients with undefined regions, which should render those regions transparent. (#1529 by @LaurenzV)
  • Incorrect rendering of filter layers containing nested clip layers. (#1541 by @LaurenzV)
  • Incorrect rendering when a background-clearing optimization ran after filter layers had been used. (#1526 by @LaurenzV)
  • SceneConstraints::default_blending_only() now allows non-default blend modes inside nested layers, while still rejecting them on the root layer. (#1554 by @LaurenzV)
  • Draw ordering for fast-path strips scheduled after nested layers when default blending constraints are enabled. (#1555 by @LaurenzV, @taj-p)
  • Atlas configuration is now clamped to backend device limits, allowing RenderSettings::default() and oversized atlas settings to work on more devices. (#1568 by @LaurenzV)
  • wgpu render targets are cleared before drawing, fixing stale pixels in transparent or untouched regions when rendering into reused offscreen targets. (#1572 by @waywardmonkeys)
  • Bicubic image sampling now clamps sparse shader results correctly, avoiding invalid premultiplied color values. (#1573 by @waywardmonkeys)
  • Stroked glyph rendering when scaled glyph runs absorb the transform into the font size, preserving the expected stroke width. (#1576 by @LaurenzV)
  • COLR glyph rendering, including glyphs using non-default blend modes. (#1584 by @LaurenzV)
  • WebGlRenderer construction no longer leaks framebuffer state, fixing a panic when creating a second WebGL renderer. (#1603 by @LaurenzV)
  • Blur and filter shader compatibility on some mobile GPUs. (#1601, #1612 by @LaurenzV)
  • Feature gating so probe no longer enables std, and std no longer implies wgpu, preserving WebGL-only configurations. (#1614 by @LaurenzV)

Optimized

  • Native WebGL rendering now avoids an intermediate framebuffer, improving performance especially for low-complexity scenes. (#1546 by @LaurenzV)
  • Rectangle rendering, including large anti-aliased rectangles, clipped axis-aligned fill_rect calls, and blurred rounded rectangles. (#1565, #1586 by @LaurenzV, #1610 by @waywardmonkeys)
  • Filter rendering by applying scissor rectangles to filter passes and intermediate layers. (#1566, #1567 by @LaurenzV)
  • Rendering of opaque strips by adding a front-to-back opaque pass with depth testing to reduce overdraw. (#1577 by @taj-p)

0.0.7 - 2026-03-24

This release has an MSRV of 1.92.

Added

  • Initial support for filter effects. (#1494 by @LaurenzV)
  • render_to_atlas and write_to_atlas APIs for glyph caching. (#1458 by @grebmeg)
  • push_blend_layer, push_opacity_layer and push_mask_layer methods to Scene. (#1420 by @grebmeg)
  • Scene constraints for conditionally achieving better rendering performance. (#1476 by @taj-p)
  • Support for image tinting. (#1460 by @grebmeg)

Changed

Fixed

  • Rendering artifacts sometimes present along the seam in sweep gradients by improving numerical robustness around the seam. (#1352 by @tomcur)
  • Incorrect handling of scenes with many complex paints. (#1467 by @taj-p)

Optimized

0.0.6 - 2026-01-15

This release has an MSRV of 1.88.

Changed

See also the vello_cpu 0.0.6 and vello_common 0.0.6 releases.

0.0.5 - 2026-01-08

This release has an MSRV of 1.88.

Added

  • The Scene now contains a push_clip_path and pop_clip_path method for performing non-isolated clipping. (#1203 by @LaurenzV)

See also the vello_cpu 0.0.5 and vello_common 0.0.5 releases.

0.0.4 - 2025-10-17

This release has an MSRV of 1.86.

This is the initial release. No changelog was kept for this release.

See also the vello_cpu 0.0.4 and vello_common 0.0.4 releases.