Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions sparse_strips/vello_cpu/src/dispatch/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,10 @@ pub(crate) trait Dispatcher: Debug + Send + Sync {
render_mode: RenderMode,
width: u16,
height: u16,
dst_x: u16,
dst_y: u16,
dst_buffer_width: u16,
dst_buffer_height: u16,
encoded_paints: &[EncodedPaint],
image_resolver: &dyn ImageResolver,
);
Expand Down
78 changes: 71 additions & 7 deletions sparse_strips/vello_cpu/src/dispatch/multi_threaded.rs
Original file line number Diff line number Diff line change
Expand Up @@ -170,11 +170,15 @@ impl MultiThreadedDispatcher {
buffer: &mut [u8],
width: u16,
height: u16,
dst_x: u16,
dst_y: u16,
dst_buffer_width: u16,
dst_buffer_height: u16,
encoded_paints: &[EncodedPaint],
image_resolver: &dyn ImageResolver,
) {
use crate::fine::F32Kernel;
dispatch!(self.level, simd => self.rasterize_with::<_, F32Kernel>(simd, buffer, width, height, encoded_paints, image_resolver));
dispatch!(self.level, simd => self.rasterize_with::<_, F32Kernel>(simd, buffer, width, height, dst_x, dst_y, dst_buffer_width, dst_buffer_height, encoded_paints, image_resolver));
}

#[cfg(feature = "u8_pipeline")]
Expand All @@ -183,11 +187,15 @@ impl MultiThreadedDispatcher {
buffer: &mut [u8],
width: u16,
height: u16,
dst_x: u16,
dst_y: u16,
dst_buffer_width: u16,
dst_buffer_height: u16,
encoded_paints: &[EncodedPaint],
image_resolver: &dyn ImageResolver,
) {
use crate::fine::U8Kernel;
dispatch!(self.level, simd => self.rasterize_with::<_, U8Kernel>(simd, buffer, width, height, encoded_paints, image_resolver));
dispatch!(self.level, simd => self.rasterize_with::<_, U8Kernel>(simd, buffer, width, height, dst_x, dst_y, dst_buffer_width, dst_buffer_height, encoded_paints, image_resolver));
}

