aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorbors-servo <release+servo@mozilla.com>2014-04-10 13:25:23 -0400
committerbors-servo <release+servo@mozilla.com>2014-04-10 13:25:23 -0400
commit5d12dc805b2714ad2e3094ed84efe41281ec24d5 (patch)
tree5ebc00ad796607a010f6beefe6212b6adf2b5714 /src
parent986664f52780481a8e875692331179c956627cb1 (diff)
parent005b8937fa47b31f5d386932aea136ba4dba72fb (diff)
downloadservo-5d12dc805b2714ad2e3094ed84efe41281ec24d5.tar.gz
servo-5d12dc805b2714ad2e3094ed84efe41281ec24d5.zip
auto merge of #2080 : mbrubeck/servo/2069-forget-tiles, r=larsbergstrom
This fixes a pixmap leak and task failure (#2069).
Diffstat (limited to 'src')
-rw-r--r--src/components/main/compositing/compositor.rs5
-rw-r--r--src/components/main/compositing/compositor_layer.rs11
2 files changed, 15 insertions, 1 deletions
diff --git a/src/components/main/compositing/compositor.rs b/src/components/main/compositing/compositor.rs
index dcb6f94199e..72e0ec80a98 100644
--- a/src/components/main/compositing/compositor.rs
+++ b/src/components/main/compositing/compositor.rs
@@ -394,6 +394,11 @@ impl IOCompositor {
ContainerLayer::add_child_start(self.root_layer.clone(),
ContainerLayerKind(new_layer.root_layer.clone()));
+
+ // Release all tiles from the layer before dropping it.
+ for layer in self.compositor_layer.mut_iter() {
+ layer.clear_all_tiles();
+ }
self.compositor_layer = Some(new_layer);
}
diff --git a/src/components/main/compositing/compositor_layer.rs b/src/components/main/compositing/compositor_layer.rs
index 678c8c03bd5..5b38b4f332f 100644
--- a/src/components/main/compositing/compositor_layer.rs
+++ b/src/components/main/compositing/compositor_layer.rs
@@ -879,7 +879,7 @@ impl CompositorLayer {
}
// Send back all tiles to renderer.
- child.get_mut_ref().child.clear();
+ child.get_mut_ref().child.clear_all_tiles();
self.build_layer_tree(graphics_context);
true
@@ -951,6 +951,15 @@ impl CompositorLayer {
}
}
+ /// Destroys tiles for this layer and all descendent layers, sending the buffers back to the
+ /// renderer to be destroyed or reused.
+ pub fn clear_all_tiles(&mut self) {
+ self.clear();
+ for kid in self.children.mut_iter() {
+ kid.child.clear_all_tiles();
+ }
+ }
+
/// Destroys all tiles of all layers, including children, *without* sending them back to the
/// renderer. You must call this only when the render task is destined to be going down;
/// otherwise, you will leak tiles.