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

Side by Side Diff: cc/resources/picture_layer_tiling.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 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
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 #include <set> 10 #include <set>
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 98
99 tiling_data_.SetTilingSize(content_bounds); 99 tiling_data_.SetTilingSize(content_bounds);
100 tiling_data_.SetMaxTextureSize(tile_size); 100 tiling_data_.SetMaxTextureSize(tile_size);
101 } 101 }
102 102
103 PictureLayerTiling::~PictureLayerTiling() { 103 PictureLayerTiling::~PictureLayerTiling() {
104 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) 104 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it)
105 it->second->set_shared(false); 105 it->second->set_shared(false);
106 } 106 }
107 107
108 void PictureLayerTiling::SetClient(PictureLayerTilingClient* client) {
109 client_ = client;
110 }
111
112 Tile* PictureLayerTiling::CreateTile(int i, 108 Tile* PictureLayerTiling::CreateTile(int i,
113 int j, 109 int j,
114 const PictureLayerTiling* twin_tiling) { 110 const PictureLayerTiling* twin_tiling) {
115 TileMapKey key(i, j); 111 TileMapKey key(i, j);
116 DCHECK(tiles_.find(key) == tiles_.end()); 112 DCHECK(tiles_.find(key) == tiles_.end());
117 113
118 gfx::Rect paint_rect = tiling_data_.TileBoundsWithBorder(i, j); 114 gfx::Rect paint_rect = tiling_data_.TileBoundsWithBorder(i, j);
119 gfx::Rect tile_rect = paint_rect; 115 gfx::Rect tile_rect = paint_rect;
120 tile_rect.set_size(tiling_data_.max_texture_size()); 116 tile_rect.set_size(tiling_data_.max_texture_size());
121 117
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 TileMapKey key = iter.index(); 156 TileMapKey key = iter.index();
161 TileMap::iterator find = tiles_.find(key); 157 TileMap::iterator find = tiles_.find(key);
162 if (find != tiles_.end()) 158 if (find != tiles_.end())
163 continue; 159 continue;
164 CreateTile(key.first, key.second, twin_tiling); 160 CreateTile(key.first, key.second, twin_tiling);
165 } 161 }
166 162
167 VerifyLiveTilesRect(); 163 VerifyLiveTilesRect();
168 } 164 }
169 165
166 void PictureLayerTiling::CreateSharedTilesFromPending(
167 const PictureLayerTiling& other) {
168 DCHECK_EQ(&other, client_->GetPendingOrActiveTwinTiling(this));
169 SetLiveTilesRect(other.live_tiles_rect());
170 DCHECK_EQ(other.tiles_.size(), tiles_.size());
171 }
172
170 void PictureLayerTiling::UpdateTilesToCurrentRasterSource( 173 void PictureLayerTiling::UpdateTilesToCurrentRasterSource(
171 RasterSource* raster_source, 174 RasterSource* raster_source,
172 const Region& layer_invalidation, 175 const Region& layer_invalidation,
173 const gfx::Size& new_layer_bounds) { 176 const gfx::Size& new_layer_bounds) {
174 DCHECK(!new_layer_bounds.IsEmpty()); 177 DCHECK(!new_layer_bounds.IsEmpty());
175 178
176 gfx::Size content_bounds = 179 gfx::Size content_bounds =
177 gfx::ToCeiledSize(gfx::ScaleSize(new_layer_bounds, contents_scale_)); 180 gfx::ToCeiledSize(gfx::ScaleSize(new_layer_bounds, contents_scale_));
178 gfx::Size tile_size = client_->CalculateTileSize(content_bounds); 181 gfx::Size tile_size = client_->CalculateTileSize(content_bounds);
179 182
(...skipping 23 matching lines...) Expand all
203 206
204 int after_right = -1; 207 int after_right = -1;
205 int after_bottom = -1; 208 int after_bottom = -1;
206 if (!live_tiles_rect_.IsEmpty()) { 209 if (!live_tiles_rect_.IsEmpty()) {
207 after_right = 210 after_right =
208 tiling_data_.TileXIndexFromSrcCoord(live_tiles_rect_.right() - 1); 211 tiling_data_.TileXIndexFromSrcCoord(live_tiles_rect_.right() - 1);
209 after_bottom = 212 after_bottom =
210 tiling_data_.TileYIndexFromSrcCoord(live_tiles_rect_.bottom() - 1); 213 tiling_data_.TileYIndexFromSrcCoord(live_tiles_rect_.bottom() - 1);
211 } 214 }
212 215
213 // There is no recycled twin since this is run on the pending tiling. 216 // There is no recycled twin since this is run on the pending tiling
217 // during commit, and on the active tree during activate.
214 PictureLayerTiling* recycled_twin = NULL; 218 PictureLayerTiling* recycled_twin = NULL;
215 DCHECK_EQ(recycled_twin, client_->GetRecycledTwinTiling(this)); 219 DCHECK_EQ(recycled_twin, client_->GetRecycledTwinTiling(this));
216 DCHECK_EQ(PENDING_TREE, client_->GetTree());
217 220
218 // Drop tiles outside the new layer bounds if the layer shrank. 221 // Drop tiles outside the new layer bounds if the layer shrank.
219 for (int i = after_right + 1; i <= before_right; ++i) { 222 for (int i = after_right + 1; i <= before_right; ++i) {
220 for (int j = before_top; j <= before_bottom; ++j) 223 for (int j = before_top; j <= before_bottom; ++j)
221 RemoveTileAt(i, j, recycled_twin); 224 RemoveTileAt(i, j, recycled_twin);
222 } 225 }
223 for (int i = before_left; i <= after_right; ++i) { 226 for (int i = before_left; i <= after_right; ++i) {
224 for (int j = after_bottom + 1; j <= before_bottom; ++j) 227 for (int j = after_bottom + 1; j <= before_bottom; ++j)
225 RemoveTileAt(i, j, recycled_twin); 228 RemoveTileAt(i, j, recycled_twin);
226 } 229 }
(...skipping 16 matching lines...) Expand all
243 246
244 if (tile_size != tiling_data_.max_texture_size()) { 247 if (tile_size != tiling_data_.max_texture_size()) {
245 tiling_data_.SetMaxTextureSize(tile_size); 248 tiling_data_.SetMaxTextureSize(tile_size);
246 // When the tile size changes, the TilingData positions no longer work 249 // When the tile size changes, the TilingData positions no longer work
247 // as valid keys to the TileMap, so just drop all tiles. 250 // as valid keys to the TileMap, so just drop all tiles.
248 Reset(); 251 Reset();
249 } else { 252 } else {
250 Invalidate(layer_invalidation); 253 Invalidate(layer_invalidation);
251 } 254 }
252 255
253 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) 256 // Shared (ie. non-invalidated) tiles on the pending tree are updated to use
254 it->second->set_raster_source(raster_source); 257 // the new raster source. When this raster source is activated, the raster
258 // source will remain valid for shared tiles in the active tree.
259 // TODO(danakj): Clean this up, pass it in or make it a separate function call
260 // or something.
261 // TODO(danakj): This breaks if we commit to active tree! We really need to do
262 // this for the sync tree.
263 bool set_tiles_to_raster_source = client_->GetTree() == PENDING_TREE;
264 if (set_tiles_to_raster_source) {
265 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it)
266 it->second->set_raster_source(raster_source);
267 }
255 VerifyLiveTilesRect(); 268 VerifyLiveTilesRect();
256 } 269 }
257 270
258 void PictureLayerTiling::RemoveTilesInRegion(const Region& layer_region) {
259 bool recreate_invalidated_tiles = false;
260 DoInvalidate(layer_region, recreate_invalidated_tiles);
261 }
262
263 void PictureLayerTiling::Invalidate(const Region& layer_region) { 271 void PictureLayerTiling::Invalidate(const Region& layer_region) {
264 bool recreate_invalidated_tiles = true;
265 DoInvalidate(layer_region, recreate_invalidated_tiles);
266 }
267
268 void PictureLayerTiling::DoInvalidate(const Region& layer_region,
269 bool recreate_invalidated_tiles) {
270 std::vector<TileMapKey> new_tile_keys; 272 std::vector<TileMapKey> new_tile_keys;
271 gfx::Rect expanded_live_tiles_rect = 273 gfx::Rect expanded_live_tiles_rect =
272 tiling_data_.ExpandRectIgnoringBordersToTileBounds(live_tiles_rect_); 274 tiling_data_.ExpandRectIgnoringBordersToTileBounds(live_tiles_rect_);
273 for (Region::Iterator iter(layer_region); iter.has_rect(); iter.next()) { 275 for (Region::Iterator iter(layer_region); iter.has_rect(); iter.next()) {
274 gfx::Rect layer_rect = iter.rect(); 276 gfx::Rect layer_rect = iter.rect();
275 gfx::Rect content_rect = 277 gfx::Rect content_rect =
276 gfx::ScaleToEnclosingRect(layer_rect, contents_scale_); 278 gfx::ScaleToEnclosingRect(layer_rect, contents_scale_);
277 // Consider tiles inside the live tiles rect even if only their border 279 // Consider tiles inside the live tiles rect even if only their border
278 // pixels intersect the invalidation. But don't consider tiles outside 280 // pixels intersect the invalidation. But don't consider tiles outside
279 // the live tiles rect with the same conditions, as they won't exist. 281 // the live tiles rect with the same conditions, as they won't exist.
280 int border_pixels = tiling_data_.border_texels(); 282 int border_pixels = tiling_data_.border_texels();
281 content_rect.Inset(-border_pixels, -border_pixels); 283 content_rect.Inset(-border_pixels, -border_pixels);
282 // Avoid needless work by not bothering to invalidate where there aren't 284 // Avoid needless work by not bothering to invalidate where there aren't
283 // tiles. 285 // tiles.
284 content_rect.Intersect(expanded_live_tiles_rect); 286 content_rect.Intersect(expanded_live_tiles_rect);
285 if (content_rect.IsEmpty()) 287 if (content_rect.IsEmpty())
286 continue; 288 continue;
287 // Since the content_rect includes border pixels already, don't include 289 // Since the content_rect includes border pixels already, don't include
288 // borders when iterating to avoid double counting them. 290 // borders when iterating to avoid double counting them.
289 bool include_borders = false; 291 bool include_borders = false;
290 for (TilingData::Iterator iter( 292 for (TilingData::Iterator iter(
291 &tiling_data_, content_rect, include_borders); 293 &tiling_data_, content_rect, include_borders);
292 iter; 294 iter;
293 ++iter) { 295 ++iter) {
294 // There is no recycled twin since this is run on the pending tiling. 296 // There is no recycled twin for the peding tree during commit, or for the
297 // active tree during activation.
295 PictureLayerTiling* recycled_twin = NULL; 298 PictureLayerTiling* recycled_twin = NULL;
296 DCHECK_EQ(recycled_twin, client_->GetRecycledTwinTiling(this)); 299 DCHECK_EQ(recycled_twin, client_->GetRecycledTwinTiling(this));
297 DCHECK_EQ(PENDING_TREE, client_->GetTree());
298 if (RemoveTileAt(iter.index_x(), iter.index_y(), recycled_twin)) 300 if (RemoveTileAt(iter.index_x(), iter.index_y(), recycled_twin))
299 new_tile_keys.push_back(iter.index()); 301 new_tile_keys.push_back(iter.index());
300 } 302 }
301 } 303 }
302 304
303 if (recreate_invalidated_tiles && !new_tile_keys.empty()) { 305 if (!new_tile_keys.empty()) {
306 // During commit to the pending tree, invalidations can never be shared with
307 // the active tree since the active tree has different content there.
308 // However, during activation, invalidations on the active tree can be
309 // shared with the pending tree always.
310 const PictureLayerTiling* twin_tiling = nullptr;
311 if (client_->GetTree() == ACTIVE_TREE)
312 twin_tiling = client_->GetPendingOrActiveTwinTiling(this);
304 for (size_t i = 0; i < new_tile_keys.size(); ++i) { 313 for (size_t i = 0; i < new_tile_keys.size(); ++i) {
305 // Don't try to share a tile with the twin layer, it's been invalidated so
306 // we have to make our own tile here.
307 const PictureLayerTiling* twin_tiling = NULL;
308 CreateTile(new_tile_keys[i].first, new_tile_keys[i].second, twin_tiling); 314 CreateTile(new_tile_keys[i].first, new_tile_keys[i].second, twin_tiling);
309 } 315 }
310 } 316 }
311 } 317 }
312 318
313 PictureLayerTiling::CoverageIterator::CoverageIterator() 319 PictureLayerTiling::CoverageIterator::CoverageIterator()
314 : tiling_(NULL), 320 : tiling_(NULL),
315 current_tile_(NULL), 321 current_tile_(NULL),
316 tile_i_(0), 322 tile_i_(0),
317 tile_j_(0), 323 tile_j_(0),
(...skipping 892 matching lines...) Expand 10 before | Expand all | Expand 10 after
1210 } 1216 }
1211 current_tile_ = tiling_->TileAt(next_index.first, next_index.second); 1217 current_tile_ = tiling_->TileAt(next_index.first, next_index.second);
1212 } 1218 }
1213 1219
1214 if (current_tile_) 1220 if (current_tile_)
1215 tiling_->UpdateTileAndTwinPriority(current_tile_); 1221 tiling_->UpdateTileAndTwinPriority(current_tile_);
1216 return *this; 1222 return *this;
1217 } 1223 }
1218 1224
1219 } // namespace cc 1225 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698