Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(847)

Unified Diff: cc/resources/tiling_set_eviction_queue.cc

Issue 1051473002: cc: Switch tiling set eviction queue to consider combined priority. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: cc/resources/tiling_set_eviction_queue.cc
diff --git a/cc/resources/tiling_set_eviction_queue.cc b/cc/resources/tiling_set_eviction_queue.cc
index 1f0e2134a5576f14ad5c5a3e18d46fe5d9d537af..1837fb1f23be67c8c419ad4c41d976a3b4fc4e32 100644
--- a/cc/resources/tiling_set_eviction_queue.cc
+++ b/cc/resources/tiling_set_eviction_queue.cc
@@ -7,22 +7,42 @@
#include "cc/resources/tiling_set_eviction_queue.h"
namespace cc {
+namespace {
+
+bool IsSharedOutOfOrderTile(WhichTree tree, const Tile* tile) {
+ if (!tile->is_shared())
+ return false;
+
+ // The priority for tile priority of a shared tile will be a combined
+ // priority thus return shared tiles from a higher priority tree as
+ // it is out of order for a lower priority tree.
+ WhichTree twin_tree = tree == ACTIVE_TREE ? PENDING_TREE : ACTIVE_TREE;
+ const TilePriority& priority = tile->priority(tree);
+ const TilePriority& twin_priority = tile->priority(twin_tree);
+ if (priority.priority_bin != twin_priority.priority_bin)
+ return priority.priority_bin > twin_priority.priority_bin;
+ const bool occluded = tile->is_occluded(tree);
+ const bool twin_occluded = tile->is_occluded(twin_tree);
+ if (occluded != twin_occluded)
+ return occluded;
+ if (priority.distance_to_visible != twin_priority.distance_to_visible)
+ return priority.distance_to_visible > twin_priority.distance_to_visible;
+
+ // If priorities are the same, it does not matter which tree returns
+ // the tile. Let's pick the pending tree.
+ return tree != PENDING_TREE;
+}
+
+} // namespace
TilingSetEvictionQueue::TilingSetEvictionQueue(
PictureLayerTilingSet* tiling_set,
- TreePriority tree_priority,
bool skip_shared_out_of_order_tiles)
: tiling_set_(tiling_set),
tree_(tiling_set->client()->GetTree()),
- tree_priority_(tree_priority),
- skip_all_shared_tiles_(
- skip_shared_out_of_order_tiles &&
- tree_priority == (tree_ == ACTIVE_TREE ? NEW_CONTENT_TAKES_PRIORITY
- : SMOOTHNESS_TAKES_PRIORITY)),
skip_shared_out_of_order_tiles_(skip_shared_out_of_order_tiles),
processing_soon_border_rect_(false),
- processing_tiling_with_required_for_activation_tiles_(false),
- tiling_index_with_required_for_activation_tiles_(0u),
+ processing_required_for_activation_tiles_(false),
current_priority_bin_(TilePriority::EVENTUALLY),
current_tiling_index_(0u),
current_tiling_range_type_(PictureLayerTilingSet::HIGHER_THAN_HIGH_RES),
@@ -31,9 +51,6 @@ TilingSetEvictionQueue::TilingSetEvictionQueue(
if (!tiling_set_->num_tilings())
return;
- tiling_index_with_required_for_activation_tiles_ =
- TilingIndexWithRequiredForActivationTiles();
-
current_tiling_index_ = CurrentTilingRange().start - 1u;
AdvanceToNextValidTiling();
}
@@ -67,8 +84,7 @@ bool TilingSetEvictionQueue::AdvanceToNextEvictionTile() {
// tiling. This is done while advancing to a new tiling and while popping
// the current tile.
- bool required_for_activation =
- processing_tiling_with_required_for_activation_tiles_;
+ bool required_for_activation = processing_required_for_activation_tiles_;
for (;;) {
while (spiral_iterator_) {
@@ -77,13 +93,12 @@ bool TilingSetEvictionQueue::AdvanceToNextEvictionTile() {
++spiral_iterator_;
if (!tile || !tile->HasResource())
continue;
- if (skip_all_shared_tiles_ && tile->is_shared())
- continue;
current_tiling_->UpdateTileAndTwinPriority(tile);
- if (skip_shared_out_of_order_tiles_ && IsSharedOutOfOrderTile(tile))
- continue;
if (tile->required_for_activation() != required_for_activation)
vmpstr 2015/04/02 17:30:29 Would this case be skipped by IsSharedOutOfOrderTi
USE eero AT chromium.org 2015/04/07 13:17:07 Yes, I replaced it with DCHECK. I also reverted th
continue;
+ if (skip_shared_out_of_order_tiles_ &&
+ IsSharedOutOfOrderTile(tree_, tile))
+ continue;
current_eviction_tile_ = tile;
return true;
}
@@ -110,8 +125,6 @@ bool TilingSetEvictionQueue::AdvanceToNextEvictionTile() {
++visible_iterator_;
if (!tile || !tile->HasResource())
continue;
- if (skip_all_shared_tiles_ && tile->is_shared())
- continue;
// If the max tile priority is not NOW, updated priorities for tiles
// returned by the visible iterator will not have NOW (but EVENTUALLY)
// priority bin and cannot therefore be required for activation tiles nor
@@ -132,10 +145,10 @@ bool TilingSetEvictionQueue::AdvanceToNextEvictionTile() {
}
}
current_tiling_->UpdateTileAndTwinPriority(tile);
- if (skip_shared_out_of_order_tiles_ && IsSharedOutOfOrderTile(tile))
- continue;
if (tile->required_for_activation() != required_for_activation)
continue;
+ if (skip_shared_out_of_order_tiles_ && IsSharedOutOfOrderTile(tree_, tile))
+ continue;
current_eviction_tile_ = tile;
return true;
}
@@ -150,10 +163,10 @@ bool TilingSetEvictionQueue::AdvanceToNextEvictionTile() {
if (!tile->HasResource())
continue;
current_tiling_->UpdateTileAndTwinPriority(tile);
- if (skip_shared_out_of_order_tiles_ && IsSharedOutOfOrderTile(tile))
- continue;
if (tile->required_for_activation() != required_for_activation)
vmpstr 2015/04/02 17:30:29 Is there a reason why switched these conditions?
USE eero AT chromium.org 2015/04/07 13:17:07 For optimisation. Testing rfa status is much faste
continue;
+ if (skip_shared_out_of_order_tiles_ && IsSharedOutOfOrderTile(tree_, tile))
+ continue;
current_eviction_tile_ = tile;
return true;
}
@@ -206,19 +219,13 @@ bool TilingSetEvictionQueue::AdvanceToNextTilingRangeType() {
return true;
case PictureLayerTilingSet::HIGH_RES:
// Process required for activation tiles (unless that has already been
- // done for the current priority bin) if there is a tiling with required
- // for activation tiles and that tiling may have required for activation
- // tiles having the current priority bin (in the pending tree only NOW
- // tiles may be required for activation).
- if (!processing_tiling_with_required_for_activation_tiles_ &&
- tiling_index_with_required_for_activation_tiles_ <
- tiling_set_->num_tilings() &&
- (current_priority_bin_ == TilePriority::NOW ||
- tree_ == ACTIVE_TREE)) {
- processing_tiling_with_required_for_activation_tiles_ = true;
+ // done). Only pending tree NOW tiles may be required for activation.
+ if (!processing_required_for_activation_tiles_ &&
+ current_priority_bin_ == TilePriority::NOW && tree_ == PENDING_TREE) {
+ processing_required_for_activation_tiles_ = true;
return true;
}
- processing_tiling_with_required_for_activation_tiles_ = false;
+ processing_required_for_activation_tiles_ = false;
if (!AdvanceToNextPriorityBin())
return false;
@@ -290,10 +297,6 @@ bool TilingSetEvictionQueue::AdvanceToNextValidTiling() {
PictureLayerTilingSet::TilingRange
TilingSetEvictionQueue::CurrentTilingRange() const {
- if (processing_tiling_with_required_for_activation_tiles_)
- return PictureLayerTilingSet::TilingRange(
- tiling_index_with_required_for_activation_tiles_,
- tiling_index_with_required_for_activation_tiles_ + 1);
return tiling_set_->GetTilingRange(current_tiling_range_type_);
}
@@ -317,74 +320,4 @@ size_t TilingSetEvictionQueue::CurrentTilingIndex() const {
return 0;
}
-bool TilingSetEvictionQueue::IsSharedOutOfOrderTile(const Tile* tile) const {
- if (!tile->is_shared())
- return false;
-
- switch (tree_priority_) {
- case SMOOTHNESS_TAKES_PRIORITY:
- DCHECK_EQ(ACTIVE_TREE, tree_);
- return false;
- case NEW_CONTENT_TAKES_PRIORITY:
- DCHECK_EQ(PENDING_TREE, tree_);
- return false;
- case SAME_PRIORITY_FOR_BOTH_TREES:
- break;
- }
-
- // The priority for tile priority of a shared tile will be a combined
- // priority thus return shared tiles from a higher priority tree as
- // it is out of order for a lower priority tree.
- WhichTree twin_tree = tree_ == ACTIVE_TREE ? PENDING_TREE : ACTIVE_TREE;
- const TilePriority& priority = tile->priority(tree_);
- const TilePriority& twin_priority = tile->priority(twin_tree);
- if (priority.priority_bin != twin_priority.priority_bin)
- return priority.priority_bin > twin_priority.priority_bin;
- const bool occluded = tile->is_occluded(tree_);
- const bool twin_occluded = tile->is_occluded(twin_tree);
- if (occluded != twin_occluded)
- return occluded;
- if (priority.distance_to_visible != twin_priority.distance_to_visible)
- return priority.distance_to_visible > twin_priority.distance_to_visible;
-
- // If priorities are the same, it does not matter which tree returns
- // the tile. Let's pick the pending tree.
- return tree_ != PENDING_TREE;
-}
-
-size_t TilingSetEvictionQueue::TilingIndexWithRequiredForActivationTiles()
- const {
- // Returns the tiling index of the tiling with requuired for activation tiles.
- // If no such tiling exists, returns the past-the-last index (num_tilings).
- size_t num_tilings = tiling_set_->num_tilings();
-
- if (tree_ == PENDING_TREE) {
- // For the pending tree, the tiling with required for activation tiles is
- // the high res one.
- PictureLayerTilingSet::TilingRange high_res_tiling_range =
- tiling_set_->GetTilingRange(PictureLayerTilingSet::HIGH_RES);
- if (high_res_tiling_range.start != high_res_tiling_range.end)
- return high_res_tiling_range.start;
- } else {
- DCHECK_EQ(ACTIVE_TREE, tree_);
- // Only pending tree tiles can be required for activation. They can appear
- // also in the active tree only if they are shared. If we skip all shared
- // tiles, there is no need to find them as they will not be returned.
- if (skip_all_shared_tiles_)
- return num_tilings;
-
- // For the active tree, the tiling with required for activation tiles is
- // the one whose twin tiling is the high res pending tiling.
- for (size_t i = 0; i < num_tilings; ++i) {
- const PictureLayerTiling* tiling = tiling_set_->tiling_at(i);
- const PictureLayerTiling* pending_tiling =
- tiling_set_->client()->GetPendingOrActiveTwinTiling(tiling);
- if (pending_tiling && pending_tiling->resolution() == HIGH_RESOLUTION)
- return i;
- }
- }
-
- return num_tilings;
-}
-
} // namespace cc
« cc/resources/eviction_tile_priority_queue.cc ('K') | « cc/resources/tiling_set_eviction_queue.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698