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

Unified Diff: cc/resources/picture_layer_tiling_set.cc

Issue 640063010: cc: Don't swap PictureLayerTilingSet on activate. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: noswap: perftest Created 6 years, 1 month 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/resources/picture_layer_tiling_set.cc
diff --git a/cc/resources/picture_layer_tiling_set.cc b/cc/resources/picture_layer_tiling_set.cc
index 51896a5b5f7f29cfb287e970fb8b301aaa4b83a0..fbd1fcfc5b33126f0f9f279e6b418df586f21a4b 100644
--- a/cc/resources/picture_layer_tiling_set.cc
+++ b/cc/resources/picture_layer_tiling_set.cc
@@ -40,15 +40,109 @@ PictureLayerTilingSet::PictureLayerTilingSet(PictureLayerTilingClient* client)
PictureLayerTilingSet::~PictureLayerTilingSet() {
}
-void PictureLayerTilingSet::SetClient(PictureLayerTilingClient* client) {
- client_ = client;
- for (size_t i = 0; i < tilings_.size(); ++i)
- tilings_[i]->SetClient(client_);
+void PictureLayerTilingSet::UpdateTilingsToCurrentRasterSource(
+ RasterSource* raster_source,
+ const gfx::Size& layer_bounds,
+ bool solid_color,
+ const Region& layer_invalidation,
+ float minimum_contents_scale) {
+ if (layer_bounds.IsEmpty() || solid_color) {
vmpstr 2014/12/01 22:38:04 I'd like to at some point see this move to the cal
danakj 2014/12/05 22:30:44 Done. CanHaveTilings() should actually already cov
+ RemoveAllTilings();
+ return;
+ }
+
+ for (size_t i = 0; i < tilings_.size(); ++i) {
vmpstr 2014/12/01 22:38:03 nit: would erase(remove_if) with a lambda work her
danakj 2014/12/05 22:30:44 remove_if does not work with ScopedPtrVector becau
+ float scale = tilings_[i]->contents_scale();
+ if (scale < minimum_contents_scale) {
+ tilings_.swap(tilings_.begin() + i, tilings_.end() - 1);
+ tilings_.pop_back();
+ --i;
+ }
+ }
+
+ for (PictureLayerTiling* tiling : tilings_) {
+ tiling->UpdateTilesToCurrentRasterSource(raster_source, layer_invalidation,
vmpstr 2014/12/01 22:38:04 I think this function should have the word "invali
danakj 2014/12/08 16:49:25 To give my POV here.. to me "invalidate" is actual
+ layer_bounds);
+ tiling->CreateMissingTilesInLiveTilesRect();
+
+ DCHECK(tiling->tile_size() ==
+ client_->CalculateTileSize(tiling->tiling_size()))
+ << "tile_size: " << tiling->tile_size().ToString()
+ << " tiling_size: " << tiling->tiling_size().ToString()
+ << " CalculateTileSize: "
+ << client_->CalculateTileSize(tiling->tiling_size()).ToString();
+ }
}
-void PictureLayerTilingSet::RemoveTilesInRegion(const Region& region) {
- for (size_t i = 0; i < tilings_.size(); ++i)
- tilings_[i]->RemoveTilesInRegion(region);
+void PictureLayerTilingSet::UpdateTilingsFromPending(
+ RasterSource* raster_source,
+ const PictureLayerTilingSet& other,
+ const gfx::Size& layer_bounds,
+ bool solid_color,
+ const Region& layer_invalidation,
+ float minimum_contents_scale) {
+ DCHECK_EQ(ACTIVE_TREE, client_->GetTree());
+
+ if (layer_bounds.IsEmpty() || solid_color) {
+ RemoveAllTilings();
+ return;
+ }
+
+ for (size_t i = 0; i < tilings_.size(); ++i) {
vmpstr 2014/12/01 22:38:04 This can probably be a separate function
danakj 2014/12/05 22:30:44 Done.
+ float scale = tilings_[i]->contents_scale();
+ if (scale < minimum_contents_scale) {
+ tilings_.swap(tilings_.begin() + i, tilings_.end() - 1);
+ tilings_.pop_back();
+ --i;
+ }
+ }
+
+ for (PictureLayerTiling* tiling : tilings_) {
+ // TODO(danakj): In the activate case can we do something simpler? Just copy
enne (OOO) 2014/12/01 22:08:17 That sounds nice, although I think you'd still kee
vmpstr 2014/12/01 22:38:03 I agree... I think we should be able to "blit" pen
+ // things from the pending tree and share all the tiles?
+ tiling->UpdateTilesToCurrentRasterSource(raster_source, layer_invalidation,
+ layer_bounds);
+ tiling->CreateMissingTilesInLiveTilesRect();
+ tiling->set_resolution(NON_IDEAL_RESOLUTION);
+
+ DCHECK(tiling->tile_size() ==
+ client_->CalculateTileSize(tiling->tiling_size()))
+ << "tile_size: " << tiling->tile_size().ToString()
+ << " tiling_size: " << tiling->tiling_size().ToString()
+ << " CalculateTileSize: "
+ << client_->CalculateTileSize(tiling->tiling_size()).ToString();
+ }
+
+ // Copy missing tilings, tiles and tiling resolutions from the pending tiling
+ // set.
+ for (size_t i = 0; i < other.tilings_.size(); ++i) {
vmpstr 2014/12/01 22:38:04 nit: for (PLT* tiling : other.tilings)
danakj 2014/12/05 22:30:44 Done.
+ float contents_scale = other.tilings_[i]->contents_scale();
+ DCHECK_GE(contents_scale, minimum_contents_scale);
+
+ PictureLayerTiling* this_tiling = FindTilingWithScale(contents_scale);
+ if (!this_tiling) {
+ scoped_ptr<PictureLayerTiling> new_tiling =
+ PictureLayerTiling::Create(contents_scale, layer_bounds, client_);
+ tilings_.push_back(new_tiling.Pass());
+ this_tiling = tilings_.back();
+ }
+ this_tiling->CreateSharedTilesFromPending(*other.tilings_[i]);
vmpstr 2014/12/01 22:38:03 I personally like this style of functionality, mod
danakj 2014/12/05 22:30:44 Done. CloneTilesAndPropertiesFrom()
+ this_tiling->set_resolution(other.tilings_[i]->resolution());
+
+ DCHECK_EQ(other.tilings_[i]->live_tiles_rect().ToString(),
+ this_tiling->live_tiles_rect().ToString());
+ }
+
+ tilings_.sort(LargestToSmallestScaleFunctor());
+
+#if DCHECK_IS_ON
+ if (!tilings_.empty()) {
+ size_t num_high_res = 0;
+ for (const auto& t : tilings_)
vmpstr 2014/12/01 22:38:03 count_if?
danakj 2014/12/05 22:30:44 Oh, cool. Done.
+ num_high_res += t->resolution() == HIGH_RESOLUTION ? 1 : 0;
+ DCHECK_EQ(1u, num_high_res);
+ }
+#endif
}
void PictureLayerTilingSet::CleanUpTilings(
@@ -91,14 +185,6 @@ void PictureLayerTilingSet::CleanUpTilings(
}
for (auto* tiling : to_remove) {
- PictureLayerTiling* twin_tiling =
- twin_set ? twin_set->FindTilingWithScale(tiling->contents_scale())
- : nullptr;
- // Only remove tilings from the twin layer if they have
- // NON_IDEAL_RESOLUTION.
- if (twin_tiling && twin_tiling->resolution() == NON_IDEAL_RESOLUTION)
- twin_set->Remove(twin_tiling);
-
PictureLayerTiling* recycled_twin_tiling =
recycled_twin_set
? recycled_twin_set->FindTilingWithScale(tiling->contents_scale())
@@ -113,6 +199,16 @@ void PictureLayerTilingSet::CleanUpTilings(
}
}
+void PictureLayerTilingSet::RemoveNonIdealTilings() {
+ for (size_t i = 0; i < tilings_.size(); ++i) {
vmpstr 2014/12/01 22:38:04 nit: I'd prefer erase/remove_if, but feel free to
danakj 2014/12/05 22:30:44 Done.
+ PictureLayerTiling* tiling = tilings_[i];
+ if (tiling->resolution() == NON_IDEAL_RESOLUTION) {
+ tilings_.erase(tilings_.begin() + i);
+ --i;
+ }
+ }
+}
+
void PictureLayerTilingSet::MarkAllTilingsNonIdeal() {
for (auto* tiling : tilings_)
tiling->set_resolution(NON_IDEAL_RESOLUTION);

Powered by Google App Engine
This is Rietveld 408576698