OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/picture_layer_tiling.h" | 5 #include "cc/resources/picture_layer_tiling.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 #include <limits> | 9 #include <limits> |
10 | 10 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 | 70 |
71 PictureLayerTiling::PictureLayerTiling(float contents_scale, | 71 PictureLayerTiling::PictureLayerTiling(float contents_scale, |
72 const gfx::Size& layer_bounds, | 72 const gfx::Size& layer_bounds, |
73 PictureLayerTilingClient* client) | 73 PictureLayerTilingClient* client) |
74 : contents_scale_(contents_scale), | 74 : contents_scale_(contents_scale), |
75 layer_bounds_(layer_bounds), | 75 layer_bounds_(layer_bounds), |
76 resolution_(NON_IDEAL_RESOLUTION), | 76 resolution_(NON_IDEAL_RESOLUTION), |
77 client_(client), | 77 client_(client), |
78 tiling_data_(gfx::Size(), gfx::Size(), true), | 78 tiling_data_(gfx::Size(), gfx::Size(), true), |
79 last_impl_frame_time_in_seconds_(0.0), | 79 last_impl_frame_time_in_seconds_(0.0), |
| 80 has_visible_rect_tiles_(false), |
| 81 has_skewport_rect_tiles_(false), |
| 82 has_soon_border_rect_tiles_(false), |
| 83 has_eventually_rect_tiles_(false), |
80 eviction_tiles_cache_valid_(false), | 84 eviction_tiles_cache_valid_(false), |
81 eviction_cache_tree_priority_(SAME_PRIORITY_FOR_BOTH_TREES) { | 85 eviction_cache_tree_priority_(SAME_PRIORITY_FOR_BOTH_TREES) { |
82 gfx::Size content_bounds = | 86 gfx::Size content_bounds = |
83 gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds, contents_scale)); | 87 gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds, contents_scale)); |
84 gfx::Size tile_size = client_->CalculateTileSize(content_bounds); | 88 gfx::Size tile_size = client_->CalculateTileSize(content_bounds); |
85 | 89 |
86 DCHECK(!gfx::ToFlooredSize( | 90 DCHECK(!gfx::ToFlooredSize( |
87 gfx::ScaleSize(layer_bounds, contents_scale)).IsEmpty()) << | 91 gfx::ScaleSize(layer_bounds, contents_scale)).IsEmpty()) << |
88 "Tiling created with scale too small as contents become empty." << | 92 "Tiling created with scale too small as contents become empty." << |
89 " Layer bounds: " << layer_bounds.ToString() << | 93 " Layer bounds: " << layer_bounds.ToString() << |
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
482 last_visible_rect_in_content_space_ = visible_rect_in_content_space; | 486 last_visible_rect_in_content_space_ = visible_rect_in_content_space; |
483 | 487 |
484 eviction_tiles_cache_valid_ = false; | 488 eviction_tiles_cache_valid_ = false; |
485 | 489 |
486 TilePriority now_priority(resolution_, TilePriority::NOW, 0); | 490 TilePriority now_priority(resolution_, TilePriority::NOW, 0); |
487 float content_to_screen_scale = | 491 float content_to_screen_scale = |
488 1.0f / (contents_scale_ * ideal_contents_scale); | 492 1.0f / (contents_scale_ * ideal_contents_scale); |
489 | 493 |
490 // Assign now priority to all visible tiles. | 494 // Assign now priority to all visible tiles. |
491 bool include_borders = true; | 495 bool include_borders = true; |
| 496 has_visible_rect_tiles_ = false; |
492 for (TilingData::Iterator iter( | 497 for (TilingData::Iterator iter( |
493 &tiling_data_, visible_rect_in_content_space, include_borders); | 498 &tiling_data_, visible_rect_in_content_space, include_borders); |
494 iter; | 499 iter; |
495 ++iter) { | 500 ++iter) { |
496 TileMap::iterator find = tiles_.find(iter.index()); | 501 TileMap::iterator find = tiles_.find(iter.index()); |
497 if (find == tiles_.end()) | 502 if (find == tiles_.end()) |
498 continue; | 503 continue; |
| 504 has_visible_rect_tiles_ = true; |
499 Tile* tile = find->second.get(); | 505 Tile* tile = find->second.get(); |
500 | 506 |
501 tile->SetPriority(tree, now_priority); | 507 tile->SetPriority(tree, now_priority); |
502 | 508 |
503 // Set whether tile is occluded or not. | 509 // Set whether tile is occluded or not. |
504 bool is_occluded = false; | 510 bool is_occluded = false; |
505 if (occlusion_tracker) { | 511 if (occlusion_tracker) { |
506 gfx::Rect tile_query_rect = ScaleToEnclosingRect( | 512 gfx::Rect tile_query_rect = ScaleToEnclosingRect( |
507 IntersectRects(tile->content_rect(), visible_rect_in_content_space), | 513 IntersectRects(tile->content_rect(), visible_rect_in_content_space), |
508 1.0f / contents_scale_); | 514 1.0f / contents_scale_); |
509 // TODO(vmpstr): Remove render_target and draw_transform from the | 515 // TODO(vmpstr): Remove render_target and draw_transform from the |
510 // parameters so they can be hidden from the tiling. | 516 // parameters so they can be hidden from the tiling. |
511 is_occluded = occlusion_tracker->Occluded( | 517 is_occluded = occlusion_tracker->Occluded( |
512 render_target, tile_query_rect, draw_transform); | 518 render_target, tile_query_rect, draw_transform); |
513 } | 519 } |
514 tile->set_is_occluded(tree, is_occluded); | 520 tile->set_is_occluded(tree, is_occluded); |
515 } | 521 } |
516 | 522 |
517 // Assign soon priority to skewport tiles. | 523 // Assign soon priority to skewport tiles. |
| 524 has_skewport_rect_tiles_ = false; |
518 for (TilingData::DifferenceIterator iter( | 525 for (TilingData::DifferenceIterator iter( |
519 &tiling_data_, skewport, visible_rect_in_content_space); | 526 &tiling_data_, skewport, visible_rect_in_content_space); |
520 iter; | 527 iter; |
521 ++iter) { | 528 ++iter) { |
522 TileMap::iterator find = tiles_.find(iter.index()); | 529 TileMap::iterator find = tiles_.find(iter.index()); |
523 if (find == tiles_.end()) | 530 if (find == tiles_.end()) |
524 continue; | 531 continue; |
| 532 has_skewport_rect_tiles_ = true; |
525 Tile* tile = find->second.get(); | 533 Tile* tile = find->second.get(); |
526 | 534 |
527 gfx::Rect tile_bounds = | 535 gfx::Rect tile_bounds = |
528 tiling_data_.TileBounds(iter.index_x(), iter.index_y()); | 536 tiling_data_.TileBounds(iter.index_x(), iter.index_y()); |
529 | 537 |
530 float distance_to_visible = | 538 float distance_to_visible = |
531 visible_rect_in_content_space.ManhattanInternalDistance(tile_bounds) * | 539 visible_rect_in_content_space.ManhattanInternalDistance(tile_bounds) * |
532 content_to_screen_scale; | 540 content_to_screen_scale; |
533 | 541 |
534 TilePriority priority(resolution_, TilePriority::SOON, distance_to_visible); | 542 TilePriority priority(resolution_, TilePriority::SOON, distance_to_visible); |
535 tile->SetPriority(tree, priority); | 543 tile->SetPriority(tree, priority); |
536 } | 544 } |
537 | 545 |
538 // Assign eventually priority to interest rect tiles. | 546 // Assign eventually priority to interest rect tiles. |
| 547 has_eventually_rect_tiles_ = false; |
539 for (TilingData::DifferenceIterator iter( | 548 for (TilingData::DifferenceIterator iter( |
540 &tiling_data_, eventually_rect, skewport); | 549 &tiling_data_, eventually_rect, skewport); |
541 iter; | 550 iter; |
542 ++iter) { | 551 ++iter) { |
543 TileMap::iterator find = tiles_.find(iter.index()); | 552 TileMap::iterator find = tiles_.find(iter.index()); |
544 if (find == tiles_.end()) | 553 if (find == tiles_.end()) |
545 continue; | 554 continue; |
| 555 has_eventually_rect_tiles_ = true; |
546 Tile* tile = find->second.get(); | 556 Tile* tile = find->second.get(); |
547 | 557 |
548 gfx::Rect tile_bounds = | 558 gfx::Rect tile_bounds = |
549 tiling_data_.TileBounds(iter.index_x(), iter.index_y()); | 559 tiling_data_.TileBounds(iter.index_x(), iter.index_y()); |
550 | 560 |
551 float distance_to_visible = | 561 float distance_to_visible = |
552 visible_rect_in_content_space.ManhattanInternalDistance(tile_bounds) * | 562 visible_rect_in_content_space.ManhattanInternalDistance(tile_bounds) * |
553 content_to_screen_scale; | 563 content_to_screen_scale; |
554 TilePriority priority( | 564 TilePriority priority( |
555 resolution_, TilePriority::EVENTUALLY, distance_to_visible); | 565 resolution_, TilePriority::EVENTUALLY, distance_to_visible); |
556 tile->SetPriority(tree, priority); | 566 tile->SetPriority(tree, priority); |
557 } | 567 } |
558 | 568 |
559 // Upgrade the priority on border tiles to be SOON. | 569 // Upgrade the priority on border tiles to be SOON. |
560 gfx::Rect soon_border_rect = visible_rect_in_content_space; | 570 gfx::Rect soon_border_rect = visible_rect_in_content_space; |
561 float border = kSoonBorderDistanceInScreenPixels / content_to_screen_scale; | 571 float border = kSoonBorderDistanceInScreenPixels / content_to_screen_scale; |
562 soon_border_rect.Inset(-border, -border, -border, -border); | 572 soon_border_rect.Inset(-border, -border, -border, -border); |
| 573 has_soon_border_rect_tiles_ = false; |
563 for (TilingData::DifferenceIterator iter( | 574 for (TilingData::DifferenceIterator iter( |
564 &tiling_data_, soon_border_rect, skewport); | 575 &tiling_data_, soon_border_rect, skewport); |
565 iter; | 576 iter; |
566 ++iter) { | 577 ++iter) { |
567 TileMap::iterator find = tiles_.find(iter.index()); | 578 TileMap::iterator find = tiles_.find(iter.index()); |
568 if (find == tiles_.end()) | 579 if (find == tiles_.end()) |
569 continue; | 580 continue; |
| 581 has_soon_border_rect_tiles_ = true; |
570 Tile* tile = find->second.get(); | 582 Tile* tile = find->second.get(); |
571 | 583 |
572 TilePriority priority(resolution_, | 584 TilePriority priority(resolution_, |
573 TilePriority::SOON, | 585 TilePriority::SOON, |
574 tile->priority(tree).distance_to_visible); | 586 tile->priority(tree).distance_to_visible); |
575 tile->SetPriority(tree, priority); | 587 tile->SetPriority(tree, priority); |
576 } | 588 } |
577 | 589 |
578 // Update iteration rects. | 590 // Update iteration rects. |
579 current_visible_rect_ = visible_rect_in_content_space; | 591 current_visible_rect_ = visible_rect_in_content_space; |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
832 eviction_tiles_cache_valid_ = true; | 844 eviction_tiles_cache_valid_ = true; |
833 eviction_cache_tree_priority_ = tree_priority; | 845 eviction_cache_tree_priority_ = tree_priority; |
834 } | 846 } |
835 | 847 |
836 PictureLayerTiling::TilingRasterTileIterator::TilingRasterTileIterator() | 848 PictureLayerTiling::TilingRasterTileIterator::TilingRasterTileIterator() |
837 : tiling_(NULL), current_tile_(NULL) {} | 849 : tiling_(NULL), current_tile_(NULL) {} |
838 | 850 |
839 PictureLayerTiling::TilingRasterTileIterator::TilingRasterTileIterator( | 851 PictureLayerTiling::TilingRasterTileIterator::TilingRasterTileIterator( |
840 PictureLayerTiling* tiling, | 852 PictureLayerTiling* tiling, |
841 WhichTree tree) | 853 WhichTree tree) |
842 : tiling_(tiling), | 854 : tiling_(tiling), phase_(VISIBLE_RECT), tree_(tree), current_tile_(NULL) { |
843 phase_(VISIBLE_RECT), | 855 if (!tiling_->has_visible_rect_tiles_) { |
844 visible_rect_in_content_space_(tiling_->current_visible_rect_), | 856 AdvancePhase(); |
845 skewport_in_content_space_(tiling_->current_skewport_rect_), | 857 return; |
846 eventually_rect_in_content_space_(tiling_->current_eventually_rect_), | 858 } |
847 soon_border_rect_in_content_space_(tiling_->current_soon_border_rect_), | 859 |
848 tree_(tree), | 860 visible_iterator_ = TilingData::Iterator(&tiling_->tiling_data_, |
849 current_tile_(NULL), | 861 tiling_->current_visible_rect_, |
850 visible_iterator_(&tiling->tiling_data_, | 862 true /* include_borders */); |
851 visible_rect_in_content_space_, | |
852 true /* include_borders */), | |
853 spiral_iterator_(&tiling->tiling_data_, | |
854 skewport_in_content_space_, | |
855 visible_rect_in_content_space_, | |
856 visible_rect_in_content_space_) { | |
857 if (!visible_iterator_) { | 863 if (!visible_iterator_) { |
858 AdvancePhase(); | 864 AdvancePhase(); |
859 return; | 865 return; |
860 } | 866 } |
861 | 867 |
862 current_tile_ = | 868 current_tile_ = |
863 tiling_->TileAt(visible_iterator_.index_x(), visible_iterator_.index_y()); | 869 tiling_->TileAt(visible_iterator_.index_x(), visible_iterator_.index_y()); |
864 if (!current_tile_ || !TileNeedsRaster(current_tile_)) | 870 if (!current_tile_ || !TileNeedsRaster(current_tile_)) |
865 ++(*this); | 871 ++(*this); |
866 } | 872 } |
867 | 873 |
868 PictureLayerTiling::TilingRasterTileIterator::~TilingRasterTileIterator() {} | 874 PictureLayerTiling::TilingRasterTileIterator::~TilingRasterTileIterator() {} |
869 | 875 |
870 void PictureLayerTiling::TilingRasterTileIterator::AdvancePhase() { | 876 void PictureLayerTiling::TilingRasterTileIterator::AdvancePhase() { |
871 DCHECK_LT(phase_, EVENTUALLY_RECT); | 877 DCHECK_LT(phase_, EVENTUALLY_RECT); |
872 | 878 |
873 do { | 879 do { |
874 phase_ = static_cast<Phase>(phase_ + 1); | 880 phase_ = static_cast<Phase>(phase_ + 1); |
| 881 switch (phase_) { |
| 882 case VISIBLE_RECT: |
| 883 NOTREACHED(); |
| 884 return; |
| 885 case SKEWPORT_RECT: |
| 886 if (!tiling_->has_skewport_rect_tiles_) |
| 887 continue; |
875 | 888 |
876 if (phase_ == SOON_BORDER_RECT) { | 889 spiral_iterator_ = TilingData::SpiralDifferenceIterator( |
877 spiral_iterator_ = TilingData::SpiralDifferenceIterator( | 890 &tiling_->tiling_data_, |
878 &tiling_->tiling_data_, | 891 tiling_->current_skewport_rect_, |
879 soon_border_rect_in_content_space_, | 892 tiling_->current_visible_rect_, |
880 skewport_in_content_space_, | 893 tiling_->current_visible_rect_); |
881 visible_rect_in_content_space_); | 894 break; |
882 } else if (phase_ == EVENTUALLY_RECT) { | 895 case SOON_BORDER_RECT: |
883 spiral_iterator_ = TilingData::SpiralDifferenceIterator( | 896 if (!tiling_->has_soon_border_rect_tiles_) |
884 &tiling_->tiling_data_, | 897 continue; |
885 eventually_rect_in_content_space_, | 898 |
886 skewport_in_content_space_, | 899 spiral_iterator_ = TilingData::SpiralDifferenceIterator( |
887 soon_border_rect_in_content_space_); | 900 &tiling_->tiling_data_, |
| 901 tiling_->current_soon_border_rect_, |
| 902 tiling_->current_skewport_rect_, |
| 903 tiling_->current_visible_rect_); |
| 904 break; |
| 905 case EVENTUALLY_RECT: |
| 906 if (!tiling_->has_eventually_rect_tiles_) { |
| 907 current_tile_ = NULL; |
| 908 return; |
| 909 } |
| 910 |
| 911 spiral_iterator_ = TilingData::SpiralDifferenceIterator( |
| 912 &tiling_->tiling_data_, |
| 913 tiling_->current_eventually_rect_, |
| 914 tiling_->current_skewport_rect_, |
| 915 tiling_->current_soon_border_rect_); |
| 916 break; |
888 } | 917 } |
889 | 918 |
890 while (spiral_iterator_) { | 919 while (spiral_iterator_) { |
891 current_tile_ = tiling_->TileAt(spiral_iterator_.index_x(), | 920 current_tile_ = tiling_->TileAt(spiral_iterator_.index_x(), |
892 spiral_iterator_.index_y()); | 921 spiral_iterator_.index_y()); |
893 if (current_tile_ && TileNeedsRaster(current_tile_)) | 922 if (current_tile_ && TileNeedsRaster(current_tile_)) |
894 break; | 923 break; |
895 ++spiral_iterator_; | 924 ++spiral_iterator_; |
896 } | 925 } |
897 | 926 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
978 DCHECK(*this); | 1007 DCHECK(*this); |
979 do { | 1008 do { |
980 ++tile_iterator_; | 1009 ++tile_iterator_; |
981 } while (tile_iterator_ != tiling_->eviction_tiles_cache_.end() && | 1010 } while (tile_iterator_ != tiling_->eviction_tiles_cache_.end() && |
982 (!(*tile_iterator_)->HasResources())); | 1011 (!(*tile_iterator_)->HasResources())); |
983 | 1012 |
984 return *this; | 1013 return *this; |
985 } | 1014 } |
986 | 1015 |
987 } // namespace cc | 1016 } // namespace cc |
OLD | NEW |