Don't delete webrender image keys immediately.

This commit is contained in:
Alan Jeffrey 2017-07-05 10:45:49 -05:00
parent 9d30e5b4e0
commit 3002c45184
2 changed files with 73 additions and 17 deletions

View file

@ -59,6 +59,10 @@ pub struct CanvasPaintThread<'a> {
saved_states: Vec<CanvasPaintState<'a>>,
webrender_api: webrender_api::RenderApi,
image_key: Option<webrender_api::ImageKey>,
/// An old webrender image key that can be deleted when the next epoch ends.
old_image_key: Option<webrender_api::ImageKey>,
/// An old webrender image key that can be deleted when the current epoch ends.
very_old_image_key: Option<webrender_api::ImageKey>,
}
#[derive(Clone)]
@ -111,6 +115,8 @@ impl<'a> CanvasPaintThread<'a> {
saved_states: vec![],
webrender_api: webrender_api,
image_key: None,
old_image_key: None,
very_old_image_key: None,
}
}
@ -548,7 +554,10 @@ impl<'a> CanvasPaintThread<'a> {
self.saved_states.clear();
// Webrender doesn't let images change size, so we clear the webrender image key.
if let Some(image_key) = self.image_key.take() {
self.webrender_api.delete_image(image_key);
// If this executes, then we are in a new epoch since we last recreated the canvas,
// so `old_image_key` must be `None`.
debug_assert!(self.old_image_key.is_none());
self.old_image_key = Some(image_key);
}
}
@ -588,6 +597,10 @@ impl<'a> CanvasPaintThread<'a> {
}
}
if let Some(image_key) = mem::replace(&mut self.very_old_image_key, self.old_image_key.take()) {
self.webrender_api.delete_image(image_key);
}
let data = CanvasImageData {
image_key: self.image_key.unwrap(),
};
@ -745,7 +758,10 @@ impl<'a> CanvasPaintThread<'a> {
impl<'a> Drop for CanvasPaintThread<'a> {
fn drop(&mut self) {
if let Some(image_key) = self.image_key {
if let Some(image_key) = self.old_image_key.take() {
self.webrender_api.delete_image(image_key);
}
if let Some(image_key) = self.very_old_image_key.take() {
self.webrender_api.delete_image(image_key);
}
}