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

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: Created 6 years, 4 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 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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