diff options
author | vmpstr@chromium.org <vmpstr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-02 00:31:49 +0000 |
---|---|---|
committer | vmpstr@chromium.org <vmpstr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-02 00:31:49 +0000 |
commit | 9b6ac70de9aec378beb8eb59d614d07d905b8049 (patch) | |
tree | 634f1e010c12e2045e32e04f1a99aa77f04c8d3c /cc/resources/picture_layer_tiling.cc | |
parent | e5f8fffe755ee128818260248a2fcc717c156867 (diff) | |
download | chromium_src-9b6ac70de9aec378beb8eb59d614d07d905b8049.zip chromium_src-9b6ac70de9aec378beb8eb59d614d07d905b8049.tar.gz chromium_src-9b6ac70de9aec378beb8eb59d614d07d905b8049.tar.bz2 |
cc: Add tiling eviction tile iterator.
This patch adds a naive version of the eviction iterator for a tiling.
This sets the interface for the class, so that work can continue on
handing eviction from the layer and tile manager, as well as being able
to independently change the implementation for something more optimal.
R=enne
Review URL: https://codereview.chromium.org/217033004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@260999 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/resources/picture_layer_tiling.cc')
-rw-r--r-- | cc/resources/picture_layer_tiling.cc | 90 |
1 files changed, 89 insertions, 1 deletions
diff --git a/cc/resources/picture_layer_tiling.cc b/cc/resources/picture_layer_tiling.cc index 356ac1b..99b6283 100644 --- a/cc/resources/picture_layer_tiling.cc +++ b/cc/resources/picture_layer_tiling.cc @@ -18,6 +18,24 @@ #include "ui/gfx/size_conversions.h" namespace cc { +namespace { + +class TileEvictionOrder { + public: + explicit TileEvictionOrder(WhichTree tree) : tree_(tree) {} + ~TileEvictionOrder() {} + + bool operator()(const Tile* a, const Tile* b) { + const TilePriority& a_priority = a->priority(tree_); + const TilePriority& b_priority = b->priority(tree_); + + return a_priority.IsHigherPriorityThan(b_priority); + } + + private: + WhichTree tree_; +}; +} // namespace scoped_ptr<PictureLayerTiling> PictureLayerTiling::Create( float contents_scale, @@ -36,7 +54,8 @@ PictureLayerTiling::PictureLayerTiling(float contents_scale, resolution_(NON_IDEAL_RESOLUTION), client_(client), tiling_data_(gfx::Size(), gfx::Size(), true), - last_impl_frame_time_in_seconds_(0.0) { + last_impl_frame_time_in_seconds_(0.0), + eviction_tiles_cache_valid_(false) { gfx::Size content_bounds = gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds, contents_scale)); gfx::Size tile_size = client_->CalculateTileSize(content_bounds); @@ -436,6 +455,7 @@ void PictureLayerTiling::UpdateTilePriorities( current_visible_rect_in_content_space_ = visible_rect_in_content_space; current_skewport_ = skewport; current_eventually_rect_ = eventually_rect; + eviction_tiles_cache_valid_ = false; TilePriority now_priority(resolution_, TilePriority::NOW, 0); float content_to_screen_scale = @@ -732,6 +752,24 @@ gfx::Rect PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy( return result; } +void PictureLayerTiling::UpdateEvictionCacheIfNeeded(WhichTree tree) { + if (eviction_tiles_cache_valid_) + return; + + eviction_tiles_cache_.clear(); + eviction_tiles_cache_.reserve(tiles_.size()); + for (TileMap::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { + // TODO(vmpstr): This should update the priority if UpdateTilePriorities + // changes not to do this. + eviction_tiles_cache_.push_back(it->second); + } + + std::sort(eviction_tiles_cache_.begin(), + eviction_tiles_cache_.end(), + TileEvictionOrder(tree)); + eviction_tiles_cache_valid_ = true; +} + PictureLayerTiling::TilingRasterTileIterator::TilingRasterTileIterator() : tiling_(NULL), current_tile_(NULL) {} @@ -827,4 +865,54 @@ operator++() { return *this; } +PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator() + : is_valid_(false), tiling_(NULL) {} + +PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator( + PictureLayerTiling* tiling, + WhichTree tree) + : is_valid_(false), tiling_(tiling), tree_(tree) {} + +PictureLayerTiling::TilingEvictionTileIterator::~TilingEvictionTileIterator() {} + +PictureLayerTiling::TilingEvictionTileIterator::operator bool() { + if (!IsValid()) + Initialize(); + + return IsValid() && tile_iterator_ != tiling_->eviction_tiles_cache_.end(); +} + +Tile* PictureLayerTiling::TilingEvictionTileIterator::operator*() { + if (!IsValid()) + Initialize(); + + DCHECK(*this); + return *tile_iterator_; +} + +PictureLayerTiling::TilingEvictionTileIterator& +PictureLayerTiling::TilingEvictionTileIterator:: +operator++() { + DCHECK(*this); + do { + ++tile_iterator_; + } while (tile_iterator_ != tiling_->eviction_tiles_cache_.end() && + (!(*tile_iterator_)->HasResources())); + + return *this; +} + +void PictureLayerTiling::TilingEvictionTileIterator::Initialize() { + if (!tiling_) + return; + + tiling_->UpdateEvictionCacheIfNeeded(tree_); + tile_iterator_ = tiling_->eviction_tiles_cache_.begin(); + is_valid_ = true; + if (tile_iterator_ != tiling_->eviction_tiles_cache_.end() && + !(*tile_iterator_)->HasResources()) { + ++(*this); + } +} + } // namespace cc |