summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cc/picture_layer_impl.cc6
-rw-r--r--cc/picture_layer_impl.h1
-rw-r--r--cc/picture_layer_tiling.cc16
-rw-r--r--cc/picture_layer_tiling.h6
-rw-r--r--cc/picture_layer_tiling_set.cc5
-rw-r--r--cc/picture_layer_tiling_set.h4
-rw-r--r--cc/test/fake_picture_layer_tiling_client.h1
-rw-r--r--cc/tile.h4
8 files changed, 30 insertions, 13 deletions
diff --git a/cc/picture_layer_impl.cc b/cc/picture_layer_impl.cc
index ec35542..238f01d 100644
--- a/cc/picture_layer_impl.cc
+++ b/cc/picture_layer_impl.cc
@@ -179,7 +179,7 @@ void PictureLayerImpl::didUpdateTransforms() {
}
void PictureLayerImpl::didBecomeActive() {
- tilings_.MoveTilePriorities(PENDING_TREE, ACTIVE_TREE);
+ tilings_.DidBecomeActive();
}
void PictureLayerImpl::didLoseOutputSurface() {
@@ -236,6 +236,10 @@ scoped_refptr<Tile> PictureLayerImpl::CreateTile(PictureLayerTiling* tiling,
tiling->contents_scale()));
}
+void PictureLayerImpl::UpdatePile(Tile* tile) {
+ tile->set_picture_pile(pile_);
+}
+
void PictureLayerImpl::SyncFromActiveLayer() {
DCHECK(layerTreeImpl()->IsPendingTree());
if (!drawsContent())
diff --git a/cc/picture_layer_impl.h b/cc/picture_layer_impl.h
index 5e3184b..91fa2e79 100644
--- a/cc/picture_layer_impl.h
+++ b/cc/picture_layer_impl.h
@@ -44,6 +44,7 @@ public:
// PictureLayerTilingClient overrides.
virtual scoped_refptr<Tile> CreateTile(PictureLayerTiling*,
gfx::Rect) OVERRIDE;
+ virtual void UpdatePile(Tile* tile) OVERRIDE;
// PushPropertiesTo active tree => pending tree
void SyncFromActiveLayer();
diff --git a/cc/picture_layer_tiling.cc b/cc/picture_layer_tiling.cc
index 7f19b43..a352bc6 100644
--- a/cc/picture_layer_tiling.cc
+++ b/cc/picture_layer_tiling.cc
@@ -320,12 +320,18 @@ void PictureLayerTiling::UpdateTilePriorities(
}
}
-void PictureLayerTiling::MoveTilePriorities(WhichTree src_tree,
- WhichTree dst_tree) {
- DCHECK(src_tree != dst_tree);
+void PictureLayerTiling::DidBecomeActive() {
for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) {
- it->second->set_priority(dst_tree, it->second->priority(src_tree));
- it->second->set_priority(src_tree, TilePriority());
+ it->second->set_priority(ACTIVE_TREE, it->second->priority(PENDING_TREE));
+ it->second->set_priority(PENDING_TREE, TilePriority());
+
+ // Tile holds a ref onto a picture pile. If the tile never gets invalidated
+ // and recreated, then that picture pile ref could exist indefinitely. To
+ // prevent this, ask the client to update the pile to its own ref. This
+ // will cause PicturePileImpls and their clones to get deleted once the
+ // corresponding PictureLayerImpl and any in flight raster jobs go out of
+ // scope.
+ client_->UpdatePile(it->second);
}
}
diff --git a/cc/picture_layer_tiling.h b/cc/picture_layer_tiling.h
index 563ac41..e69c6e3 100644
--- a/cc/picture_layer_tiling.h
+++ b/cc/picture_layer_tiling.h
@@ -23,6 +23,7 @@ class PictureLayerTiling;
class PictureLayerTilingClient {
public:
virtual scoped_refptr<Tile> CreateTile(PictureLayerTiling*, gfx::Rect) = 0;
+ virtual void UpdatePile(Tile* tile) = 0;
};
class CC_EXPORT PictureLayerTiling {
@@ -101,7 +102,10 @@ class CC_EXPORT PictureLayerTiling {
const gfx::Transform& current_screen_transform,
double time_delta);
- void MoveTilePriorities(WhichTree src_tree, WhichTree dst_tree);
+ // Copies the src_tree priority into the dst_tree priority for all tiles.
+ // The src_tree priority is reset to the lowest priority possible. This
+ // also updates the pile on each tile to be the current client's pile.
+ void DidBecomeActive();
protected:
typedef std::pair<int, int> TileMapKey;
diff --git a/cc/picture_layer_tiling_set.cc b/cc/picture_layer_tiling_set.cc
index c1d56e5..638eaff 100644
--- a/cc/picture_layer_tiling_set.cc
+++ b/cc/picture_layer_tiling_set.cc
@@ -263,10 +263,9 @@ void PictureLayerTilingSet::UpdateTilePriorities(
}
}
-void PictureLayerTilingSet::MoveTilePriorities(WhichTree src_tree,
- WhichTree dst_tree) {
+void PictureLayerTilingSet::DidBecomeActive() {
for (size_t i = 0; i < tilings_.size(); ++i)
- tilings_[i]->MoveTilePriorities(src_tree, dst_tree);
+ tilings_[i]->DidBecomeActive();
}
} // namespace cc
diff --git a/cc/picture_layer_tiling_set.h b/cc/picture_layer_tiling_set.h
index b8c72c0..1c8467b 100644
--- a/cc/picture_layer_tiling_set.h
+++ b/cc/picture_layer_tiling_set.h
@@ -53,9 +53,7 @@ class CC_EXPORT PictureLayerTilingSet {
const gfx::Transform& current_screen_transform,
double time_delta);
- // Copies the src_tree priority into the dst_tree priority for all tiles.
- // The src_tree priority is reset to the lowest priority possible.
- void MoveTilePriorities(WhichTree src_tree, WhichTree dst_tree);
+ void DidBecomeActive();
// For a given rect, iterates through tiles that can fill it. If no
// set of tiles with resources can fill the rect, then it will iterate
diff --git a/cc/test/fake_picture_layer_tiling_client.h b/cc/test/fake_picture_layer_tiling_client.h
index b61b83e..78603cc 100644
--- a/cc/test/fake_picture_layer_tiling_client.h
+++ b/cc/test/fake_picture_layer_tiling_client.h
@@ -22,6 +22,7 @@ class FakePictureLayerTilingClient : public PictureLayerTilingClient {
// PictureLayerTilingClient implementation.
virtual scoped_refptr<Tile> CreateTile(
PictureLayerTiling* tiling, gfx::Rect rect) OVERRIDE;
+ virtual void UpdatePile(Tile* tile) OVERRIDE {}
void SetTileSize(gfx::Size tile_size);
gfx::Size TileSize() const { return tile_size_; }
diff --git a/cc/tile.h b/cc/tile.h
index 7d41e6a..dcb24e0 100644
--- a/cc/tile.h
+++ b/cc/tile.h
@@ -54,6 +54,10 @@ class CC_EXPORT Tile : public base::RefCounted<Tile> {
float contents_scale() const { return contents_scale_; }
gfx::Rect content_rect() const { return content_rect_; }
+ void set_picture_pile(scoped_refptr<PicturePileImpl> pile) {
+ picture_pile_ = pile;
+ }
+
private:
// Methods called by by tile manager.
friend class TileManager;