mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
Don't delete webrender image keys immediately.
This commit is contained in:
parent
9d30e5b4e0
commit
3002c45184
2 changed files with 73 additions and 17 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue