diff options
author | bors-servo <release+servo@mozilla.com> | 2014-04-10 13:25:23 -0400 |
---|---|---|
committer | bors-servo <release+servo@mozilla.com> | 2014-04-10 13:25:23 -0400 |
commit | 5d12dc805b2714ad2e3094ed84efe41281ec24d5 (patch) | |
tree | 5ebc00ad796607a010f6beefe6212b6adf2b5714 /src | |
parent | 986664f52780481a8e875692331179c956627cb1 (diff) | |
parent | 005b8937fa47b31f5d386932aea136ba4dba72fb (diff) | |
download | servo-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.rs | 5 | ||||
-rw-r--r-- | src/components/main/compositing/compositor_layer.rs | 11 |
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. |