mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Moved Canvas rendering to a single thread.
This commit is contained in:
parent
05fe8fa08d
commit
f3065f3707
6 changed files with 1270 additions and 1111 deletions
1001
components/canvas/canvas_data.rs
Normal file
1001
components/canvas/canvas_data.rs
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -20,6 +20,7 @@ extern crate servo_config;
|
||||||
extern crate webrender;
|
extern crate webrender;
|
||||||
extern crate webrender_api;
|
extern crate webrender_api;
|
||||||
|
|
||||||
|
pub mod canvas_data;
|
||||||
pub mod canvas_paint_thread;
|
pub mod canvas_paint_thread;
|
||||||
pub mod gl_context;
|
pub mod gl_context;
|
||||||
mod webgl_mode;
|
mod webgl_mode;
|
||||||
|
|
|
@ -16,12 +16,13 @@ pub enum FillRule {
|
||||||
Evenodd,
|
Evenodd,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Deserialize, MallocSizeOf, PartialEq, Serialize)]
|
#[derive(Clone, Copy, Deserialize, Eq, Hash, MallocSizeOf, PartialEq, Serialize)]
|
||||||
pub struct CanvasId(pub u64);
|
pub struct CanvasId(pub u64);
|
||||||
|
|
||||||
#[derive(Clone, Deserialize, Serialize)]
|
#[derive(Clone, Deserialize, Serialize)]
|
||||||
pub enum CanvasMsg {
|
pub enum CanvasMsg {
|
||||||
Canvas2d(Canvas2dMsg, CanvasId),
|
Canvas2d(Canvas2dMsg, CanvasId),
|
||||||
|
Create(IpcSender<CanvasId>, Size2D<i32>, webrender_api::RenderApiSender, bool),
|
||||||
FromLayout(FromLayoutMsg, CanvasId),
|
FromLayout(FromLayoutMsg, CanvasId),
|
||||||
FromScript(FromScriptMsg, CanvasId),
|
FromScript(FromScriptMsg, CanvasId),
|
||||||
Recreate(Size2D<i32>, CanvasId),
|
Recreate(Size2D<i32>, CanvasId),
|
||||||
|
@ -40,7 +41,7 @@ pub enum Canvas2dMsg {
|
||||||
DrawImage(ByteBuf, Size2D<f64>, Rect<f64>, Rect<f64>, bool),
|
DrawImage(ByteBuf, Size2D<f64>, Rect<f64>, Rect<f64>, bool),
|
||||||
DrawImageSelf(Size2D<f64>, Rect<f64>, Rect<f64>, bool),
|
DrawImageSelf(Size2D<f64>, Rect<f64>, Rect<f64>, bool),
|
||||||
DrawImageInOther(
|
DrawImageInOther(
|
||||||
IpcSender<CanvasMsg>, CanvasId, Size2D<f64>, Rect<f64>, Rect<f64>, bool, IpcSender<()>),
|
CanvasId, Size2D<f64>, Rect<f64>, Rect<f64>, bool),
|
||||||
BeginPath,
|
BeginPath,
|
||||||
BezierCurveTo(Point2D<f32>, Point2D<f32>, Point2D<f32>),
|
BezierCurveTo(Point2D<f32>, Point2D<f32>, Point2D<f32>),
|
||||||
ClearRect(Rect<f32>),
|
ClearRect(Rect<f32>),
|
||||||
|
|
|
@ -330,8 +330,8 @@ pub struct Constellation<Message, LTF, STF> {
|
||||||
/// A channel through which messages can be sent to the webvr thread.
|
/// A channel through which messages can be sent to the webvr thread.
|
||||||
webvr_chan: Option<IpcSender<WebVRMsg>>,
|
webvr_chan: Option<IpcSender<WebVRMsg>>,
|
||||||
|
|
||||||
/// An Id for the next canvas to use.
|
/// A channel through which messages can be sent to the canvas paint thread.
|
||||||
canvas_id: CanvasId,
|
canvas_chan: IpcSender<CanvasMsg>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// State needed to construct a constellation.
|
/// State needed to construct a constellation.
|
||||||
|
@ -630,7 +630,7 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
|
||||||
}),
|
}),
|
||||||
webgl_threads: state.webgl_threads,
|
webgl_threads: state.webgl_threads,
|
||||||
webvr_chan: state.webvr_chan,
|
webvr_chan: state.webvr_chan,
|
||||||
canvas_id: CanvasId(0),
|
canvas_chan: CanvasPaintThread::start(),
|
||||||
};
|
};
|
||||||
|
|
||||||
constellation.run();
|
constellation.run();
|
||||||
|
@ -2286,11 +2286,25 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
|
||||||
&mut self,
|
&mut self,
|
||||||
size: &Size2D<i32>,
|
size: &Size2D<i32>,
|
||||||
response_sender: IpcSender<(IpcSender<CanvasMsg>, CanvasId)>) {
|
response_sender: IpcSender<(IpcSender<CanvasMsg>, CanvasId)>) {
|
||||||
self.canvas_id.0 += 1;
|
|
||||||
let webrender_api = self.webrender_api_sender.clone();
|
let webrender_api = self.webrender_api_sender.clone();
|
||||||
let sender = CanvasPaintThread::start(*size, webrender_api,
|
let sender = self.canvas_chan.clone();
|
||||||
opts::get().enable_canvas_antialiasing, self.canvas_id.clone());
|
let (canvas_id_sender, canvas_id_receiver) = ipc::channel::<CanvasId>().expect("ipc channel failure");
|
||||||
if let Err(e) = response_sender.send((sender, self.canvas_id.clone())) {
|
|
||||||
|
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);
|
warn!("Create canvas paint thread response failed ({})", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -371,20 +371,19 @@ impl CanvasRenderingContext2D {
|
||||||
None => return Err(Error::InvalidState),
|
None => return Err(Error::InvalidState),
|
||||||
};
|
};
|
||||||
|
|
||||||
let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap();
|
let msg = CanvasMsg::Canvas2d(
|
||||||
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::DrawImageInOther(
|
Canvas2dMsg::DrawImageInOther(
|
||||||
self.ipc_renderer.clone(),
|
|
||||||
self.get_canvas_id(),
|
self.get_canvas_id(),
|
||||||
image_size,
|
image_size,
|
||||||
dest_rect,
|
dest_rect,
|
||||||
source_rect,
|
source_rect,
|
||||||
smoothing_enabled,
|
smoothing_enabled
|
||||||
sender),
|
),
|
||||||
context.get_canvas_id());
|
context.get_canvas_id()
|
||||||
|
);
|
||||||
|
|
||||||
let renderer = context.get_ipc_renderer();
|
let renderer = context.get_ipc_renderer();
|
||||||
renderer.send(msg).unwrap();
|
renderer.send(msg).unwrap();
|
||||||
receiver.recv().unwrap();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
self.mark_as_dirty();
|
self.mark_as_dirty();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue