cc: Keep tile eviction prioritization consistent with raster priorities.
We prioritize rasterization of drawing layers over non-drawing layers.
Ensure tile eviction also respects this policy.
BUG=724591
CQ_INCLUDE_TRYBOTS=master.tryserver.blink:linux_trusty_blink_rel
Review-Url: https://codereview.chromium.org/2910303002
Cr-Commit-Position: refs/heads/master@{#476005}
diff --git a/cc/layers/picture_layer_impl_perftest.cc b/cc/layers/picture_layer_impl_perftest.cc
index 7db16d6..a8f51685 100644
--- a/cc/layers/picture_layer_impl_perftest.cc
+++ b/cc/layers/picture_layer_impl_perftest.cc
@@ -134,7 +134,8 @@
do {
int count = num_tiles;
std::unique_ptr<TilingSetEvictionQueue> queue(new TilingSetEvictionQueue(
- pending_layer_->picture_layer_tiling_set()));
+ pending_layer_->picture_layer_tiling_set(),
+ pending_layer_->contributes_to_drawn_render_surface()));
while (count--) {
ASSERT_TRUE(!queue->IsEmpty()) << "count: " << count;
ASSERT_TRUE(queue->Top().tile()) << "count: " << count;
@@ -162,7 +163,8 @@
timer_.Reset();
do {
std::unique_ptr<TilingSetEvictionQueue> queue(new TilingSetEvictionQueue(
- pending_layer_->picture_layer_tiling_set()));
+ pending_layer_->picture_layer_tiling_set(),
+ pending_layer_->contributes_to_drawn_render_surface()));
timer_.NextLap();
} while (!timer_.HasTimeLimitExpired());
diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc
index 877b460..0e32438 100644
--- a/cc/layers/picture_layer_impl_unittest.cc
+++ b/cc/layers/picture_layer_impl_unittest.cc
@@ -2961,8 +2961,9 @@
EXPECT_GT(number_of_unmarked_tiles, 1u);
// Tiles don't have resources yet.
- std::unique_ptr<TilingSetEvictionQueue> queue(
- new TilingSetEvictionQueue(pending_layer()->picture_layer_tiling_set()));
+ std::unique_ptr<TilingSetEvictionQueue> queue(new TilingSetEvictionQueue(
+ pending_layer()->picture_layer_tiling_set(),
+ pending_layer()->contributes_to_drawn_render_surface()));
EXPECT_TRUE(queue->IsEmpty());
host_impl()->tile_manager()->InitializeTilesWithResourcesForTesting(
@@ -2975,8 +2976,9 @@
PrioritizedTile last_tile;
size_t distance_decreasing = 0;
size_t distance_increasing = 0;
- queue.reset(
- new TilingSetEvictionQueue(pending_layer()->picture_layer_tiling_set()));
+ queue.reset(new TilingSetEvictionQueue(
+ pending_layer()->picture_layer_tiling_set(),
+ pending_layer()->contributes_to_drawn_render_surface()));
while (!queue->IsEmpty()) {
PrioritizedTile prioritized_tile = queue->Top();
Tile* tile = prioritized_tile.tile();
@@ -3660,8 +3662,9 @@
size_t occluded_tile_count = 0u;
PrioritizedTile last_tile;
- std::unique_ptr<TilingSetEvictionQueue> queue(
- new TilingSetEvictionQueue(layer->picture_layer_tiling_set()));
+ std::unique_ptr<TilingSetEvictionQueue> queue(new TilingSetEvictionQueue(
+ layer->picture_layer_tiling_set(),
+ layer->contributes_to_drawn_render_surface()));
while (!queue->IsEmpty()) {
PrioritizedTile prioritized_tile = queue->Top();
Tile* tile = prioritized_tile.tile();
diff --git a/cc/tiles/eviction_tile_priority_queue.cc b/cc/tiles/eviction_tile_priority_queue.cc
index df75f45..44066bbf 100644
--- a/cc/tiles/eviction_tile_priority_queue.cc
+++ b/cc/tiles/eviction_tile_priority_queue.cc
@@ -15,11 +15,11 @@
explicit EvictionOrderComparator(TreePriority tree_priority)
: tree_priority_(tree_priority) {}
+ // Note that in this function, we have to return true if and only if
+ // b is strictly lower priority than a.
bool operator()(
const std::unique_ptr<TilingSetEvictionQueue>& a_queue,
const std::unique_ptr<TilingSetEvictionQueue>& b_queue) const {
- // Note that in this function, we have to return true if and only if
- // b is strictly lower priority than a.
const PrioritizedTile& a_tile = a_queue->Top();
const PrioritizedTile& b_tile = b_queue->Top();
@@ -27,6 +27,13 @@
const TilePriority& b_priority = b_tile.priority();
bool prioritize_low_res = tree_priority_ == SMOOTHNESS_TAKES_PRIORITY;
+ // If the priority bin is the same but one of the tiles is from a
+ // non-drawing layer, then the drawing layer has a higher priority.
+ if (b_priority.priority_bin == a_priority.priority_bin &&
+ b_queue->is_drawing_layer() != a_queue->is_drawing_layer()) {
+ return a_queue->is_drawing_layer();
+ }
+
// If the priority bin differs, b is lower priority if it has the higher
// priority bin.
if (a_priority.priority_bin != b_priority.priority_bin)
@@ -73,7 +80,8 @@
for (auto* layer : layers) {
std::unique_ptr<TilingSetEvictionQueue> tiling_set_queue =
base::MakeUnique<TilingSetEvictionQueue>(
- layer->picture_layer_tiling_set());
+ layer->picture_layer_tiling_set(),
+ layer->contributes_to_drawn_render_surface());
// Queues will only contain non empty tiling sets.
if (!tiling_set_queue->IsEmpty())
queues->push_back(std::move(tiling_set_queue));
diff --git a/cc/tiles/tiling_set_eviction_queue.cc b/cc/tiles/tiling_set_eviction_queue.cc
index da09e31..5ba7913 100644
--- a/cc/tiles/tiling_set_eviction_queue.cc
+++ b/cc/tiles/tiling_set_eviction_queue.cc
@@ -11,8 +11,11 @@
namespace cc {
TilingSetEvictionQueue::TilingSetEvictionQueue(
- PictureLayerTilingSet* tiling_set)
- : tree_(tiling_set->tree()), phase_(EVENTUALLY_RECT) {
+ PictureLayerTilingSet* tiling_set,
+ bool is_drawing_layer)
+ : tree_(tiling_set->tree()),
+ phase_(EVENTUALLY_RECT),
+ is_drawing_layer_(is_drawing_layer) {
// Early out if the layer has no tilings.
if (!tiling_set->num_tilings())
return;
diff --git a/cc/tiles/tiling_set_eviction_queue.h b/cc/tiles/tiling_set_eviction_queue.h
index e6055e5..ebd0101 100644
--- a/cc/tiles/tiling_set_eviction_queue.h
+++ b/cc/tiles/tiling_set_eviction_queue.h
@@ -67,12 +67,14 @@
// with low priority on one tree, but high combined priority.
class CC_EXPORT TilingSetEvictionQueue {
public:
- explicit TilingSetEvictionQueue(PictureLayerTilingSet* tiling_set);
+ explicit TilingSetEvictionQueue(PictureLayerTilingSet* tiling_set,
+ bool is_drawing_layer);
~TilingSetEvictionQueue();
const PrioritizedTile& Top() const;
void Pop();
bool IsEmpty() const;
+ bool is_drawing_layer() const { return is_drawing_layer_; }
private:
enum Phase {
@@ -198,6 +200,7 @@
SkewportTilingIterator skewport_iterator_;
PendingVisibleTilingIterator pending_visible_iterator_;
VisibleTilingIterator visible_iterator_;
+ bool is_drawing_layer_;
};
} // namespace cc