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

Unified Diff: cc/tiles/picture_layer_tiling.cc

Issue 1318733006: cc: Do the math for a tile's content rect in layer space once. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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 side-by-side diff with in-line comments
Download patch
Index: cc/tiles/picture_layer_tiling.cc
diff --git a/cc/tiles/picture_layer_tiling.cc b/cc/tiles/picture_layer_tiling.cc
index f0bcae6f2a79ccaf014a4c5646a674588f67dcb7..5bef3aa22b5d1784f27801d5b05c410b2b4a831f 100644
--- a/cc/tiles/picture_layer_tiling.cc
+++ b/cc/tiles/picture_layer_tiling.cc
@@ -102,21 +102,18 @@ float PictureLayerTiling::CalculateSoonBorderDistance(
max_dimension * kSoonBorderDistanceViewportPercentage);
}
-Tile* PictureLayerTiling::CreateTile(int i, int j) {
+Tile* PictureLayerTiling::CreateTile(const Tile::CreateInfo& info) {
+ const int i = info.tiling_i_index;
vmpstr 2015/08/28 21:04:17 While here and doing this, could you just use info
danakj 2015/08/31 21:12:12 As per offline convo.. nope. :D This is kinda weir
+ const int j = info.tiling_j_index;
TileMapKey key(i, j);
DCHECK(tiles_.find(key) == tiles_.end());
- gfx::Rect paint_rect = tiling_data_.TileBoundsWithBorder(i, j);
- gfx::Rect tile_rect = paint_rect;
- tile_rect.set_size(tiling_data_.max_texture_size());
-
- if (!raster_source_->CoversRect(tile_rect, contents_scale_))
+ if (!raster_source_->CoversRect(info.enclosing_layer_rect))
return nullptr;
all_tiles_done_ = false;
- ScopedTilePtr tile = client_->CreateTile(contents_scale_, tile_rect);
+ ScopedTilePtr tile = client_->CreateTile(info);
Tile* raw_ptr = tile.get();
- tile->set_tiling_index(i, j);
tiles_.add(key, tile.Pass());
return raw_ptr;
}
@@ -137,8 +134,9 @@ void PictureLayerTiling::CreateMissingTilesInLiveTilesRect() {
if (find != tiles_.end())
continue;
- if (ShouldCreateTileAt(key.index_x, key.index_y)) {
- Tile* tile = CreateTile(key.index_x, key.index_y);
+ Tile::CreateInfo info = CreateInfoForTile(key.index_x, key.index_y);
vmpstr 2015/08/28 21:04:17 ... Then don't expand key here, just pass a key.
+ if (ShouldCreateTileAt(info)) {
+ Tile* tile = CreateTile(info);
// If this is the pending tree, then the active twin tiling may contain
// the previous content ID of these tiles. In that case, we need only
@@ -269,15 +267,17 @@ void PictureLayerTiling::SetRasterSourceAndResize(
if (after_right > before_right) {
DCHECK_EQ(after_right, before_right + 1);
for (int j = before_top; j <= after_bottom; ++j) {
- if (ShouldCreateTileAt(after_right, j))
- CreateTile(after_right, j);
+ Tile::CreateInfo info = CreateInfoForTile(after_right, j);
+ if (ShouldCreateTileAt(info))
+ CreateTile(info);
}
}
if (after_bottom > before_bottom) {
DCHECK_EQ(after_bottom, before_bottom + 1);
for (int i = before_left; i <= before_right; ++i) {
- if (ShouldCreateTileAt(i, after_bottom))
- CreateTile(i, after_bottom);
+ Tile::CreateInfo info = CreateInfoForTile(i, after_bottom);
+ if (ShouldCreateTileAt(info))
+ CreateTile(info);
}
}
}
@@ -337,13 +337,26 @@ void PictureLayerTiling::RemoveTilesInRegion(const Region& layer_invalidation,
// tiles from knowing the invalidation rect and content id. crbug.com/490847
ScopedTilePtr old_tile = TakeTileAt(key.index_x, key.index_y);
if (recreate_tiles && old_tile) {
- if (Tile* tile = CreateTile(key.index_x, key.index_y))
+ Tile::CreateInfo info = CreateInfoForTile(key.index_x, key.index_y);
+ if (Tile* tile = CreateTile(info))
tile->SetInvalidated(invalid_content_rect, old_tile->id());
}
}
}
-bool PictureLayerTiling::ShouldCreateTileAt(int i, int j) const {
+Tile::CreateInfo PictureLayerTiling::CreateInfoForTile(int i, int j) const {
+ gfx::Rect tile_rect = tiling_data_.TileBoundsWithBorder(i, j);
vmpstr 2015/08/28 21:04:17 ... And expand here? Wdyt?
+ tile_rect.set_size(tiling_data_.max_texture_size());
+ gfx::Rect enclosing_layer_rect =
+ gfx::ScaleToEnclosingRect(tile_rect, 1.f / contents_scale_);
+ return Tile::CreateInfo(i, j, enclosing_layer_rect, tile_rect,
+ contents_scale_);
+}
+
+bool PictureLayerTiling::ShouldCreateTileAt(
+ const Tile::CreateInfo& info) const {
+ const int i = info.tiling_i_index;
+ const int j = info.tiling_j_index;
// Active tree should always create a tile. The reason for this is that active
// tree represents content that we draw on screen, which means that whenever
// we check whether a tile should exist somewhere, the answer is yes. This
@@ -364,21 +377,16 @@ bool PictureLayerTiling::ShouldCreateTileAt(int i, int j) const {
if (!TilingMatchesTileIndices(active_twin))
return true;
- gfx::Rect paint_rect = tiling_data_.TileBoundsWithBorder(i, j);
- gfx::Rect tile_rect = paint_rect;
- tile_rect.set_size(tiling_data_.max_texture_size());
-
// If the active tree can't create a tile, because of its raster source, then
// the pending tree should create one.
- if (!active_twin->raster_source()->CoversRect(tile_rect, contents_scale()))
+ if (!active_twin->raster_source()->CoversRect(info.enclosing_layer_rect))
return true;
const Region* layer_invalidation = client_->GetPendingInvalidation();
- gfx::Rect layer_rect =
- gfx::ScaleToEnclosingRect(tile_rect, 1.f / contents_scale());
// If this tile is invalidated, then the pending tree should create one.
- if (layer_invalidation && layer_invalidation->Intersects(layer_rect))
+ if (layer_invalidation &&
+ layer_invalidation->Intersects(info.enclosing_layer_rect))
return true;
// If the active tree doesn't have a tile here, but it's in the pending tree's
@@ -386,7 +394,8 @@ bool PictureLayerTiling::ShouldCreateTileAt(int i, int j) const {
// if the pending visible rect is outside of the active tree's live tiles
// rect. In those situations, we need to block activation until we're ready to
// display content, which will have to come from the pending tree.
- if (!active_twin->TileAt(i, j) && current_visible_rect_.Intersects(tile_rect))
+ if (!active_twin->TileAt(i, j) &&
+ current_visible_rect_.Intersects(info.content_rect))
return true;
// In all other cases, the pending tree doesn't need to create a tile.
@@ -736,9 +745,9 @@ void PictureLayerTiling::SetLiveTilesRect(
for (TilingData::DifferenceIterator iter(&tiling_data_, new_live_tiles_rect,
live_tiles_rect_);
iter; ++iter) {
- TileMapKey key(iter.index());
- if (ShouldCreateTileAt(key.index_x, key.index_y))
- CreateTile(key.index_x, key.index_y);
+ Tile::CreateInfo info = CreateInfoForTile(iter.index_x(), iter.index_y());
+ if (ShouldCreateTileAt(info))
+ CreateTile(info);
}
live_tiles_rect_ = new_live_tiles_rect;
@@ -889,11 +898,11 @@ PrioritizedTile PictureLayerTiling::MakePrioritizedTile(
Tile* tile,
PriorityRectType priority_rect_type) const {
DCHECK(tile);
- DCHECK(
- raster_source()->CoversRect(tile->content_rect(), tile->contents_scale()))
+ DCHECK(raster_source()->CoversRect(tile->enclosing_layer_rect()))
<< "Recording rect: "
<< gfx::ScaleToEnclosingRect(tile->content_rect(),
- 1.f / tile->contents_scale()).ToString();
+ 1.f / tile->contents_scale())
+ .ToString();
return PrioritizedTile(tile, raster_source(),
ComputePriorityForTile(tile, priority_rect_type),
« no previous file with comments | « cc/tiles/picture_layer_tiling.h ('k') | cc/tiles/tile.h » ('j') | cc/tiles/tile.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698