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 <utility> | 5 #include <utility> |
6 | 6 |
7 #include "cc/resources/tiling_set_eviction_queue.h" | 7 #include "cc/resources/tiling_set_eviction_queue.h" |
8 | 8 |
9 namespace cc { | 9 namespace cc { |
10 | 10 |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 } | 181 } |
182 | 182 |
183 // EvictionRectIterator | 183 // EvictionRectIterator |
184 TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator() | 184 TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator() |
185 : tilings_(nullptr), tree_(ACTIVE_TREE), tiling_index_(0) { | 185 : tilings_(nullptr), tree_(ACTIVE_TREE), tiling_index_(0) { |
186 } | 186 } |
187 | 187 |
188 TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator( | 188 TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator( |
189 std::vector<PictureLayerTiling*>* tilings, | 189 std::vector<PictureLayerTiling*>* tilings, |
190 WhichTree tree, | 190 WhichTree tree, |
191 bool skip_pending_visible_rect) | 191 PictureLayerTiling::PriorityRectType priority_rect_type) |
192 : tilings_(tilings), | 192 : tilings_(tilings), |
193 tree_(tree), | 193 tree_(tree), |
194 skip_pending_visible_rect_(skip_pending_visible_rect), | 194 priority_rect_type_(priority_rect_type), |
195 tiling_index_(0) { | 195 tiling_index_(0) { |
196 } | 196 } |
197 | 197 |
198 template <typename TilingIteratorType> | 198 template <typename TilingIteratorType> |
199 bool TilingSetEvictionQueue::EvictionRectIterator::AdvanceToNextTile( | 199 bool TilingSetEvictionQueue::EvictionRectIterator::AdvanceToNextTile( |
200 TilingIteratorType* iterator) { | 200 TilingIteratorType* iterator) { |
201 bool found_tile = false; | 201 bool found_tile = false; |
202 while (!found_tile) { | 202 while (!found_tile) { |
203 ++(*iterator); | 203 ++(*iterator); |
204 if (!(*iterator)) { | 204 if (!(*iterator)) { |
205 prioritized_tile_ = PrioritizedTile(); | 205 prioritized_tile_ = PrioritizedTile(); |
206 break; | 206 break; |
207 } | 207 } |
208 found_tile = GetFirstTileAndCheckIfValid(iterator); | 208 found_tile = GetFirstTileAndCheckIfValid(iterator); |
209 } | 209 } |
210 return found_tile; | 210 return found_tile; |
211 } | 211 } |
212 | 212 |
213 template <typename TilingIteratorType> | 213 template <typename TilingIteratorType> |
214 bool TilingSetEvictionQueue::EvictionRectIterator::GetFirstTileAndCheckIfValid( | 214 bool TilingSetEvictionQueue::EvictionRectIterator::GetFirstTileAndCheckIfValid( |
215 TilingIteratorType* iterator) { | 215 TilingIteratorType* iterator) { |
216 PictureLayerTiling* tiling = (*tilings_)[tiling_index_]; | 216 PictureLayerTiling* tiling = (*tilings_)[tiling_index_]; |
217 Tile* tile = tiling->TileAt(iterator->index_x(), iterator->index_y()); | 217 Tile* tile = tiling->TileAt(iterator->index_x(), iterator->index_y()); |
218 prioritized_tile_ = PrioritizedTile(); | 218 prioritized_tile_ = PrioritizedTile(); |
219 // If there's nothing to evict, return false. | 219 // If there's nothing to evict, return false. |
220 if (!tile || !tile->HasResource()) | 220 if (!tile || !tile->HasResource()) |
221 return false; | 221 return false; |
222 if (skip_pending_visible_rect_ && | 222 // After the pending visible rect has been processed, we must return false |
| 223 // for pending visible rect tiles as tiling iterators do not ignore those |
| 224 // tiles. |
| 225 if (priority_rect_type_ > PictureLayerTiling::PENDING_VISIBLE_RECT && |
223 tiling->pending_visible_rect().Intersects(tile->content_rect())) { | 226 tiling->pending_visible_rect().Intersects(tile->content_rect())) { |
224 return false; | 227 return false; |
225 } | 228 } |
226 (*tilings_)[tiling_index_]->UpdateRequiredStatesOnTile(tile); | 229 (*tilings_)[tiling_index_]->UpdateRequiredStatesOnTile(tile); |
227 prioritized_tile_ = (*tilings_)[tiling_index_]->MakePrioritizedTile(tile); | 230 prioritized_tile_ = (*tilings_)[tiling_index_]->MakePrioritizedTile( |
| 231 tile, priority_rect_type_); |
228 // In other cases, the tile we got is a viable candidate, return true. | 232 // In other cases, the tile we got is a viable candidate, return true. |
229 return true; | 233 return true; |
230 } | 234 } |
231 | 235 |
232 // EventuallyTilingIterator | 236 // EventuallyTilingIterator |
233 TilingSetEvictionQueue::EventuallyTilingIterator::EventuallyTilingIterator( | 237 TilingSetEvictionQueue::EventuallyTilingIterator::EventuallyTilingIterator( |
234 std::vector<PictureLayerTiling*>* tilings, | 238 std::vector<PictureLayerTiling*>* tilings, |
235 WhichTree tree) | 239 WhichTree tree) |
236 : EvictionRectIterator(tilings, | 240 : EvictionRectIterator(tilings, tree, PictureLayerTiling::EVENTUALLY_RECT) { |
237 tree, | |
238 true /* skip_pending_visible_rect */) { | |
239 // Find the first tiling with a tile. | 241 // Find the first tiling with a tile. |
240 while (tiling_index_ < tilings_->size()) { | 242 while (tiling_index_ < tilings_->size()) { |
241 if (!(*tilings_)[tiling_index_]->has_eventually_rect_tiles()) { | 243 if (!(*tilings_)[tiling_index_]->has_eventually_rect_tiles()) { |
242 ++tiling_index_; | 244 ++tiling_index_; |
243 continue; | 245 continue; |
244 } | 246 } |
245 iterator_ = TilingData::ReverseSpiralDifferenceIterator( | 247 iterator_ = TilingData::ReverseSpiralDifferenceIterator( |
246 (*tilings_)[tiling_index_]->tiling_data(), | 248 (*tilings_)[tiling_index_]->tiling_data(), |
247 (*tilings_)[tiling_index_]->current_eventually_rect(), | 249 (*tilings_)[tiling_index_]->current_eventually_rect(), |
248 (*tilings_)[tiling_index_]->current_skewport_rect(), | 250 (*tilings_)[tiling_index_]->current_skewport_rect(), |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 } | 282 } |
281 return *this; | 283 return *this; |
282 } | 284 } |
283 | 285 |
284 // SoonBorderTilingIterator | 286 // SoonBorderTilingIterator |
285 TilingSetEvictionQueue::SoonBorderTilingIterator::SoonBorderTilingIterator( | 287 TilingSetEvictionQueue::SoonBorderTilingIterator::SoonBorderTilingIterator( |
286 std::vector<PictureLayerTiling*>* tilings, | 288 std::vector<PictureLayerTiling*>* tilings, |
287 WhichTree tree) | 289 WhichTree tree) |
288 : EvictionRectIterator(tilings, | 290 : EvictionRectIterator(tilings, |
289 tree, | 291 tree, |
290 true /* skip_pending_visible_rect */) { | 292 PictureLayerTiling::SOON_BORDER_RECT) { |
291 // Find the first tiling with a tile. | 293 // Find the first tiling with a tile. |
292 while (tiling_index_ < tilings_->size()) { | 294 while (tiling_index_ < tilings_->size()) { |
293 if (!(*tilings_)[tiling_index_]->has_soon_border_rect_tiles()) { | 295 if (!(*tilings_)[tiling_index_]->has_soon_border_rect_tiles()) { |
294 ++tiling_index_; | 296 ++tiling_index_; |
295 continue; | 297 continue; |
296 } | 298 } |
297 iterator_ = TilingData::ReverseSpiralDifferenceIterator( | 299 iterator_ = TilingData::ReverseSpiralDifferenceIterator( |
298 (*tilings_)[tiling_index_]->tiling_data(), | 300 (*tilings_)[tiling_index_]->tiling_data(), |
299 (*tilings_)[tiling_index_]->current_soon_border_rect(), | 301 (*tilings_)[tiling_index_]->current_soon_border_rect(), |
300 (*tilings_)[tiling_index_]->current_skewport_rect(), | 302 (*tilings_)[tiling_index_]->current_skewport_rect(), |
(...skipping 29 matching lines...) Expand all Loading... |
330 if (!found_tile) | 332 if (!found_tile) |
331 found_tile = AdvanceToNextTile(&iterator_); | 333 found_tile = AdvanceToNextTile(&iterator_); |
332 } | 334 } |
333 return *this; | 335 return *this; |
334 } | 336 } |
335 | 337 |
336 // SkewportTilingIterator | 338 // SkewportTilingIterator |
337 TilingSetEvictionQueue::SkewportTilingIterator::SkewportTilingIterator( | 339 TilingSetEvictionQueue::SkewportTilingIterator::SkewportTilingIterator( |
338 std::vector<PictureLayerTiling*>* tilings, | 340 std::vector<PictureLayerTiling*>* tilings, |
339 WhichTree tree) | 341 WhichTree tree) |
340 : EvictionRectIterator(tilings, | 342 : EvictionRectIterator(tilings, tree, PictureLayerTiling::SKEWPORT_RECT) { |
341 tree, | |
342 true /* skip_pending_visible_rect */) { | |
343 // Find the first tiling with a tile. | 343 // Find the first tiling with a tile. |
344 while (tiling_index_ < tilings_->size()) { | 344 while (tiling_index_ < tilings_->size()) { |
345 if (!(*tilings_)[tiling_index_]->has_skewport_rect_tiles()) { | 345 if (!(*tilings_)[tiling_index_]->has_skewport_rect_tiles()) { |
346 ++tiling_index_; | 346 ++tiling_index_; |
347 continue; | 347 continue; |
348 } | 348 } |
349 iterator_ = TilingData::ReverseSpiralDifferenceIterator( | 349 iterator_ = TilingData::ReverseSpiralDifferenceIterator( |
350 (*tilings_)[tiling_index_]->tiling_data(), | 350 (*tilings_)[tiling_index_]->tiling_data(), |
351 (*tilings_)[tiling_index_]->current_skewport_rect(), | 351 (*tilings_)[tiling_index_]->current_skewport_rect(), |
352 (*tilings_)[tiling_index_]->current_visible_rect(), | 352 (*tilings_)[tiling_index_]->current_visible_rect(), |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 return *this; | 385 return *this; |
386 } | 386 } |
387 | 387 |
388 // PendingVisibleIterator | 388 // PendingVisibleIterator |
389 TilingSetEvictionQueue::PendingVisibleTilingIterator:: | 389 TilingSetEvictionQueue::PendingVisibleTilingIterator:: |
390 PendingVisibleTilingIterator(std::vector<PictureLayerTiling*>* tilings, | 390 PendingVisibleTilingIterator(std::vector<PictureLayerTiling*>* tilings, |
391 WhichTree tree, | 391 WhichTree tree, |
392 bool return_required_for_activation_tiles) | 392 bool return_required_for_activation_tiles) |
393 : EvictionRectIterator(tilings, | 393 : EvictionRectIterator(tilings, |
394 tree, | 394 tree, |
395 false /* skip_pending_visible_rect */), | 395 PictureLayerTiling::PENDING_VISIBLE_RECT), |
396 return_required_for_activation_tiles_( | 396 return_required_for_activation_tiles_( |
397 return_required_for_activation_tiles) { | 397 return_required_for_activation_tiles) { |
398 // Find the first tiling with a tile. | 398 // Find the first tiling with a tile. |
399 while (tiling_index_ < tilings_->size()) { | 399 while (tiling_index_ < tilings_->size()) { |
400 iterator_ = TilingData::DifferenceIterator( | 400 iterator_ = TilingData::DifferenceIterator( |
401 (*tilings_)[tiling_index_]->tiling_data(), | 401 (*tilings_)[tiling_index_]->tiling_data(), |
402 (*tilings_)[tiling_index_]->pending_visible_rect(), | 402 (*tilings_)[tiling_index_]->pending_visible_rect(), |
403 (*tilings_)[tiling_index_]->current_visible_rect()); | 403 (*tilings_)[tiling_index_]->current_visible_rect()); |
404 if (!iterator_) { | 404 if (!iterator_) { |
405 ++tiling_index_; | 405 ++tiling_index_; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
449 return_required_for_activation_tiles_; | 449 return_required_for_activation_tiles_; |
450 return activation_flag_matches; | 450 return activation_flag_matches; |
451 } | 451 } |
452 | 452 |
453 // VisibleTilingIterator | 453 // VisibleTilingIterator |
454 TilingSetEvictionQueue::VisibleTilingIterator::VisibleTilingIterator( | 454 TilingSetEvictionQueue::VisibleTilingIterator::VisibleTilingIterator( |
455 std::vector<PictureLayerTiling*>* tilings, | 455 std::vector<PictureLayerTiling*>* tilings, |
456 WhichTree tree, | 456 WhichTree tree, |
457 bool return_occluded_tiles, | 457 bool return_occluded_tiles, |
458 bool return_required_for_activation_tiles) | 458 bool return_required_for_activation_tiles) |
459 : EvictionRectIterator(tilings, | 459 : EvictionRectIterator(tilings, tree, PictureLayerTiling::VISIBLE_RECT), |
460 tree, | |
461 false /* skip_pending_visible_rect */), | |
462 return_occluded_tiles_(return_occluded_tiles), | 460 return_occluded_tiles_(return_occluded_tiles), |
463 return_required_for_activation_tiles_( | 461 return_required_for_activation_tiles_( |
464 return_required_for_activation_tiles) { | 462 return_required_for_activation_tiles) { |
465 // Find the first tiling with a tile. | 463 // Find the first tiling with a tile. |
466 while (tiling_index_ < tilings_->size()) { | 464 while (tiling_index_ < tilings_->size()) { |
467 if (!(*tilings_)[tiling_index_]->has_visible_rect_tiles()) { | 465 if (!(*tilings_)[tiling_index_]->has_visible_rect_tiles()) { |
468 ++tiling_index_; | 466 ++tiling_index_; |
469 continue; | 467 continue; |
470 } | 468 } |
471 iterator_ = TilingData::Iterator( | 469 iterator_ = TilingData::Iterator( |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
516 | 514 |
517 bool TilingSetEvictionQueue::VisibleTilingIterator::TileMatchesRequiredFlags( | 515 bool TilingSetEvictionQueue::VisibleTilingIterator::TileMatchesRequiredFlags( |
518 const PrioritizedTile& tile) const { | 516 const PrioritizedTile& tile) const { |
519 bool activation_flag_matches = tile.tile()->required_for_activation() == | 517 bool activation_flag_matches = tile.tile()->required_for_activation() == |
520 return_required_for_activation_tiles_; | 518 return_required_for_activation_tiles_; |
521 bool occluded_flag_matches = tile.is_occluded() == return_occluded_tiles_; | 519 bool occluded_flag_matches = tile.is_occluded() == return_occluded_tiles_; |
522 return activation_flag_matches && occluded_flag_matches; | 520 return activation_flag_matches && occluded_flag_matches; |
523 } | 521 } |
524 | 522 |
525 } // namespace cc | 523 } // namespace cc |
OLD | NEW |