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 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
191 TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator() | 191 TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator() |
192 : tile_(nullptr), | 192 : tile_(nullptr), |
193 tilings_(nullptr), | 193 tilings_(nullptr), |
194 tree_(ACTIVE_TREE), | 194 tree_(ACTIVE_TREE), |
195 tiling_index_(0) { | 195 tiling_index_(0) { |
196 } | 196 } |
197 | 197 |
198 TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator( | 198 TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator( |
199 std::vector<PictureLayerTiling*>* tilings, | 199 std::vector<PictureLayerTiling*>* tilings, |
200 WhichTree tree, | 200 WhichTree tree, |
201 bool skip_pending_visible_rect) | 201 PictureLayerTiling::PriorityRect priority_rect) |
202 : tile_(nullptr), | 202 : tile_(nullptr), |
203 tilings_(tilings), | 203 tilings_(tilings), |
204 tree_(tree), | 204 tree_(tree), |
205 skip_pending_visible_rect_(skip_pending_visible_rect), | 205 priority_rect_(priority_rect), |
206 tiling_index_(0) { | 206 tiling_index_(0) { |
207 } | 207 } |
208 | 208 |
209 template <typename TilingIteratorType> | 209 template <typename TilingIteratorType> |
210 bool TilingSetEvictionQueue::EvictionRectIterator::AdvanceToNextTile( | 210 bool TilingSetEvictionQueue::EvictionRectIterator::AdvanceToNextTile( |
211 TilingIteratorType* iterator) { | 211 TilingIteratorType* iterator) { |
212 bool found_tile = false; | 212 bool found_tile = false; |
213 while (!found_tile) { | 213 while (!found_tile) { |
214 ++(*iterator); | 214 ++(*iterator); |
215 if (!(*iterator)) { | 215 if (!(*iterator)) { |
216 tile_ = nullptr; | 216 tile_ = nullptr; |
217 break; | 217 break; |
218 } | 218 } |
219 found_tile = GetFirstTileAndCheckIfValid(iterator); | 219 found_tile = GetFirstTileAndCheckIfValid(iterator); |
220 } | 220 } |
221 return found_tile; | 221 return found_tile; |
222 } | 222 } |
223 | 223 |
224 template <typename TilingIteratorType> | 224 template <typename TilingIteratorType> |
225 bool TilingSetEvictionQueue::EvictionRectIterator::GetFirstTileAndCheckIfValid( | 225 bool TilingSetEvictionQueue::EvictionRectIterator::GetFirstTileAndCheckIfValid( |
226 TilingIteratorType* iterator) { | 226 TilingIteratorType* iterator) { |
227 PictureLayerTiling* tiling = (*tilings_)[tiling_index_]; | 227 PictureLayerTiling* tiling = (*tilings_)[tiling_index_]; |
228 tile_ = tiling->TileAt(iterator->index_x(), iterator->index_y()); | 228 tile_ = tiling->TileAt(iterator->index_x(), iterator->index_y()); |
229 // If there's nothing to evict, return false. | 229 // If there's nothing to evict, return false. |
230 if (!tile_ || !tile_->HasResource()) | 230 if (!tile_ || !tile_->HasResource()) |
231 return false; | 231 return false; |
232 if (skip_pending_visible_rect_ && | 232 if (priority_rect_ > PictureLayerTiling::PriorityRect::PENDING_VISIBLE_RECT && |
vmpstr
2015/05/05 18:04:02
Can you leave a comment here, just something expla
USE eero AT chromium.org
2015/05/06 12:05:20
Done.
| |
233 tiling->pending_visible_rect().Intersects(tile_->content_rect())) { | 233 tiling->pending_visible_rect().Intersects(tile_->content_rect())) { |
234 return false; | 234 return false; |
235 } | 235 } |
236 (*tilings_)[tiling_index_]->UpdateTilePriority(tile_); | 236 (*tilings_)[tiling_index_]->UpdateTilePriority(tile_, priority_rect_); |
237 // In other cases, the tile we got is a viable candidate, return true. | 237 // In other cases, the tile we got is a viable candidate, return true. |
238 return true; | 238 return true; |
239 } | 239 } |
240 | 240 |
241 // EventuallyTilingIterator | 241 // EventuallyTilingIterator |
242 TilingSetEvictionQueue::EventuallyTilingIterator::EventuallyTilingIterator( | 242 TilingSetEvictionQueue::EventuallyTilingIterator::EventuallyTilingIterator( |
243 std::vector<PictureLayerTiling*>* tilings, | 243 std::vector<PictureLayerTiling*>* tilings, |
244 WhichTree tree) | 244 WhichTree tree) |
245 : EvictionRectIterator(tilings, | 245 : EvictionRectIterator(tilings, |
246 tree, | 246 tree, |
247 true /* skip_pending_visible_rect */) { | 247 PictureLayerTiling::PriorityRect::EVENTUALLY_RECT) { |
248 // Find the first tiling with a tile. | 248 // Find the first tiling with a tile. |
249 while (tiling_index_ < tilings_->size()) { | 249 while (tiling_index_ < tilings_->size()) { |
250 if (!(*tilings_)[tiling_index_]->has_eventually_rect_tiles()) { | 250 if (!(*tilings_)[tiling_index_]->has_eventually_rect_tiles()) { |
251 ++tiling_index_; | 251 ++tiling_index_; |
252 continue; | 252 continue; |
253 } | 253 } |
254 iterator_ = TilingData::ReverseSpiralDifferenceIterator( | 254 iterator_ = TilingData::ReverseSpiralDifferenceIterator( |
255 (*tilings_)[tiling_index_]->tiling_data(), | 255 (*tilings_)[tiling_index_]->tiling_data(), |
256 (*tilings_)[tiling_index_]->current_eventually_rect(), | 256 (*tilings_)[tiling_index_]->current_eventually_rect(), |
257 (*tilings_)[tiling_index_]->current_skewport_rect(), | 257 (*tilings_)[tiling_index_]->current_skewport_rect(), |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
289 } | 289 } |
290 return *this; | 290 return *this; |
291 } | 291 } |
292 | 292 |
293 // SoonBorderTilingIterator | 293 // SoonBorderTilingIterator |
294 TilingSetEvictionQueue::SoonBorderTilingIterator::SoonBorderTilingIterator( | 294 TilingSetEvictionQueue::SoonBorderTilingIterator::SoonBorderTilingIterator( |
295 std::vector<PictureLayerTiling*>* tilings, | 295 std::vector<PictureLayerTiling*>* tilings, |
296 WhichTree tree) | 296 WhichTree tree) |
297 : EvictionRectIterator(tilings, | 297 : EvictionRectIterator(tilings, |
298 tree, | 298 tree, |
299 true /* skip_pending_visible_rect */) { | 299 PictureLayerTiling::PriorityRect::SOON_BORDER_RECT) { |
vmpstr
2015/05/05 18:04:01
The PriorityRect:: part is not needed here, unless
USE eero AT chromium.org
2015/05/06 12:05:20
I do not want to make it an enum. But I thought th
| |
300 // Find the first tiling with a tile. | 300 // Find the first tiling with a tile. |
301 while (tiling_index_ < tilings_->size()) { | 301 while (tiling_index_ < tilings_->size()) { |
302 if (!(*tilings_)[tiling_index_]->has_soon_border_rect_tiles()) { | 302 if (!(*tilings_)[tiling_index_]->has_soon_border_rect_tiles()) { |
303 ++tiling_index_; | 303 ++tiling_index_; |
304 continue; | 304 continue; |
305 } | 305 } |
306 iterator_ = TilingData::ReverseSpiralDifferenceIterator( | 306 iterator_ = TilingData::ReverseSpiralDifferenceIterator( |
307 (*tilings_)[tiling_index_]->tiling_data(), | 307 (*tilings_)[tiling_index_]->tiling_data(), |
308 (*tilings_)[tiling_index_]->current_soon_border_rect(), | 308 (*tilings_)[tiling_index_]->current_soon_border_rect(), |
309 (*tilings_)[tiling_index_]->current_skewport_rect(), | 309 (*tilings_)[tiling_index_]->current_skewport_rect(), |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
341 } | 341 } |
342 return *this; | 342 return *this; |
343 } | 343 } |
344 | 344 |
345 // SkewportTilingIterator | 345 // SkewportTilingIterator |
346 TilingSetEvictionQueue::SkewportTilingIterator::SkewportTilingIterator( | 346 TilingSetEvictionQueue::SkewportTilingIterator::SkewportTilingIterator( |
347 std::vector<PictureLayerTiling*>* tilings, | 347 std::vector<PictureLayerTiling*>* tilings, |
348 WhichTree tree) | 348 WhichTree tree) |
349 : EvictionRectIterator(tilings, | 349 : EvictionRectIterator(tilings, |
350 tree, | 350 tree, |
351 true /* skip_pending_visible_rect */) { | 351 PictureLayerTiling::PriorityRect::SKEWPORT_RECT) { |
352 // Find the first tiling with a tile. | 352 // Find the first tiling with a tile. |
353 while (tiling_index_ < tilings_->size()) { | 353 while (tiling_index_ < tilings_->size()) { |
354 if (!(*tilings_)[tiling_index_]->has_skewport_rect_tiles()) { | 354 if (!(*tilings_)[tiling_index_]->has_skewport_rect_tiles()) { |
355 ++tiling_index_; | 355 ++tiling_index_; |
356 continue; | 356 continue; |
357 } | 357 } |
358 iterator_ = TilingData::ReverseSpiralDifferenceIterator( | 358 iterator_ = TilingData::ReverseSpiralDifferenceIterator( |
359 (*tilings_)[tiling_index_]->tiling_data(), | 359 (*tilings_)[tiling_index_]->tiling_data(), |
360 (*tilings_)[tiling_index_]->current_skewport_rect(), | 360 (*tilings_)[tiling_index_]->current_skewport_rect(), |
361 (*tilings_)[tiling_index_]->current_visible_rect(), | 361 (*tilings_)[tiling_index_]->current_visible_rect(), |
(...skipping 30 matching lines...) Expand all Loading... | |
392 found_tile = AdvanceToNextTile(&iterator_); | 392 found_tile = AdvanceToNextTile(&iterator_); |
393 } | 393 } |
394 return *this; | 394 return *this; |
395 } | 395 } |
396 | 396 |
397 // PendingVisibleIterator | 397 // PendingVisibleIterator |
398 TilingSetEvictionQueue::PendingVisibleTilingIterator:: | 398 TilingSetEvictionQueue::PendingVisibleTilingIterator:: |
399 PendingVisibleTilingIterator(std::vector<PictureLayerTiling*>* tilings, | 399 PendingVisibleTilingIterator(std::vector<PictureLayerTiling*>* tilings, |
400 WhichTree tree, | 400 WhichTree tree, |
401 bool return_required_for_activation_tiles) | 401 bool return_required_for_activation_tiles) |
402 : EvictionRectIterator(tilings, | 402 : EvictionRectIterator( |
403 tree, | 403 tilings, |
404 false /* skip_pending_visible_rect */), | 404 tree, |
405 PictureLayerTiling::PriorityRect::PENDING_VISIBLE_RECT), | |
405 return_required_for_activation_tiles_( | 406 return_required_for_activation_tiles_( |
406 return_required_for_activation_tiles) { | 407 return_required_for_activation_tiles) { |
407 // Find the first tiling with a tile. | 408 // Find the first tiling with a tile. |
408 while (tiling_index_ < tilings_->size()) { | 409 while (tiling_index_ < tilings_->size()) { |
409 iterator_ = TilingData::DifferenceIterator( | 410 iterator_ = TilingData::DifferenceIterator( |
410 (*tilings_)[tiling_index_]->tiling_data(), | 411 (*tilings_)[tiling_index_]->tiling_data(), |
411 (*tilings_)[tiling_index_]->pending_visible_rect(), | 412 (*tilings_)[tiling_index_]->pending_visible_rect(), |
412 (*tilings_)[tiling_index_]->current_visible_rect()); | 413 (*tilings_)[tiling_index_]->current_visible_rect()); |
413 if (!iterator_) { | 414 if (!iterator_) { |
414 ++tiling_index_; | 415 ++tiling_index_; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
460 } | 461 } |
461 | 462 |
462 // VisibleTilingIterator | 463 // VisibleTilingIterator |
463 TilingSetEvictionQueue::VisibleTilingIterator::VisibleTilingIterator( | 464 TilingSetEvictionQueue::VisibleTilingIterator::VisibleTilingIterator( |
464 std::vector<PictureLayerTiling*>* tilings, | 465 std::vector<PictureLayerTiling*>* tilings, |
465 WhichTree tree, | 466 WhichTree tree, |
466 bool return_occluded_tiles, | 467 bool return_occluded_tiles, |
467 bool return_required_for_activation_tiles) | 468 bool return_required_for_activation_tiles) |
468 : EvictionRectIterator(tilings, | 469 : EvictionRectIterator(tilings, |
469 tree, | 470 tree, |
470 false /* skip_pending_visible_rect */), | 471 PictureLayerTiling::PriorityRect::VISIBLE_RECT), |
471 return_occluded_tiles_(return_occluded_tiles), | 472 return_occluded_tiles_(return_occluded_tiles), |
472 return_required_for_activation_tiles_( | 473 return_required_for_activation_tiles_( |
473 return_required_for_activation_tiles) { | 474 return_required_for_activation_tiles) { |
474 // Find the first tiling with a tile. | 475 // Find the first tiling with a tile. |
475 while (tiling_index_ < tilings_->size()) { | 476 while (tiling_index_ < tilings_->size()) { |
476 if (!(*tilings_)[tiling_index_]->has_visible_rect_tiles()) { | 477 if (!(*tilings_)[tiling_index_]->has_visible_rect_tiles()) { |
477 ++tiling_index_; | 478 ++tiling_index_; |
478 continue; | 479 continue; |
479 } | 480 } |
480 iterator_ = TilingData::Iterator( | 481 iterator_ = TilingData::Iterator( |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
525 | 526 |
526 bool TilingSetEvictionQueue::VisibleTilingIterator::TileMatchesRequiredFlags( | 527 bool TilingSetEvictionQueue::VisibleTilingIterator::TileMatchesRequiredFlags( |
527 const Tile* tile) const { | 528 const Tile* tile) const { |
528 bool activation_flag_matches = | 529 bool activation_flag_matches = |
529 tile->required_for_activation() == return_required_for_activation_tiles_; | 530 tile->required_for_activation() == return_required_for_activation_tiles_; |
530 bool occluded_flag_matches = tile->is_occluded() == return_occluded_tiles_; | 531 bool occluded_flag_matches = tile->is_occluded() == return_occluded_tiles_; |
531 return activation_flag_matches && occluded_flag_matches; | 532 return activation_flag_matches && occluded_flag_matches; |
532 } | 533 } |
533 | 534 |
534 } // namespace cc | 535 } // namespace cc |
OLD | NEW |