mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Auto merge of #20680 - Brody-Eastwood:master, r=emilio
Moved Canvas rendering to a single thread. <!-- Please describe your changes on the following line: --> Implements the "Subsequent Steps" part of the [NCSU Canvas rendering project.](https://github.com/servo/servo/wiki/Canvas-rendering-project) I moved most of the functionality from CanvasPaintThread to CanvasData, so CanvasPaintThread essentially just pulls the info out of the message and calls a method on a particular CanvasData element. I ran into some awkwardness with the fact that one can only take a single mutable reference from a hashmap, though. DrawImageInOther is not really possible to do with only one reference at a time, so it awkwardly still lives in CanvasPaintThread, basically. I also would've preferred to take the reference at the top as soon as I get the CanvasId, since that looks cleaner than having them all start with "canvas_paint_thread.canvases.get_mut[&canvas_id].unwrap()" but that makes trying to take the second reference for DrawImageInOther fail to compile. I'm definitely open to suggestions on how to make that less gross. The timed single-canvas drawing improved in performance from around ~2.2ms to around ~1.7ms. Slither.io runs better and doesn't crash, but I'm not having it crash on my copy from before these changes, so I don't know if that's new behavior or not. --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [X] `./mach build -d` does not report any errors - [X] `./mach build-geckolib` does not report any errors - [X] `./mach test-tidy` does not report any errors - [X] These changes fix #13879 and #10381. <!-- Either: --> - [X] There are tests for these changes (added in the initial steps) <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/20680) <!-- Reviewable:end -->
This commit is contained in:
commit
a27c62717e
6 changed files with 1270 additions and 1111 deletions
|
@ -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();
|
||||
|
@ -2294,11 +2294,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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue