| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/resources/eviction_tile_priority_queue.h" | 5 #include "cc/resources/eviction_tile_priority_queue.h" |
| 6 | 6 |
| 7 #include "base/containers/hash_tables.h" |
| 8 |
| 7 namespace cc { | 9 namespace cc { |
| 8 | 10 |
| 9 namespace { | 11 namespace { |
| 10 | 12 |
| 11 class EvictionOrderComparator { | 13 class EvictionOrderComparator { |
| 12 public: | 14 public: |
| 13 explicit EvictionOrderComparator(TreePriority tree_priority) | 15 explicit EvictionOrderComparator(TreePriority tree_priority) |
| 14 : tree_priority_(tree_priority) {} | 16 : tree_priority_(tree_priority) {} |
| 15 | 17 |
| 16 bool operator()( | 18 bool operator()( |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 // b is lower priorty if it is farther from visible. | 73 // b is lower priorty if it is farther from visible. |
| 72 return b_priority.distance_to_visible > a_priority.distance_to_visible; | 74 return b_priority.distance_to_visible > a_priority.distance_to_visible; |
| 73 } | 75 } |
| 74 | 76 |
| 75 private: | 77 private: |
| 76 TreePriority tree_priority_; | 78 TreePriority tree_priority_; |
| 77 }; | 79 }; |
| 78 | 80 |
| 79 } // namespace | 81 } // namespace |
| 80 | 82 |
| 83 // static |
| 84 scoped_ptr<EvictionTilePriorityQueue> EvictionTilePriorityQueue::Create( |
| 85 const base::hash_map<int, PictureLayerTilingSet::Pair>& |
| 86 paired_picture_layer_tiling_sets, |
| 87 bool has_pending_tree, |
| 88 TreePriority tree_priority) { |
| 89 scoped_ptr<EvictionTilePriorityQueue> queue(new EvictionTilePriorityQueue); |
| 90 queue->Build(paired_picture_layer_tiling_sets, has_pending_tree, |
| 91 tree_priority); |
| 92 return queue; |
| 93 } |
| 94 |
| 81 EvictionTilePriorityQueue::EvictionTilePriorityQueue() { | 95 EvictionTilePriorityQueue::EvictionTilePriorityQueue() { |
| 82 } | 96 } |
| 83 | 97 |
| 84 EvictionTilePriorityQueue::~EvictionTilePriorityQueue() { | 98 EvictionTilePriorityQueue::~EvictionTilePriorityQueue() { |
| 85 } | 99 } |
| 86 | 100 |
| 87 void EvictionTilePriorityQueue::Build( | 101 void EvictionTilePriorityQueue::Build( |
| 88 const std::vector<PictureLayerImpl::Pair>& paired_layers, | 102 const base::hash_map<int, PictureLayerTilingSet::Pair>& |
| 103 paired_picture_layer_tiling_sets, |
| 104 bool has_pending_tree, |
| 89 TreePriority tree_priority) { | 105 TreePriority tree_priority) { |
| 90 tree_priority_ = tree_priority; | 106 tree_priority_ = tree_priority; |
| 91 | 107 |
| 92 for (std::vector<PictureLayerImpl::Pair>::const_iterator it = | 108 for (const auto& paired_tiling_set_pair : paired_picture_layer_tiling_sets) { |
| 93 paired_layers.begin(); | 109 const auto& paired_tiling_set = paired_tiling_set_pair.second; |
| 94 it != paired_layers.end(); | 110 PictureLayerTilingSet* active = paired_tiling_set.active; |
| 95 ++it) { | 111 PictureLayerTilingSet* pending = |
| 96 paired_queues_.push_back( | 112 has_pending_tree ? paired_tiling_set.pending : nullptr; |
| 97 make_scoped_ptr(new PairedTilingSetQueue(*it, tree_priority_))); | 113 paired_queues_.push_back(make_scoped_ptr( |
| 114 new PairedTilingSetQueue(active, pending, tree_priority_))); |
| 98 } | 115 } |
| 99 | 116 |
| 100 paired_queues_.make_heap(EvictionOrderComparator(tree_priority_)); | 117 paired_queues_.make_heap(EvictionOrderComparator(tree_priority_)); |
| 101 } | 118 } |
| 102 | 119 |
| 103 bool EvictionTilePriorityQueue::IsEmpty() const { | 120 bool EvictionTilePriorityQueue::IsEmpty() const { |
| 104 return paired_queues_.empty() || paired_queues_.front()->IsEmpty(); | 121 return paired_queues_.empty() || paired_queues_.front()->IsEmpty(); |
| 105 } | 122 } |
| 106 | 123 |
| 107 Tile* EvictionTilePriorityQueue::Top() { | 124 Tile* EvictionTilePriorityQueue::Top() { |
| 108 DCHECK(!IsEmpty()); | 125 DCHECK(!IsEmpty()); |
| 109 return paired_queues_.front()->Top(tree_priority_); | 126 return paired_queues_.front()->Top(tree_priority_); |
| 110 } | 127 } |
| 111 | 128 |
| 112 void EvictionTilePriorityQueue::Pop() { | 129 void EvictionTilePriorityQueue::Pop() { |
| 113 DCHECK(!IsEmpty()); | 130 DCHECK(!IsEmpty()); |
| 114 | 131 |
| 115 paired_queues_.pop_heap(EvictionOrderComparator(tree_priority_)); | 132 paired_queues_.pop_heap(EvictionOrderComparator(tree_priority_)); |
| 116 PairedTilingSetQueue* paired_queue = paired_queues_.back(); | 133 PairedTilingSetQueue* paired_queue = paired_queues_.back(); |
| 117 paired_queue->Pop(tree_priority_); | 134 paired_queue->Pop(tree_priority_); |
| 118 paired_queues_.push_heap(EvictionOrderComparator(tree_priority_)); | 135 paired_queues_.push_heap(EvictionOrderComparator(tree_priority_)); |
| 119 } | 136 } |
| 120 | 137 |
| 121 EvictionTilePriorityQueue::PairedTilingSetQueue::PairedTilingSetQueue() { | 138 EvictionTilePriorityQueue::PairedTilingSetQueue::PairedTilingSetQueue() { |
| 122 } | 139 } |
| 123 | 140 |
| 124 EvictionTilePriorityQueue::PairedTilingSetQueue::PairedTilingSetQueue( | 141 EvictionTilePriorityQueue::PairedTilingSetQueue::PairedTilingSetQueue( |
| 125 const PictureLayerImpl::Pair& layer_pair, | 142 PictureLayerTilingSet* active_set, |
| 143 PictureLayerTilingSet* pending_set, |
| 126 TreePriority tree_priority) { | 144 TreePriority tree_priority) { |
| 127 bool skip_shared_out_of_order_tiles = layer_pair.active && layer_pair.pending; | 145 bool skip_shared_out_of_order_tiles = active_set && pending_set; |
| 128 if (layer_pair.active) { | 146 if (active_set) { |
| 129 active_queue = make_scoped_ptr(new TilingSetEvictionQueue( | 147 active_queue = make_scoped_ptr(new TilingSetEvictionQueue( |
| 130 layer_pair.active->picture_layer_tiling_set(), tree_priority, | 148 active_set, tree_priority, skip_shared_out_of_order_tiles)); |
| 131 skip_shared_out_of_order_tiles)); | |
| 132 } | 149 } |
| 133 if (layer_pair.pending) { | 150 if (pending_set) { |
| 134 pending_queue = make_scoped_ptr(new TilingSetEvictionQueue( | 151 pending_queue = make_scoped_ptr(new TilingSetEvictionQueue( |
| 135 layer_pair.pending->picture_layer_tiling_set(), tree_priority, | 152 pending_set, tree_priority, skip_shared_out_of_order_tiles)); |
| 136 skip_shared_out_of_order_tiles)); | |
| 137 } | 153 } |
| 138 } | 154 } |
| 139 | 155 |
| 140 EvictionTilePriorityQueue::PairedTilingSetQueue::~PairedTilingSetQueue() { | 156 EvictionTilePriorityQueue::PairedTilingSetQueue::~PairedTilingSetQueue() { |
| 141 } | 157 } |
| 142 | 158 |
| 143 bool EvictionTilePriorityQueue::PairedTilingSetQueue::IsEmpty() const { | 159 bool EvictionTilePriorityQueue::PairedTilingSetQueue::IsEmpty() const { |
| 144 return (!active_queue || active_queue->IsEmpty()) && | 160 return (!active_queue || active_queue->IsEmpty()) && |
| 145 (!pending_queue || pending_queue->IsEmpty()); | 161 (!pending_queue || pending_queue->IsEmpty()); |
| 146 } | 162 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 return active_tile->required_for_activation() ? PENDING_TREE : ACTIVE_TREE; | 221 return active_tile->required_for_activation() ? PENDING_TREE : ACTIVE_TREE; |
| 206 } | 222 } |
| 207 | 223 |
| 208 // Return tile with a lower priority. | 224 // Return tile with a lower priority. |
| 209 if (pending_priority.IsHigherPriorityThan(active_priority)) | 225 if (pending_priority.IsHigherPriorityThan(active_priority)) |
| 210 return ACTIVE_TREE; | 226 return ACTIVE_TREE; |
| 211 return PENDING_TREE; | 227 return PENDING_TREE; |
| 212 } | 228 } |
| 213 | 229 |
| 214 } // namespace cc | 230 } // namespace cc |
| OLD | NEW |