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 |