mirror of
https://github.com/servo/servo.git
synced 2025-08-05 05:30:08 +01:00
canvas: Clear vello scene if possible (#38356)
Vello scene only ever grows, so we need to clear it as soon as it's possible (in clear rect). This PR also adds ignore_clips to vello_backend (already exists in vello_cpu_backend). Testing: Behavior is verified by existing tests, as this is mainly a change for performance. There are currently no performance tests. This makes bunnymark actually playable (from 3 FPS to 20 FPS on vello_cpu). --------- Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
This commit is contained in:
parent
b05d265de5
commit
09f0e20e29
6 changed files with 102 additions and 34 deletions
|
@ -86,6 +86,22 @@ impl VelloCPUDrawTarget {
|
|||
fn size(&self) -> Size2D<u32> {
|
||||
Size2D::new(self.ctx.width(), self.ctx.height()).cast()
|
||||
}
|
||||
|
||||
fn is_viewport_cleared(&mut self, rect: &Rect<f32>, transform: Transform2D<f32>) -> bool {
|
||||
let transformed_rect = transform.outer_transformed_rect(rect);
|
||||
if transformed_rect.is_empty() {
|
||||
return false;
|
||||
}
|
||||
let viewport: Rect<f64> = Rect::from_size(self.get_size().cast());
|
||||
let Some(clip) = self.clips.iter().try_fold(viewport, |acc, e| {
|
||||
acc.intersection(&e.0.bounding_box().into())
|
||||
}) else {
|
||||
// clip makes no visible side effects
|
||||
return false;
|
||||
};
|
||||
transformed_rect.cast().contains_rect(&viewport) && // whole viewport is cleared
|
||||
clip.contains_rect(&viewport) // viewport is not clipped
|
||||
}
|
||||
}
|
||||
|
||||
impl GenericDrawTarget for VelloCPUDrawTarget {
|
||||
|
@ -101,6 +117,13 @@ impl GenericDrawTarget for VelloCPUDrawTarget {
|
|||
}
|
||||
|
||||
fn clear_rect(&mut self, rect: &Rect<f32>, transform: Transform2D<f32>) {
|
||||
// vello_cpu RenderingContext only ever grows,
|
||||
// so we need to use every opportunity to shrink it
|
||||
if self.is_viewport_cleared(rect, transform) {
|
||||
self.ctx.reset();
|
||||
self.clips.clear(); // no clips are affecting rendering
|
||||
return;
|
||||
}
|
||||
let rect: kurbo::Rect = rect.cast().into();
|
||||
let mut clip_path = rect.to_path(0.1);
|
||||
clip_path.apply_affine(transform.cast().into());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue