diff options
-rw-r--r-- | cc/picture_layer_impl.cc | 6 | ||||
-rw-r--r-- | cc/picture_layer_impl.h | 1 | ||||
-rw-r--r-- | cc/picture_layer_tiling.cc | 16 | ||||
-rw-r--r-- | cc/picture_layer_tiling.h | 6 | ||||
-rw-r--r-- | cc/picture_layer_tiling_set.cc | 5 | ||||
-rw-r--r-- | cc/picture_layer_tiling_set.h | 4 | ||||
-rw-r--r-- | cc/test/fake_picture_layer_tiling_client.h | 1 | ||||
-rw-r--r-- | cc/tile.h | 4 |
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_; } @@ -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; |