Chromium Code Reviews| 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; |