mirror of
https://github.com/servo/servo.git
synced 2025-09-27 15:20:09 +01:00
compositor: Allow canvas to upload rendered contents asynchronously (#37776)
Adds epoch to each WR image op command that is sent to compositor. The renderer now has a `FrameDelayer` data structure that is responsible for tracking when a frame is ready to be displayed. When asking canvases to update their rendering, they are given an optional `Epoch` which denotes the `Document`'s canvas epoch. When all image updates for that `Epoch` are seen in the renderer, the frame can be displayed. Testing: Existing WPT tests Fixes: #35733 Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com> Signed-off-by: Martin Robinson <mrobinson@igalia.com> Co-authored-by: Martin Robinson <mrobinson@igalia.com>
This commit is contained in:
parent
4700149fcb
commit
8beef6c21f
36 changed files with 452 additions and 100 deletions
|
@ -18,6 +18,7 @@ tracing = ["dep:tracing"]
|
|||
|
||||
[dependencies]
|
||||
app_units = { workspace = true }
|
||||
base = { workspace = true }
|
||||
bytemuck = { workspace = true, features = ["extern_crate_alloc"] }
|
||||
canvas_traits = { workspace = true }
|
||||
compositing_traits = { workspace = true }
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use base::Epoch;
|
||||
use canvas_traits::canvas::*;
|
||||
use compositing_traits::CrossProcessCompositorApi;
|
||||
use euclid::default::{Point2D, Rect, Size2D, Transform2D};
|
||||
|
@ -279,11 +280,11 @@ impl<DrawTarget: GenericDrawTarget> CanvasData<DrawTarget> {
|
|||
.drawtarget
|
||||
.create_similar_draw_target(&Size2D::new(size.width, size.height).cast());
|
||||
|
||||
self.update_image_rendering();
|
||||
self.update_image_rendering(None);
|
||||
}
|
||||
|
||||
/// Update image in WebRender
|
||||
pub(crate) fn update_image_rendering(&mut self) {
|
||||
pub(crate) fn update_image_rendering(&mut self, canvas_epoch: Option<Epoch>) {
|
||||
let (descriptor, data) = {
|
||||
#[cfg(feature = "tracing")]
|
||||
let _span = tracing::trace_span!(
|
||||
|
@ -295,7 +296,7 @@ impl<DrawTarget: GenericDrawTarget> CanvasData<DrawTarget> {
|
|||
};
|
||||
|
||||
self.compositor_api
|
||||
.update_image(self.image_key, descriptor, data);
|
||||
.update_image(self.image_key, descriptor, data, canvas_epoch);
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-putimagedata
|
||||
|
|
|
@ -6,6 +6,7 @@ use std::borrow::ToOwned;
|
|||
use std::collections::HashMap;
|
||||
use std::{f32, thread};
|
||||
|
||||
use base::Epoch;
|
||||
use canvas_traits::ConstellationCanvasMsg;
|
||||
use canvas_traits::canvas::*;
|
||||
use compositing_traits::CrossProcessCompositorApi;
|
||||
|
@ -253,9 +254,8 @@ impl CanvasPaintThread {
|
|||
self.canvas(canvas_id)
|
||||
.put_image_data(snapshot.to_owned(), rect);
|
||||
},
|
||||
Canvas2dMsg::UpdateImage(sender) => {
|
||||
self.canvas(canvas_id).update_image_rendering();
|
||||
sender.send(()).unwrap();
|
||||
Canvas2dMsg::UpdateImage(canvas_epoch) => {
|
||||
self.canvas(canvas_id).update_image_rendering(canvas_epoch);
|
||||
},
|
||||
Canvas2dMsg::PopClips(clips) => self.canvas(canvas_id).pop_clips(clips),
|
||||
}
|
||||
|
@ -526,12 +526,12 @@ impl Canvas {
|
|||
}
|
||||
}
|
||||
|
||||
fn update_image_rendering(&mut self) {
|
||||
fn update_image_rendering(&mut self, canvas_epoch: Option<Epoch>) {
|
||||
match self {
|
||||
#[cfg(feature = "vello")]
|
||||
Canvas::Vello(canvas_data) => canvas_data.update_image_rendering(),
|
||||
Canvas::Vello(canvas_data) => canvas_data.update_image_rendering(canvas_epoch),
|
||||
#[cfg(feature = "vello_cpu")]
|
||||
Canvas::VelloCPU(canvas_data) => canvas_data.update_image_rendering(),
|
||||
Canvas::VelloCPU(canvas_data) => canvas_data.update_image_rendering(canvas_epoch),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue