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 |