Moved Canvas rendering to a single thread.

This commit is contained in:
Brody-Eastwood 2018-04-22 20:21:38 -04:00
parent 05fe8fa08d
commit f3065f3707
6 changed files with 1270 additions and 1111 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -20,6 +20,7 @@ extern crate servo_config;
extern crate webrender;
extern crate webrender_api;
pub mod canvas_data;
pub mod canvas_paint_thread;
pub mod gl_context;
mod webgl_mode;

View file

@ -16,12 +16,13 @@ pub enum FillRule {
Evenodd,
}
#[derive(Clone, Deserialize, MallocSizeOf, PartialEq, Serialize)]
#[derive(Clone, Copy, Deserialize, Eq, Hash, MallocSizeOf, PartialEq, Serialize)]
pub struct CanvasId(pub u64);
#[derive(Clone, Deserialize, Serialize)]
pub enum CanvasMsg {
Canvas2d(Canvas2dMsg, CanvasId),
Create(IpcSender<CanvasId>, Size2D<i32>, webrender_api::RenderApiSender, bool),
FromLayout(FromLayoutMsg, CanvasId),
FromScript(FromScriptMsg, CanvasId),
Recreate(Size2D<i32>, CanvasId),
@ -40,7 +41,7 @@ pub enum Canvas2dMsg {
DrawImage(ByteBuf, Size2D<f64>, Rect<f64>, Rect<f64>, bool),
DrawImageSelf(Size2D<f64>, Rect<f64>, Rect<f64>, bool),
DrawImageInOther(
IpcSender<CanvasMsg>, CanvasId, Size2D<f64>, Rect<f64>, Rect<f64>, bool, IpcSender<()>),
CanvasId, Size2D<f64>, Rect<f64>, Rect<f64>, bool),
BeginPath,
BezierCurveTo(Point2D<f32>, Point2D<f32>, Point2D<f32>),
ClearRect(Rect<f32>),

View file

@ -330,8 +330,8 @@ pub struct Constellation<Message, LTF, STF> {
/// A channel through which messages can be sent to the webvr thread.
webvr_chan: Option<IpcSender<WebVRMsg>>,
/// An Id for the next canvas to use.
canvas_id: CanvasId,
/// A channel through which messages can be sent to the canvas paint thread.
canvas_chan: IpcSender<CanvasMsg>,
}
/// State needed to construct a constellation.
@ -630,7 +630,7 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
}),
webgl_threads: state.webgl_threads,
webvr_chan: state.webvr_chan,
canvas_id: CanvasId(0),
canvas_chan: CanvasPaintThread::start(),
};
constellation.run();
@ -2286,11 +2286,25 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
&mut self,
size: &Size2D<i32>,
response_sender: IpcSender<(IpcSender<CanvasMsg>, CanvasId)>) {
self.canvas_id.0 += 1;
let webrender_api = self.webrender_api_sender.clone();
let sender = CanvasPaintThread::start(*size, webrender_api,
opts::get().enable_canvas_antialiasing, self.canvas_id.clone());
if let Err(e) = response_sender.send((sender, self.canvas_id.clone())) {
let sender = self.canvas_chan.clone();
let (canvas_id_sender, canvas_id_receiver) = ipc::channel::<CanvasId>().expect("ipc channel failure");
if let Err(e) = sender.send(
CanvasMsg::Create(
canvas_id_sender,
*size,
webrender_api,
opts::get().enable_canvas_antialiasing
)
) {
return warn!("Create canvas paint thread failed ({})", e);
}
let canvas_id = match canvas_id_receiver.recv() {
Ok(canvas_id) => canvas_id,
Err(e) => return warn!("Create canvas paint thread id response failed ({})", e),
};
if let Err(e) = response_sender.send((sender, canvas_id.clone())) {
warn!("Create canvas paint thread response failed ({})", e);
}
}

View file

@ -371,20 +371,19 @@ impl CanvasRenderingContext2D {
None => return Err(Error::InvalidState),
};
let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap();
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::DrawImageInOther(
self.ipc_renderer.clone(),
let msg = CanvasMsg::Canvas2d(
Canvas2dMsg::DrawImageInOther(
self.get_canvas_id(),
image_size,
dest_rect,
source_rect,
smoothing_enabled,
sender),
context.get_canvas_id());
smoothing_enabled
),
context.get_canvas_id()
);
let renderer = context.get_ipc_renderer();
renderer.send(msg).unwrap();
receiver.recv().unwrap();
};
self.mark_as_dirty();