| 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/tiles/eviction_tile_priority_queue.h" | 5 #include "cc/tiles/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()(const TilingSetEvictionQueue* a_queue, | 16 bool operator()(const scoped_ptr<TilingSetEvictionQueue>& a_queue, |
| 17 const TilingSetEvictionQueue* b_queue) const { | 17 const scoped_ptr<TilingSetEvictionQueue>& b_queue) const { |
| 18 // Note that in this function, we have to return true if and only if | 18 // Note that in this function, we have to return true if and only if |
| 19 // b is strictly lower priority than a. | 19 // b is strictly lower priority than a. |
| 20 const PrioritizedTile& a_tile = a_queue->Top(); | 20 const PrioritizedTile& a_tile = a_queue->Top(); |
| 21 const PrioritizedTile& b_tile = b_queue->Top(); | 21 const PrioritizedTile& b_tile = b_queue->Top(); |
| 22 | 22 |
| 23 const TilePriority& a_priority = a_tile.priority(); | 23 const TilePriority& a_priority = a_tile.priority(); |
| 24 const TilePriority& b_priority = b_tile.priority(); | 24 const TilePriority& b_priority = b_tile.priority(); |
| 25 bool prioritize_low_res = tree_priority_ == SMOOTHNESS_TAKES_PRIORITY; | 25 bool prioritize_low_res = tree_priority_ == SMOOTHNESS_TAKES_PRIORITY; |
| 26 | 26 |
| 27 // If the priority bin differs, b is lower priority if it has the higher | 27 // If the priority bin differs, b is lower priority if it has the higher |
| (...skipping 29 matching lines...) Expand all Loading... |
| 57 return b_priority.distance_to_visible > a_priority.distance_to_visible; | 57 return b_priority.distance_to_visible > a_priority.distance_to_visible; |
| 58 } | 58 } |
| 59 | 59 |
| 60 private: | 60 private: |
| 61 TreePriority tree_priority_; | 61 TreePriority tree_priority_; |
| 62 }; | 62 }; |
| 63 | 63 |
| 64 void CreateTilingSetEvictionQueues( | 64 void CreateTilingSetEvictionQueues( |
| 65 const std::vector<PictureLayerImpl*>& layers, | 65 const std::vector<PictureLayerImpl*>& layers, |
| 66 TreePriority tree_priority, | 66 TreePriority tree_priority, |
| 67 ScopedPtrVector<TilingSetEvictionQueue>* queues) { | 67 std::vector<scoped_ptr<TilingSetEvictionQueue>>* queues) { |
| 68 DCHECK(queues->empty()); | 68 DCHECK(queues->empty()); |
| 69 | 69 |
| 70 for (auto* layer : layers) { | 70 for (auto* layer : layers) { |
| 71 scoped_ptr<TilingSetEvictionQueue> tiling_set_queue = make_scoped_ptr( | 71 scoped_ptr<TilingSetEvictionQueue> tiling_set_queue = make_scoped_ptr( |
| 72 new TilingSetEvictionQueue(layer->picture_layer_tiling_set())); | 72 new TilingSetEvictionQueue(layer->picture_layer_tiling_set())); |
| 73 // Queues will only contain non empty tiling sets. | 73 // Queues will only contain non empty tiling sets. |
| 74 if (!tiling_set_queue->IsEmpty()) | 74 if (!tiling_set_queue->IsEmpty()) |
| 75 queues->push_back(tiling_set_queue.Pass()); | 75 queues->push_back(tiling_set_queue.Pass()); |
| 76 } | 76 } |
| 77 queues->make_heap(EvictionOrderComparator(tree_priority)); | 77 std::make_heap(queues->begin(), queues->end(), |
| 78 EvictionOrderComparator(tree_priority)); |
| 78 } | 79 } |
| 79 | 80 |
| 80 } // namespace | 81 } // namespace |
| 81 | 82 |
| 82 EvictionTilePriorityQueue::EvictionTilePriorityQueue() { | 83 EvictionTilePriorityQueue::EvictionTilePriorityQueue() { |
| 83 } | 84 } |
| 84 | 85 |
| 85 EvictionTilePriorityQueue::~EvictionTilePriorityQueue() { | 86 EvictionTilePriorityQueue::~EvictionTilePriorityQueue() { |
| 86 } | 87 } |
| 87 | 88 |
| 88 void EvictionTilePriorityQueue::Build( | 89 void EvictionTilePriorityQueue::Build( |
| 89 const std::vector<PictureLayerImpl*>& active_layers, | 90 const std::vector<PictureLayerImpl*>& active_layers, |
| 90 const std::vector<PictureLayerImpl*>& pending_layers, | 91 const std::vector<PictureLayerImpl*>& pending_layers, |
| 91 TreePriority tree_priority) { | 92 TreePriority tree_priority) { |
| 92 tree_priority_ = tree_priority; | 93 tree_priority_ = tree_priority; |
| 93 | 94 |
| 94 CreateTilingSetEvictionQueues(active_layers, tree_priority, &active_queues_); | 95 CreateTilingSetEvictionQueues(active_layers, tree_priority, &active_queues_); |
| 95 CreateTilingSetEvictionQueues(pending_layers, tree_priority, | 96 CreateTilingSetEvictionQueues(pending_layers, tree_priority, |
| 96 &pending_queues_); | 97 &pending_queues_); |
| 97 } | 98 } |
| 98 | 99 |
| 99 bool EvictionTilePriorityQueue::IsEmpty() const { | 100 bool EvictionTilePriorityQueue::IsEmpty() const { |
| 100 return active_queues_.empty() && pending_queues_.empty(); | 101 return active_queues_.empty() && pending_queues_.empty(); |
| 101 } | 102 } |
| 102 | 103 |
| 103 const PrioritizedTile& EvictionTilePriorityQueue::Top() const { | 104 const PrioritizedTile& EvictionTilePriorityQueue::Top() const { |
| 104 DCHECK(!IsEmpty()); | 105 DCHECK(!IsEmpty()); |
| 105 const ScopedPtrVector<TilingSetEvictionQueue>& next_queues = GetNextQueues(); | 106 const auto& next_queues = GetNextQueues(); |
| 106 return next_queues.front()->Top(); | 107 return next_queues.front()->Top(); |
| 107 } | 108 } |
| 108 | 109 |
| 109 void EvictionTilePriorityQueue::Pop() { | 110 void EvictionTilePriorityQueue::Pop() { |
| 110 DCHECK(!IsEmpty()); | 111 DCHECK(!IsEmpty()); |
| 111 | 112 |
| 112 ScopedPtrVector<TilingSetEvictionQueue>& next_queues = GetNextQueues(); | 113 auto& next_queues = GetNextQueues(); |
| 113 next_queues.pop_heap(EvictionOrderComparator(tree_priority_)); | 114 std::pop_heap(next_queues.begin(), next_queues.end(), |
| 114 TilingSetEvictionQueue* queue = next_queues.back(); | 115 EvictionOrderComparator(tree_priority_)); |
| 116 TilingSetEvictionQueue* queue = next_queues.back().get(); |
| 115 queue->Pop(); | 117 queue->Pop(); |
| 116 | 118 |
| 117 // Remove empty queues. | 119 // Remove empty queues. |
| 118 if (queue->IsEmpty()) | 120 if (queue->IsEmpty()) { |
| 119 next_queues.pop_back(); | 121 next_queues.pop_back(); |
| 120 else | 122 } else { |
| 121 next_queues.push_heap(EvictionOrderComparator(tree_priority_)); | 123 std::push_heap(next_queues.begin(), next_queues.end(), |
| 124 EvictionOrderComparator(tree_priority_)); |
| 125 } |
| 122 } | 126 } |
| 123 | 127 |
| 124 ScopedPtrVector<TilingSetEvictionQueue>& | 128 std::vector<scoped_ptr<TilingSetEvictionQueue>>& |
| 125 EvictionTilePriorityQueue::GetNextQueues() { | 129 EvictionTilePriorityQueue::GetNextQueues() { |
| 126 return const_cast<ScopedPtrVector<TilingSetEvictionQueue>&>( | 130 const EvictionTilePriorityQueue* const_this = |
| 127 static_cast<const EvictionTilePriorityQueue*>(this)->GetNextQueues()); | 131 static_cast<const EvictionTilePriorityQueue*>(this); |
| 132 const auto& const_queues = const_this->GetNextQueues(); |
| 133 return const_cast<std::vector<scoped_ptr<TilingSetEvictionQueue>>&>( |
| 134 const_queues); |
| 128 } | 135 } |
| 129 | 136 |
| 130 const ScopedPtrVector<TilingSetEvictionQueue>& | 137 const std::vector<scoped_ptr<TilingSetEvictionQueue>>& |
| 131 EvictionTilePriorityQueue::GetNextQueues() const { | 138 EvictionTilePriorityQueue::GetNextQueues() const { |
| 132 DCHECK(!IsEmpty()); | 139 DCHECK(!IsEmpty()); |
| 133 | 140 |
| 134 // If we only have one queue with tiles, return it. | 141 // If we only have one queue with tiles, return it. |
| 135 if (active_queues_.empty()) | 142 if (active_queues_.empty()) |
| 136 return pending_queues_; | 143 return pending_queues_; |
| 137 if (pending_queues_.empty()) | 144 if (pending_queues_.empty()) |
| 138 return active_queues_; | 145 return active_queues_; |
| 139 | 146 |
| 140 const PrioritizedTile& active_tile = active_queues_.front()->Top(); | 147 const PrioritizedTile& active_tile = active_queues_.front()->Top(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 152 : active_queues_; | 159 : active_queues_; |
| 153 } | 160 } |
| 154 | 161 |
| 155 // Return tile with a lower priority. | 162 // Return tile with a lower priority. |
| 156 if (pending_priority.IsHigherPriorityThan(active_priority)) | 163 if (pending_priority.IsHigherPriorityThan(active_priority)) |
| 157 return active_queues_; | 164 return active_queues_; |
| 158 return pending_queues_; | 165 return pending_queues_; |
| 159 } | 166 } |
| 160 | 167 |
| 161 } // namespace cc | 168 } // namespace cc |
| OLD | NEW |