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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/resources/picture_layer_tiling.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/resources/picture_layer_tiling.cc
diff --git a/cc/resources/picture_layer_tiling.cc b/cc/resources/picture_layer_tiling.cc
index eac7ec4e889ec1d8cfd55df96a6f156a95b4db7b..64661c1a6981eb87541742fd56e69ae43b691ffc 100644
--- a/cc/resources/picture_layer_tiling.cc
+++ b/cc/resources/picture_layer_tiling.cc
@@ -77,6 +77,10 @@ PictureLayerTiling::PictureLayerTiling(float contents_scale,
client_(client),
tiling_data_(gfx::Size(), gfx::Size(), true),
last_impl_frame_time_in_seconds_(0.0),
+ has_visible_rect_tiles_(false),
+ has_skewport_rect_tiles_(false),
+ has_soon_border_rect_tiles_(false),
+ has_eventually_rect_tiles_(false),
eviction_tiles_cache_valid_(false),
eviction_cache_tree_priority_(SAME_PRIORITY_FOR_BOTH_TREES) {
gfx::Size content_bounds =
@@ -489,6 +493,7 @@ void PictureLayerTiling::UpdateTilePriorities(
// Assign now priority to all visible tiles.
bool include_borders = true;
+ has_visible_rect_tiles_ = false;
for (TilingData::Iterator iter(
&tiling_data_, visible_rect_in_content_space, include_borders);
iter;
@@ -496,6 +501,7 @@ void PictureLayerTiling::UpdateTilePriorities(
TileMap::iterator find = tiles_.find(iter.index());
if (find == tiles_.end())
continue;
+ has_visible_rect_tiles_ = true;
Tile* tile = find->second.get();
tile->SetPriority(tree, now_priority);
@@ -515,6 +521,7 @@ void PictureLayerTiling::UpdateTilePriorities(
}
// Assign soon priority to skewport tiles.
+ has_skewport_rect_tiles_ = false;
for (TilingData::DifferenceIterator iter(
&tiling_data_, skewport, visible_rect_in_content_space);
iter;
@@ -522,6 +529,7 @@ void PictureLayerTiling::UpdateTilePriorities(
TileMap::iterator find = tiles_.find(iter.index());
if (find == tiles_.end())
continue;
+ has_skewport_rect_tiles_ = true;
Tile* tile = find->second.get();
gfx::Rect tile_bounds =
@@ -536,6 +544,7 @@ void PictureLayerTiling::UpdateTilePriorities(
}
// Assign eventually priority to interest rect tiles.
+ has_eventually_rect_tiles_ = false;
for (TilingData::DifferenceIterator iter(
&tiling_data_, eventually_rect, skewport);
iter;
@@ -543,6 +552,7 @@ void PictureLayerTiling::UpdateTilePriorities(
TileMap::iterator find = tiles_.find(iter.index());
if (find == tiles_.end())
continue;
+ has_eventually_rect_tiles_ = true;
Tile* tile = find->second.get();
gfx::Rect tile_bounds =
@@ -560,6 +570,7 @@ void PictureLayerTiling::UpdateTilePriorities(
gfx::Rect soon_border_rect = visible_rect_in_content_space;
float border = kSoonBorderDistanceInScreenPixels / content_to_screen_scale;
soon_border_rect.Inset(-border, -border, -border, -border);
+ has_soon_border_rect_tiles_ = false;
for (TilingData::DifferenceIterator iter(
&tiling_data_, soon_border_rect, skewport);
iter;
@@ -567,6 +578,7 @@ void PictureLayerTiling::UpdateTilePriorities(
TileMap::iterator find = tiles_.find(iter.index());
if (find == tiles_.end())
continue;
+ has_soon_border_rect_tiles_ = true;
Tile* tile = find->second.get();
TilePriority priority(resolution_,
@@ -839,21 +851,15 @@ PictureLayerTiling::TilingRasterTileIterator::TilingRasterTileIterator()
PictureLayerTiling::TilingRasterTileIterator::TilingRasterTileIterator(
PictureLayerTiling* tiling,
WhichTree tree)
- : tiling_(tiling),
- phase_(VISIBLE_RECT),
- visible_rect_in_content_space_(tiling_->current_visible_rect_),
- skewport_in_content_space_(tiling_->current_skewport_rect_),
- eventually_rect_in_content_space_(tiling_->current_eventually_rect_),
- soon_border_rect_in_content_space_(tiling_->current_soon_border_rect_),
- tree_(tree),
- current_tile_(NULL),
- visible_iterator_(&tiling->tiling_data_,
- visible_rect_in_content_space_,
- true /* include_borders */),
- spiral_iterator_(&tiling->tiling_data_,
- skewport_in_content_space_,
- visible_rect_in_content_space_,
- visible_rect_in_content_space_) {
+ : tiling_(tiling), phase_(VISIBLE_RECT), tree_(tree), current_tile_(NULL) {
+ if (!tiling_->has_visible_rect_tiles_) {
+ AdvancePhase();
+ return;
+ }
+
+ visible_iterator_ = TilingData::Iterator(&tiling_->tiling_data_,
+ tiling_->current_visible_rect_,
+ true /* include_borders */);
if (!visible_iterator_) {
AdvancePhase();
return;
@@ -872,19 +878,42 @@ void PictureLayerTiling::TilingRasterTileIterator::AdvancePhase() {
do {
phase_ = static_cast<Phase>(phase_ + 1);
+ switch (phase_) {
+ case VISIBLE_RECT:
+ NOTREACHED();
+ return;
+ case SKEWPORT_RECT:
+ if (!tiling_->has_skewport_rect_tiles_)
+ continue;
+
+ spiral_iterator_ = TilingData::SpiralDifferenceIterator(
+ &tiling_->tiling_data_,
+ tiling_->current_skewport_rect_,
+ tiling_->current_visible_rect_,
+ tiling_->current_visible_rect_);
+ break;
+ case SOON_BORDER_RECT:
+ if (!tiling_->has_soon_border_rect_tiles_)
+ continue;
+
+ spiral_iterator_ = TilingData::SpiralDifferenceIterator(
+ &tiling_->tiling_data_,
+ tiling_->current_soon_border_rect_,
+ tiling_->current_skewport_rect_,
+ tiling_->current_visible_rect_);
+ break;
+ case EVENTUALLY_RECT:
+ if (!tiling_->has_eventually_rect_tiles_) {
+ current_tile_ = NULL;
+ return;
+ }
- if (phase_ == SOON_BORDER_RECT) {
- spiral_iterator_ = TilingData::SpiralDifferenceIterator(
- &tiling_->tiling_data_,
- soon_border_rect_in_content_space_,
- skewport_in_content_space_,
- visible_rect_in_content_space_);
- } else if (phase_ == EVENTUALLY_RECT) {
- spiral_iterator_ = TilingData::SpiralDifferenceIterator(
- &tiling_->tiling_data_,
- eventually_rect_in_content_space_,
- skewport_in_content_space_,
- soon_border_rect_in_content_space_);
+ spiral_iterator_ = TilingData::SpiralDifferenceIterator(
+ &tiling_->tiling_data_,
+ tiling_->current_eventually_rect_,
+ tiling_->current_skewport_rect_,
+ tiling_->current_soon_border_rect_);
+ break;
}
while (spiral_iterator_) {
« 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