From d6dec803fdcb5fc1257fcf9fddd88fd3c8c14b47 Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Tue, 8 Apr 2014 16:13:02 -0700 Subject: [PATCH 1/2] Clear tiles before dropping CompositorLayer This fixes a pixmap leak and task failure (#2069). --- src/components/main/compositing/compositor.rs | 5 +++++ src/components/main/compositing/compositor_layer.rs | 11 ++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/components/main/compositing/compositor.rs b/src/components/main/compositing/compositor.rs index 9ae6520c38a..c97bd9094d6 100644 --- a/src/components/main/compositing/compositor.rs +++ b/src/components/main/compositing/compositor.rs @@ -395,6 +395,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..d59e58fc977 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(); // XXX should this be 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. From 005b8937fa47b31f5d386932aea136ba4dba72fb Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Thu, 10 Apr 2014 07:46:55 -0700 Subject: [PATCH 2/2] Use clear_all_tiles when deleting a sublayer --- src/components/main/compositing/compositor_layer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/main/compositing/compositor_layer.rs b/src/components/main/compositing/compositor_layer.rs index d59e58fc977..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(); // XXX should this be clear_all_tiles? + child.get_mut_ref().child.clear_all_tiles(); self.build_layer_tree(graphics_context); true