fn init(&mut self) {
Expand Down Expand Up @@ -382,10 +390,22 @@ impl MultiThreadedDispatcher {
buffer: &mut [u8],
width: u16,
height: u16,
dst_x: u16,
dst_y: u16,
dst_buffer_width: u16,
dst_buffer_height: u16,
encoded_paints: &[EncodedPaint],
image_resolver: &dyn ImageResolver,
) {
let mut buffer = Regions::new(width, height, buffer);
let mut buffer = Regions::new_at_offset(
width,
height,
dst_x,
dst_y,
dst_buffer_width,
dst_buffer_height,
buffer,
);
let fines = ThreadLocal::new();
let wide = &self.wide;
let alpha_slots = self.alpha_storage.take();
Expand Down Expand Up @@ -612,6 +632,10 @@ impl Dispatcher for MultiThreadedDispatcher {
render_mode: RenderMode,
width: u16,
height: u16,
dst_x: u16,
dst_y: u16,
dst_buffer_width: u16,
dst_buffer_height: u16,
encoded_paints: &[EncodedPaint],
image_resolver: &dyn ImageResolver,
) {
Expand All @@ -621,23 +645,63 @@ impl Dispatcher for MultiThreadedDispatcher {
#[cfg(all(feature = "u8_pipeline", not(feature = "f32_pipeline")))]
{
let _ = render_mode;
self.rasterize_u8(buffer, width, height, encoded_paints, image_resolver);
self.rasterize_u8(
buffer,
width,
height,
dst_x,
dst_y,
dst_buffer_width,
dst_buffer_height,
encoded_paints,
image_resolver,
);
}
// Only f32 pipeline enabled
#[cfg(all(feature = "f32_pipeline", not(feature = "u8_pipeline")))]
{
let _ = render_mode;
self.rasterize_f32(buffer, width, height, encoded_paints, image_resolver);
self.rasterize_f32(
buffer,
width,
height,
dst_x,
dst_y,
dst_buffer_width,
dst_buffer_height,
encoded_paints,
image_resolver,
);
}

// Both pipelines enabled
#[cfg(all(feature = "f32_pipeline", feature = "u8_pipeline"))]
match render_mode {
RenderMode::OptimizeSpeed => {
self.rasterize_u8(buffer, width, height, encoded_paints, image_resolver);
self.rasterize_u8(
buffer,
width,
height,
dst_x,
dst_y,
dst_buffer_width,
dst_buffer_height,
encoded_paints,
image_resolver,
);
}
RenderMode::OptimizeQuality => {
self.rasterize_f32(buffer, width, height, encoded_paints, image_resolver);
self.rasterize_f32(
buffer,
width,
height,
dst_x,
dst_y,
dst_buffer_width,
dst_buffer_height,
encoded_paints,
image_resolver,
);
}
}
}
Expand Down
110 changes: 102 additions & 8 deletions sparse_strips/vello_cpu/src/dispatch/single_threaded.rs
Original file line number Diff line number Diff line change
Expand Up @@ -93,12 +93,19 @@ impl SingleThreadedDispatcher {
buffer: &mut [u8],
width: u16,
height: u16,
dst_x: u16,
dst_y: u16,
dst_buffer_width: u16,
dst_buffer_height: u16,
encoded_paints: &[EncodedPaint],
image_resolver: &dyn ImageResolver,
) {
use crate::fine::F32Kernel;
use vello_common::fearless_simd::dispatch;
dispatch!(self.level, simd => self.rasterize_with::<_, F32Kernel>(simd, buffer, width, height, encoded_paints, image_resolver));
dispatch!(self.level, simd => self.rasterize_with::<_, F32Kernel>(simd, buffer, width, height, dst_x,
dst_y,
dst_buffer_width,
dst_buffer_height,encoded_paints, image_resolver));
}

/// Rasterizes the scene using u8 precision (fast).
Expand All @@ -111,12 +118,19 @@ impl SingleThreadedDispatcher {
buffer: &mut [u8],
width: u16,
height: u16,
dst_x: u16,
dst_y: u16,
dst_buffer_width: u16,
dst_buffer_height: u16,
encoded_paints: &[EncodedPaint],
image_resolver: &dyn ImageResolver,
) {
use crate::fine::U8Kernel;
use vello_common::fearless_simd::dispatch;
dispatch!(self.level, simd => self.rasterize_with::<_, U8Kernel>(simd, buffer, width, height, encoded_paints, image_resolver));
dispatch!(self.level, simd => self.rasterize_with::<_, U8Kernel>(simd, buffer, width, height,dst_x,
dst_y,
dst_buffer_width,
dst_buffer_height, encoded_paints, image_resolver));
}

/// Core rasterization dispatcher that chooses between simple and filter-aware paths.
Expand All @@ -133,6 +147,10 @@ impl SingleThreadedDispatcher {
buffer: &mut [u8],
width: u16,
height: u16,
dst_x: u16,
dst_y: u16,
dst_buffer_width: u16,
dst_buffer_height: u16,
encoded_paints: &[EncodedPaint],
image_resolver: &dyn ImageResolver,
) {
Expand All @@ -145,6 +163,10 @@ impl SingleThreadedDispatcher {
buffer,
width,
height,
dst_x,
dst_y,
dst_buffer_width,
dst_buffer_height,
encoded_paints,
image_resolver,
&mut layer_manager,
Expand All @@ -156,6 +178,10 @@ impl SingleThreadedDispatcher {
buffer,
width,
height,
dst_x,
dst_y,
dst_buffer_width,
dst_buffer_height,
encoded_paints,
image_resolver,
);
Expand All @@ -178,6 +204,10 @@ impl SingleThreadedDispatcher {
buffer: &mut [u8],
width: u16,
height: u16,
dst_x: u16,
dst_y: u16,
dst_buffer_width: u16,
dst_buffer_height: u16,
encoded_paints: &[EncodedPaint],
image_resolver: &dyn ImageResolver,
layer_manager: &mut LayerManager,
Expand Down Expand Up @@ -245,7 +275,15 @@ impl SingleThreadedDispatcher {
wtile_bbox: _,
} => {
// Final composition directly to output buffer.
let mut regions = Regions::new(width, height, buffer);
let mut regions = Regions::new_at_offset(
width,
height,
dst_x,
dst_y,
dst_buffer_width,
dst_buffer_height,
buffer,
);
regions.update_regions(|region| {
// Use the background color from the wide tile.
let bg = self.wide.get(region.x, region.y).bg;
Expand Down Expand Up @@ -396,10 +434,22 @@ impl SingleThreadedDispatcher {
buffer: &mut [u8],
width: u16,
height: u16,
dst_x: u16,
dst_y: u16,
dst_buffer_width: u16,
dst_buffer_height: u16,
encoded_paints: &[EncodedPaint],
image_resolver: &dyn ImageResolver,
) {
let mut regions = Regions::new(width, height, buffer);
let mut regions = Regions::new_at_offset(
width,
height,
dst_x,
dst_y,
dst_buffer_width,
dst_buffer_height,
buffer,
);
let mut fine = Fine::<S, F>::new(simd);

regions.update_regions(|region| {
Expand Down Expand Up @@ -704,33 +754,77 @@ impl Dispatcher for SingleThreadedDispatcher {
render_mode: RenderMode,
width: u16,
height: u16,
dst_x: u16,
dst_y: u16,
dst_buffer_width: u16,
dst_buffer_height: u16,
encoded_paints: &[EncodedPaint],
image_resolver: &dyn ImageResolver,
) {
// If only the u8 pipeline is enabled, then use it
#[cfg(all(feature = "u8_pipeline", not(feature = "f32_pipeline")))]
{
let _ = render_mode;
self.rasterize_u8(buffer, width, height, encoded_paints, image_resolver);
self.rasterize_u8(
buffer,
width,
height,
dst_x,
dst_y,
dst_buffer_width,
dst_buffer_height,
encoded_paints,
image_resolver,
);
}

// If only the f32 pipeline is enabled, then use it
#[cfg(all(feature = "f32_pipeline", not(feature = "u8_pipeline")))]
{
let _ = render_mode;
self.rasterize_f32(buffer, width, height, encoded_paints, image_resolver);
self.rasterize_f32(
buffer,
width,
height,
dst_x,
dst_y,
dst_buffer_width,
dst_buffer_height,
encoded_paints,
image_resolver,
);
}

// If both pipelines are enabled, select precision based on render mode parameter.
#[cfg(all(feature = "u8_pipeline", feature = "f32_pipeline"))]
match render_mode {
RenderMode::OptimizeSpeed => {
// Use u8 precision for faster rendering.
self.rasterize_u8(buffer, width, height, encoded_paints, image_resolver);
self.rasterize_u8(
buffer,
width,
height,
dst_x,
dst_y,
dst_buffer_width,
dst_buffer_height,
encoded_paints,
image_resolver,
);
}
RenderMode::OptimizeQuality => {
// Use f32 precision for higher quality.
self.rasterize_f32(buffer, width, height, encoded_paints, image_resolver);
self.rasterize_f32(
buffer,
width,
height,
dst_x,
dst_y,
dst_buffer_width,
dst_buffer_height,
encoded_paints,
image_resolver,
);
}
}

Expand Down
Loading
Loading