Index: cc/resources/picture_layer_tiling.cc |
diff --git a/cc/resources/picture_layer_tiling.cc b/cc/resources/picture_layer_tiling.cc |
index 64661c1a6981eb87541742fd56e69ae43b691ffc..8a389716379cd9ee4a06bfcafc4540a85ef8d8de 100644 |
--- a/cc/resources/picture_layer_tiling.cc |
+++ b/cc/resources/picture_layer_tiling.cc |
@@ -830,17 +830,48 @@ void PictureLayerTiling::UpdateEvictionCacheIfNeeded( |
eviction_cache_tree_priority_ == tree_priority) |
return; |
- eviction_tiles_cache_.clear(); |
- eviction_tiles_cache_.reserve(tiles_.size()); |
+ eventually_eviction_tiles_.clear(); |
+ soon_eviction_tiles_.clear(); |
+ now_required_for_activation_eviction_tiles_.clear(); |
+ now_not_required_for_activation_eviction_tiles_.clear(); |
+ |
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); |
+ Tile* tile = it->second; |
+ const TilePriority& priority = |
+ tile->priority_for_tree_priority(tree_priority); |
+ switch (priority.priority_bin) { |
+ case TilePriority::EVENTUALLY: |
+ eventually_eviction_tiles_.push_back(tile); |
+ break; |
+ case TilePriority::SOON: |
+ soon_eviction_tiles_.push_back(tile); |
+ break; |
+ case TilePriority::NOW: |
+ if (tile->required_for_activation()) |
+ now_required_for_activation_eviction_tiles_.push_back(tile); |
+ else |
+ now_not_required_for_activation_eviction_tiles_.push_back(tile); |
+ break; |
+ } |
} |
- std::sort(eviction_tiles_cache_.begin(), |
- eviction_tiles_cache_.end(), |
- TileEvictionOrder(tree_priority)); |
+ // TODO(vmpstr): Do this lazily. One option is to have a "sorted" flag that |
+ // can be updated for each of the queues. |
+ TileEvictionOrder sort_order(tree_priority); |
+ std::sort(eventually_eviction_tiles_.begin(), |
+ eventually_eviction_tiles_.end(), |
+ sort_order); |
+ std::sort( |
+ soon_eviction_tiles_.begin(), soon_eviction_tiles_.end(), sort_order); |
+ std::sort(now_required_for_activation_eviction_tiles_.begin(), |
+ now_required_for_activation_eviction_tiles_.end(), |
+ sort_order); |
+ std::sort(now_not_required_for_activation_eviction_tiles_.begin(), |
+ now_not_required_for_activation_eviction_tiles_.end(), |
+ sort_order); |
+ |
eviction_tiles_cache_valid_ = true; |
eviction_cache_tree_priority_ = tree_priority; |
} |
@@ -970,16 +1001,37 @@ operator++() { |
} |
PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator() |
- : tiling_(NULL) { |
+ : tiling_(NULL), eviction_tiles_(NULL) { |
} |
PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator( |
PictureLayerTiling* tiling, |
- TreePriority tree_priority) |
- : tiling_(tiling), tree_priority_(tree_priority) { |
+ TreePriority tree_priority, |
+ TilePriority::PriorityBin type, |
+ bool required_for_activation) |
+ : tiling_(tiling), tree_priority_(tree_priority), eviction_tiles_(NULL) { |
+ if (required_for_activation && type != TilePriority::NOW) |
reveman
2014/08/01 17:54:47
could this be a DCHECK?
vmpstr
2014/08/01 19:39:50
No, this can't be a dcheck since we pass all 6 sta
reveman
2014/08/04 14:56:17
Acknowledged.
|
+ return; |
+ |
tiling_->UpdateEvictionCacheIfNeeded(tree_priority_); |
- tile_iterator_ = tiling_->eviction_tiles_cache_.begin(); |
- if (tile_iterator_ != tiling_->eviction_tiles_cache_.end() && |
+ switch (type) { |
+ case TilePriority::EVENTUALLY: |
+ eviction_tiles_ = &tiling_->eventually_eviction_tiles_; |
+ break; |
+ case TilePriority::SOON: |
+ eviction_tiles_ = &tiling_->soon_eviction_tiles_; |
+ break; |
+ case TilePriority::NOW: |
+ if (required_for_activation) |
+ eviction_tiles_ = &tiling_->now_required_for_activation_eviction_tiles_; |
+ else |
+ eviction_tiles_ = |
+ &tiling_->now_not_required_for_activation_eviction_tiles_; |
+ break; |
+ } |
+ DCHECK(eviction_tiles_); |
+ tile_iterator_ = eviction_tiles_->begin(); |
+ if (tile_iterator_ != eviction_tiles_->end() && |
!(*tile_iterator_)->HasResources()) { |
++(*this); |
} |
@@ -988,7 +1040,7 @@ PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator( |
PictureLayerTiling::TilingEvictionTileIterator::~TilingEvictionTileIterator() {} |
PictureLayerTiling::TilingEvictionTileIterator::operator bool() const { |
- return tiling_ && tile_iterator_ != tiling_->eviction_tiles_cache_.end(); |
+ return eviction_tiles_ && tile_iterator_ != eviction_tiles_->end(); |
reveman
2014/08/01 17:54:47
remove eviction_tiles_ check if you can DCHECK abo
|
} |
Tile* PictureLayerTiling::TilingEvictionTileIterator::operator*() { |
@@ -1007,7 +1059,7 @@ operator++() { |
DCHECK(*this); |
do { |
++tile_iterator_; |
- } while (tile_iterator_ != tiling_->eviction_tiles_cache_.end() && |
+ } while (tile_iterator_ != eviction_tiles_->end() && |
(!(*tile_iterator_)->HasResources())); |
return *this; |