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