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 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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), |
843 type_(TilePriority::NOW), | 855 type_(TilePriority::NOW), |
844 visible_rect_in_content_space_(tiling_->current_visible_rect_), | |
845 skewport_in_content_space_(tiling_->current_skewport_rect_), | |
846 eventually_rect_in_content_space_(tiling_->current_eventually_rect_), | |
847 soon_border_rect_in_content_space_(tiling_->current_soon_border_rect_), | |
848 tree_(tree), | 856 tree_(tree), |
849 current_tile_(NULL), | 857 current_tile_(NULL), |
850 visible_iterator_(&tiling->tiling_data_, | |
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 skewport_processed_(false) { | 858 skewport_processed_(false) { |
859 if (!tiling_->has_visible_rect_tiles_) { | |
860 AdvancePhase(); | |
861 return; | |
862 } | |
863 | |
864 visible_iterator_ = TilingData::Iterator(&tiling_->tiling_data_, | |
865 tiling_->current_visible_rect_, | |
866 true /* include_borders */); | |
858 if (!visible_iterator_) { | 867 if (!visible_iterator_) { |
859 AdvancePhase(); | 868 AdvancePhase(); |
860 return; | 869 return; |
861 } | 870 } |
862 | 871 |
863 current_tile_ = | 872 current_tile_ = |
864 tiling_->TileAt(visible_iterator_.index_x(), visible_iterator_.index_y()); | 873 tiling_->TileAt(visible_iterator_.index_x(), visible_iterator_.index_y()); |
865 if (!current_tile_ || !TileNeedsRaster(current_tile_)) | 874 if (!current_tile_ || !TileNeedsRaster(current_tile_)) |
866 ++(*this); | 875 ++(*this); |
867 } | 876 } |
868 | 877 |
869 PictureLayerTiling::TilingRasterTileIterator::~TilingRasterTileIterator() {} | 878 PictureLayerTiling::TilingRasterTileIterator::~TilingRasterTileIterator() {} |
870 | 879 |
871 void PictureLayerTiling::TilingRasterTileIterator::AdvancePhase() { | 880 void PictureLayerTiling::TilingRasterTileIterator::AdvancePhase() { |
872 DCHECK_LT(type_, TilePriority::EVENTUALLY); | 881 DCHECK_LT(type_, TilePriority::EVENTUALLY); |
873 | 882 |
874 do { | 883 do { |
875 if (type_ == TilePriority::SOON && !skewport_processed_) | 884 if (type_ == TilePriority::SOON && !skewport_processed_) |
876 skewport_processed_ = true; | 885 skewport_processed_ = true; |
877 else | 886 else |
878 type_ = static_cast<TilePriority::PriorityBin>(type_ + 1); | 887 type_ = static_cast<TilePriority::PriorityBin>(type_ + 1); |
879 | 888 |
880 if (type_ == TilePriority::SOON && skewport_processed_) { | 889 if (type_ == TilePriority::SOON && !skewport_processed_) { |
890 if (!tiling_->has_skewport_rect_tiles_) | |
891 continue; | |
892 | |
893 spiral_iterator_ = | |
894 TilingData::SpiralDifferenceIterator(&tiling_->tiling_data_, | |
895 tiling_->current_skewport_rect_, | |
896 tiling_->current_visible_rect_, | |
897 tiling_->current_visible_rect_); | |
898 } else if (type_ == TilePriority::SOON && skewport_processed_) { | |
899 if (!tiling_->has_soon_border_rect_tiles_) | |
900 continue; | |
901 | |
881 spiral_iterator_ = TilingData::SpiralDifferenceIterator( | 902 spiral_iterator_ = TilingData::SpiralDifferenceIterator( |
882 &tiling_->tiling_data_, | 903 &tiling_->tiling_data_, |
883 soon_border_rect_in_content_space_, | 904 tiling_->current_soon_border_rect_, |
884 skewport_in_content_space_, | 905 tiling_->current_skewport_rect_, |
885 visible_rect_in_content_space_); | 906 tiling_->current_visible_rect_); |
886 } else if (type_ == TilePriority::EVENTUALLY) { | 907 } else if (type_ == TilePriority::EVENTUALLY) { |
908 if (!tiling_->has_eventually_rect_tiles_) { | |
909 current_tile_ = NULL; | |
910 return; | |
911 } | |
912 | |
887 spiral_iterator_ = TilingData::SpiralDifferenceIterator( | 913 spiral_iterator_ = TilingData::SpiralDifferenceIterator( |
888 &tiling_->tiling_data_, | 914 &tiling_->tiling_data_, |
889 eventually_rect_in_content_space_, | 915 tiling_->current_eventually_rect_, |
890 skewport_in_content_space_, | 916 tiling_->current_skewport_rect_, |
891 soon_border_rect_in_content_space_); | 917 tiling_->current_soon_border_rect_); |
892 } | 918 } |
reveman
2014/07/24 13:09:23
This actually made the code a bit easier for me to
| |
893 | 919 |
894 while (spiral_iterator_) { | 920 while (spiral_iterator_) { |
895 current_tile_ = tiling_->TileAt(spiral_iterator_.index_x(), | 921 current_tile_ = tiling_->TileAt(spiral_iterator_.index_x(), |
896 spiral_iterator_.index_y()); | 922 spiral_iterator_.index_y()); |
897 if (current_tile_ && TileNeedsRaster(current_tile_)) | 923 if (current_tile_ && TileNeedsRaster(current_tile_)) |
898 break; | 924 break; |
899 ++spiral_iterator_; | 925 ++spiral_iterator_; |
900 } | 926 } |
901 | 927 |
902 if (!spiral_iterator_ && type_ == TilePriority::EVENTUALLY) { | 928 if (!spiral_iterator_ && type_ == TilePriority::EVENTUALLY) { |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
981 DCHECK(*this); | 1007 DCHECK(*this); |
982 do { | 1008 do { |
983 ++tile_iterator_; | 1009 ++tile_iterator_; |
984 } while (tile_iterator_ != tiling_->eviction_tiles_cache_.end() && | 1010 } while (tile_iterator_ != tiling_->eviction_tiles_cache_.end() && |
985 (!(*tile_iterator_)->HasResources())); | 1011 (!(*tile_iterator_)->HasResources())); |
986 | 1012 |
987 return *this; | 1013 return *this; |
988 } | 1014 } |
989 | 1015 |
990 } // namespace cc | 1016 } // namespace cc |
OLD | NEW |