Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(247)

Side by Side Diff: cc/resources/picture_layer_tiling.cc

Issue 411183002: cc: Optimize picture layer tiling raster tile iterator. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/resources/picture_layer_tiling.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/resources/picture_layer_tiling.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698