Skip to content

Vello CPU: Add public API to render with offset/stride#1597

Open
nicoburns wants to merge 1 commit into
linebender:mainfrom
nicoburns:render-with-stride
Open

Vello CPU: Add public API to render with offset/stride#1597
nicoburns wants to merge 1 commit into
linebender:mainfrom
nicoburns:render-with-stride

Conversation

@nicoburns

@nicoburns nicoburns commented Apr 22, 2026

Copy link
Copy Markdown
Contributor

This PR is pretty simple as the logic for doing this already existed (I think added for RenderContext::composite_to_pixmap_at_offset, and this just plumbing through 4 extra u16 parameters in a bunch of places.

Todo

  • The logic in this PR is unfortunately not quite right as things stand. Testing shows the stride not being accounted for even when using the new method) (looks like I'd just missed a method that needed to be updated)

@nicoburns nicoburns added the C-cpu Applies to the vello_cpu crate label Apr 22, 2026
@nicoburns nicoburns changed the title Vello CPU: Add public API to render with stride Vello CPU: Add public API to render with offset/stride Apr 22, 2026
Signed-off-by: Nico Burns <nico@nicoburns.com>
@nicoburns nicoburns force-pushed the render-with-stride branch from 994c886 to 9a1d24f Compare April 25, 2026 11:29
@nicoburns nicoburns marked this pull request as ready for review April 25, 2026 11:38
Comment on lines 234 to 235
let mut regions =
Regions::new(bbox_width, bbox_height, pixmap.data_as_u8_slice_mut());

@nicoburns nicoburns Apr 25, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did not update this instance of Regions::new, as I think it's rendering into an intermediate layer and not the output buffer. Does that seems correct?

@LaurenzV

Copy link
Copy Markdown
Collaborator

I think I might have a better idea now how to implement this and consolidate it with exsting APIs. Need to try it out, but if it works out I will open a PR soon.

pull Bot pushed a commit to Mu-L/vello that referenced this pull request Jun 10, 2026
Supersedes linebender#1597, closes linebender#1382.

# Motivation

Right now, we have two rendering APIs: `render_to_pixmap` and
`composite_to_pixmap_at_offset`. We are about to add a third one in
linebender#1597. Having this many APIs is very confusing, and after thinking about
this more closely I realized that really, what we have been doing is
adding methods that do similar things but just with different knobs
enabled/disabled. I think it would be much cleaner if we had _one
single_ API entry point for rendering to a pixmap, and instead expose
the available knobs as a simple settings struct.

# Implementation

Therefore, this PR proposes to:
1) Expose **one single** `render` method that can be used to render the
contents of a `RenderContext` into `Pixmap`-like struct.
2) Introduce a `PixmapMut` struct to allow constructing a render target
from a mutable borrowed byte slice. Let `render` always take a `
PixmapMut`, allowing to pass both, a custom buffer or an owned pixmap as
the render target.
3) Introduce a `CompositeMode` enum that defines whether the contents of
a pixmap should be completely replaced (by default), or whether
source-over compositing should be used.
4) Also introduce a `PixelFormat` struct, to possibly allow `Bgra8` in
the future, which is useful for MacOS.
5) `RenderMode` has been moved from being stored in `RenderContext` to
instead being a setting during rasterization. I initially stored this in
`RenderContext` because I thought it might happen that the setting will
also be needed during scene construction, but this turned out to not be
the case in the end.
5) Previously, the implicit assumption was that `RenderContext` and
`Pixmap` always need to have the same size, although it "accidentally"
was possible for them to _not_ have the same size, and some people have
made use of that. This PR relaxes the conditions imposed on the size,
explicitly allowing size mismatches and also documents what the intended
semantics are for each.

# Testing
I've added some new tests for the expected behavior. Existing tests
pass. I've also ran `vello_cpu_winit` with the different scenes and
didn't notice any regressions.

**TODO: I still want to run this version against my PDF test suite, but
this shouldn't block a review.**
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

C-cpu Applies to the vello_cpu crate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support PixmapMut<'_> and stride in vello_cpu?

2 participants