| 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 namespace cc { | 7 namespace cc { |
| 8 | 8 |
| 9 namespace { | 9 namespace { |
| 10 | 10 |
| 11 class EvictionOrderComparator { | 11 class EvictionOrderComparator { |
| 12 public: | 12 public: |
| 13 explicit EvictionOrderComparator(TreePriority tree_priority) | 13 explicit EvictionOrderComparator(TreePriority tree_priority) |
| 14 : tree_priority_(tree_priority) {} | 14 : tree_priority_(tree_priority) {} |
| 15 | 15 |
| 16 bool operator()( | 16 bool operator()( |
| 17 const EvictionTilePriorityQueue::PairedPictureLayerQueue* a, | 17 const EvictionTilePriorityQueue::PairedTilingSetQueue* a, |
| 18 const EvictionTilePriorityQueue::PairedPictureLayerQueue* b) const { | 18 const EvictionTilePriorityQueue::PairedTilingSetQueue* b) const { |
| 19 // Note that in this function, we have to return true if and only if | 19 // Note that in this function, we have to return true if and only if |
| 20 // b is strictly lower priority than a. Note that for the sake of | 20 // b is strictly lower priority than a. Note that for the sake of |
| 21 // completeness, empty queue is considered to have lowest priority. | 21 // completeness, empty queue is considered to have lowest priority. |
| 22 if (a->IsEmpty() || b->IsEmpty()) | 22 if (a->IsEmpty() || b->IsEmpty()) |
| 23 return b->IsEmpty() < a->IsEmpty(); | 23 return b->IsEmpty() < a->IsEmpty(); |
| 24 | 24 |
| 25 WhichTree a_tree = a->NextTileIteratorTree(tree_priority_); | 25 WhichTree a_tree = a->NextTileIteratorTree(tree_priority_); |
| 26 const PictureLayerImpl::LayerEvictionTileIterator* a_iterator = | 26 const TilingSetEvictionQueue* a_queue = |
| 27 a_tree == ACTIVE_TREE ? &a->active_iterator : &a->pending_iterator; | 27 a_tree == ACTIVE_TREE ? a->active_queue.get() : a->pending_queue.get(); |
| 28 | 28 |
| 29 WhichTree b_tree = b->NextTileIteratorTree(tree_priority_); | 29 WhichTree b_tree = b->NextTileIteratorTree(tree_priority_); |
| 30 const PictureLayerImpl::LayerEvictionTileIterator* b_iterator = | 30 const TilingSetEvictionQueue* b_queue = |
| 31 b_tree == ACTIVE_TREE ? &b->active_iterator : &b->pending_iterator; | 31 b_tree == ACTIVE_TREE ? b->active_queue.get() : b->pending_queue.get(); |
| 32 | 32 |
| 33 const Tile* a_tile = **a_iterator; | 33 const Tile* a_tile = a_queue->Top(); |
| 34 const Tile* b_tile = **b_iterator; | 34 const Tile* b_tile = b_queue->Top(); |
| 35 | 35 |
| 36 const TilePriority& a_priority = | 36 const TilePriority& a_priority = |
| 37 a_tile->priority_for_tree_priority(tree_priority_); | 37 a_tile->priority_for_tree_priority(tree_priority_); |
| 38 const TilePriority& b_priority = | 38 const TilePriority& b_priority = |
| 39 b_tile->priority_for_tree_priority(tree_priority_); | 39 b_tile->priority_for_tree_priority(tree_priority_); |
| 40 bool prioritize_low_res = tree_priority_ == SMOOTHNESS_TAKES_PRIORITY; | 40 bool prioritize_low_res = tree_priority_ == SMOOTHNESS_TAKES_PRIORITY; |
| 41 | 41 |
| 42 // If the priority bin differs, b is lower priority if it has the higher | 42 // If the priority bin differs, b is lower priority if it has the higher |
| 43 // priority bin. | 43 // priority bin. |
| 44 if (a_priority.priority_bin != b_priority.priority_bin) | 44 if (a_priority.priority_bin != b_priority.priority_bin) |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 void EvictionTilePriorityQueue::Build( | 87 void EvictionTilePriorityQueue::Build( |
| 88 const std::vector<PictureLayerImpl::Pair>& paired_layers, | 88 const std::vector<PictureLayerImpl::Pair>& paired_layers, |
| 89 TreePriority tree_priority) { | 89 TreePriority tree_priority) { |
| 90 tree_priority_ = tree_priority; | 90 tree_priority_ = tree_priority; |
| 91 | 91 |
| 92 for (std::vector<PictureLayerImpl::Pair>::const_iterator it = | 92 for (std::vector<PictureLayerImpl::Pair>::const_iterator it = |
| 93 paired_layers.begin(); | 93 paired_layers.begin(); |
| 94 it != paired_layers.end(); | 94 it != paired_layers.end(); |
| 95 ++it) { | 95 ++it) { |
| 96 paired_queues_.push_back( | 96 paired_queues_.push_back( |
| 97 make_scoped_ptr(new PairedPictureLayerQueue(*it, tree_priority_))); | 97 make_scoped_ptr(new PairedTilingSetQueue(*it, tree_priority_))); |
| 98 } | 98 } |
| 99 | 99 |
| 100 paired_queues_.make_heap(EvictionOrderComparator(tree_priority_)); | 100 paired_queues_.make_heap(EvictionOrderComparator(tree_priority_)); |
| 101 } | 101 } |
| 102 | 102 |
| 103 void EvictionTilePriorityQueue::Reset() { | 103 void EvictionTilePriorityQueue::Reset() { |
| 104 paired_queues_.clear(); | 104 paired_queues_.clear(); |
| 105 } | 105 } |
| 106 | 106 |
| 107 bool EvictionTilePriorityQueue::IsEmpty() const { | 107 bool EvictionTilePriorityQueue::IsEmpty() const { |
| 108 return paired_queues_.empty() || paired_queues_.front()->IsEmpty(); | 108 return paired_queues_.empty() || paired_queues_.front()->IsEmpty(); |
| 109 } | 109 } |
| 110 | 110 |
| 111 Tile* EvictionTilePriorityQueue::Top() { | 111 Tile* EvictionTilePriorityQueue::Top() { |
| 112 DCHECK(!IsEmpty()); | 112 DCHECK(!IsEmpty()); |
| 113 return paired_queues_.front()->Top(tree_priority_); | 113 return paired_queues_.front()->Top(tree_priority_); |
| 114 } | 114 } |
| 115 | 115 |
| 116 void EvictionTilePriorityQueue::Pop() { | 116 void EvictionTilePriorityQueue::Pop() { |
| 117 DCHECK(!IsEmpty()); | 117 DCHECK(!IsEmpty()); |
| 118 | 118 |
| 119 paired_queues_.pop_heap(EvictionOrderComparator(tree_priority_)); | 119 paired_queues_.pop_heap(EvictionOrderComparator(tree_priority_)); |
| 120 PairedPictureLayerQueue* paired_queue = paired_queues_.back(); | 120 PairedTilingSetQueue* paired_queue = paired_queues_.back(); |
| 121 paired_queue->Pop(tree_priority_); | 121 paired_queue->Pop(tree_priority_); |
| 122 paired_queues_.push_heap(EvictionOrderComparator(tree_priority_)); | 122 paired_queues_.push_heap(EvictionOrderComparator(tree_priority_)); |
| 123 } | 123 } |
| 124 | 124 |
| 125 EvictionTilePriorityQueue::PairedPictureLayerQueue::PairedPictureLayerQueue() { | 125 EvictionTilePriorityQueue::PairedTilingSetQueue::PairedTilingSetQueue() { |
| 126 } | 126 } |
| 127 | 127 |
| 128 EvictionTilePriorityQueue::PairedPictureLayerQueue::PairedPictureLayerQueue( | 128 EvictionTilePriorityQueue::PairedTilingSetQueue::PairedTilingSetQueue( |
| 129 const PictureLayerImpl::Pair& layer_pair, | 129 const PictureLayerImpl::Pair& layer_pair, |
| 130 TreePriority tree_priority) | 130 TreePriority tree_priority) { |
| 131 : active_iterator( | 131 if (layer_pair.active) |
| 132 layer_pair.active | 132 active_queue = layer_pair.active->CreateEvictionQueue(tree_priority); |
| 133 ? PictureLayerImpl::LayerEvictionTileIterator(layer_pair.active, | 133 if (layer_pair.pending) |
| 134 tree_priority) | 134 pending_queue = layer_pair.pending->CreateEvictionQueue(tree_priority); |
| 135 : PictureLayerImpl::LayerEvictionTileIterator()), | |
| 136 pending_iterator( | |
| 137 layer_pair.pending | |
| 138 ? PictureLayerImpl::LayerEvictionTileIterator(layer_pair.pending, | |
| 139 tree_priority) | |
| 140 : PictureLayerImpl::LayerEvictionTileIterator()) { | |
| 141 } | 135 } |
| 142 | 136 |
| 143 EvictionTilePriorityQueue::PairedPictureLayerQueue::~PairedPictureLayerQueue() { | 137 EvictionTilePriorityQueue::PairedTilingSetQueue::~PairedTilingSetQueue() { |
| 144 } | 138 } |
| 145 | 139 |
| 146 bool EvictionTilePriorityQueue::PairedPictureLayerQueue::IsEmpty() const { | 140 bool EvictionTilePriorityQueue::PairedTilingSetQueue::IsEmpty() const { |
| 147 return !active_iterator && !pending_iterator; | 141 return (!active_queue || active_queue->IsEmpty()) && |
| 142 (!pending_queue || pending_queue->IsEmpty()); |
| 148 } | 143 } |
| 149 | 144 |
| 150 Tile* EvictionTilePriorityQueue::PairedPictureLayerQueue::Top( | 145 Tile* EvictionTilePriorityQueue::PairedTilingSetQueue::Top( |
| 151 TreePriority tree_priority) { | 146 TreePriority tree_priority) { |
| 152 DCHECK(!IsEmpty()); | 147 DCHECK(!IsEmpty()); |
| 153 | 148 |
| 154 WhichTree next_tree = NextTileIteratorTree(tree_priority); | 149 WhichTree next_tree = NextTileIteratorTree(tree_priority); |
| 155 PictureLayerImpl::LayerEvictionTileIterator* next_iterator = | 150 TilingSetEvictionQueue* next_queue = |
| 156 next_tree == ACTIVE_TREE ? &active_iterator : &pending_iterator; | 151 next_tree == ACTIVE_TREE ? active_queue.get() : pending_queue.get(); |
| 157 DCHECK(*next_iterator); | 152 DCHECK(next_queue && !next_queue->IsEmpty()); |
| 158 | 153 |
| 159 Tile* tile = **next_iterator; | 154 Tile* tile = next_queue->Top(); |
| 160 DCHECK(std::find(returned_shared_tiles.begin(), | 155 DCHECK(std::find(returned_shared_tiles.begin(), |
| 161 returned_shared_tiles.end(), | 156 returned_shared_tiles.end(), |
| 162 tile) == returned_shared_tiles.end()); | 157 tile) == returned_shared_tiles.end()); |
| 163 return tile; | 158 return tile; |
| 164 } | 159 } |
| 165 | 160 |
| 166 void EvictionTilePriorityQueue::PairedPictureLayerQueue::Pop( | 161 void EvictionTilePriorityQueue::PairedTilingSetQueue::Pop( |
| 167 TreePriority tree_priority) { | 162 TreePriority tree_priority) { |
| 168 DCHECK(!IsEmpty()); | 163 DCHECK(!IsEmpty()); |
| 169 | 164 |
| 170 WhichTree next_tree = NextTileIteratorTree(tree_priority); | 165 WhichTree next_tree = NextTileIteratorTree(tree_priority); |
| 171 PictureLayerImpl::LayerEvictionTileIterator* next_iterator = | 166 TilingSetEvictionQueue* next_queue = |
| 172 next_tree == ACTIVE_TREE ? &active_iterator : &pending_iterator; | 167 next_tree == ACTIVE_TREE ? active_queue.get() : pending_queue.get(); |
| 173 DCHECK(*next_iterator); | 168 DCHECK(next_queue && !next_queue->IsEmpty()); |
| 174 returned_shared_tiles.push_back(**next_iterator); | 169 returned_shared_tiles.push_back(next_queue->Top()); |
| 175 ++(*next_iterator); | 170 next_queue->Pop(); |
| 176 | 171 |
| 177 if (IsEmpty()) | 172 if (IsEmpty()) |
| 178 return; | 173 return; |
| 179 | 174 |
| 180 next_tree = NextTileIteratorTree(tree_priority); | 175 next_tree = NextTileIteratorTree(tree_priority); |
| 181 next_iterator = | 176 next_queue = |
| 182 next_tree == ACTIVE_TREE ? &active_iterator : &pending_iterator; | 177 next_tree == ACTIVE_TREE ? active_queue.get() : pending_queue.get(); |
| 183 while (std::find(returned_shared_tiles.begin(), | 178 while (std::find(returned_shared_tiles.begin(), |
| 184 returned_shared_tiles.end(), | 179 returned_shared_tiles.end(), |
| 185 **next_iterator) != returned_shared_tiles.end()) { | 180 next_queue->Top()) != returned_shared_tiles.end()) { |
| 186 ++(*next_iterator); | 181 next_queue->Pop(); |
| 187 if (IsEmpty()) | 182 if (IsEmpty()) |
| 188 break; | 183 break; |
| 189 next_tree = NextTileIteratorTree(tree_priority); | 184 next_tree = NextTileIteratorTree(tree_priority); |
| 190 next_iterator = | 185 next_queue = |
| 191 next_tree == ACTIVE_TREE ? &active_iterator : &pending_iterator; | 186 next_tree == ACTIVE_TREE ? active_queue.get() : pending_queue.get(); |
| 192 } | 187 } |
| 193 } | 188 } |
| 194 | 189 |
| 195 WhichTree | 190 WhichTree |
| 196 EvictionTilePriorityQueue::PairedPictureLayerQueue::NextTileIteratorTree( | 191 EvictionTilePriorityQueue::PairedTilingSetQueue::NextTileIteratorTree( |
| 197 TreePriority tree_priority) const { | 192 TreePriority tree_priority) const { |
| 198 DCHECK(!IsEmpty()); | 193 DCHECK(!IsEmpty()); |
| 199 | 194 |
| 200 // If we only have one iterator with tiles, return it. | 195 // If we only have one iterator with tiles, return it. |
| 201 if (!active_iterator) | 196 if (!active_queue || active_queue->IsEmpty()) |
| 202 return PENDING_TREE; | 197 return PENDING_TREE; |
| 203 if (!pending_iterator) | 198 if (!pending_queue || pending_queue->IsEmpty()) |
| 204 return ACTIVE_TREE; | 199 return ACTIVE_TREE; |
| 205 | 200 |
| 206 const Tile* active_tile = *active_iterator; | 201 const Tile* active_tile = active_queue->Top(); |
| 207 const Tile* pending_tile = *pending_iterator; | 202 const Tile* pending_tile = pending_queue->Top(); |
| 208 if (active_tile == pending_tile) | 203 if (active_tile == pending_tile) |
| 209 return ACTIVE_TREE; | 204 return ACTIVE_TREE; |
| 210 | 205 |
| 211 const TilePriority& active_priority = | 206 const TilePriority& active_priority = |
| 212 active_tile->priority_for_tree_priority(tree_priority); | 207 active_tile->priority_for_tree_priority(tree_priority); |
| 213 const TilePriority& pending_priority = | 208 const TilePriority& pending_priority = |
| 214 pending_tile->priority_for_tree_priority(tree_priority); | 209 pending_tile->priority_for_tree_priority(tree_priority); |
| 215 | 210 |
| 216 if (pending_priority.IsHigherPriorityThan(active_priority)) | 211 if (pending_priority.IsHigherPriorityThan(active_priority)) |
| 217 return ACTIVE_TREE; | 212 return ACTIVE_TREE; |
| 218 return PENDING_TREE; | 213 return PENDING_TREE; |
| 219 } | 214 } |
| 220 | 215 |
| 221 } // namespace cc | 216 } // namespace cc |
| OLD | NEW |