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

Side by Side Diff: cc/layers/picture_layer_impl.cc

Issue 287643004: Re-land: cc: Examine layers to determine if we're ready to activate. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase and address review feedback Created 6 years, 7 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 | Annotate | Revision Log
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/layers/picture_layer_impl.h" 5 #include "cc/layers/picture_layer_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 9
10 #include "base/time/time.h" 10 #include "base/time/time.h"
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 color, 226 color,
227 width); 227 width);
228 quad_sink->Append(debug_border_quad.PassAs<DrawQuad>()); 228 quad_sink->Append(debug_border_quad.PassAs<DrawQuad>());
229 } 229 }
230 } 230 }
231 231
232 // Keep track of the tilings that were used so that tilings that are 232 // Keep track of the tilings that were used so that tilings that are
233 // unused can be considered for removal. 233 // unused can be considered for removal.
234 std::vector<PictureLayerTiling*> seen_tilings; 234 std::vector<PictureLayerTiling*> seen_tilings;
235 235
236 bool had_checkerboard_quads = false; 236 size_t missing_tile_count = 0u;
237 size_t on_demand_missing_tile_count = 0u;
237 for (PictureLayerTilingSet::CoverageIterator iter( 238 for (PictureLayerTilingSet::CoverageIterator iter(
238 tilings_.get(), contents_scale_x(), rect, ideal_contents_scale_); 239 tilings_.get(), contents_scale_x(), rect, ideal_contents_scale_);
239 iter; 240 iter;
240 ++iter) { 241 ++iter) {
241 gfx::Rect geometry_rect = iter.geometry_rect(); 242 gfx::Rect geometry_rect = iter.geometry_rect();
242 gfx::Rect visible_geometry_rect = 243 gfx::Rect visible_geometry_rect =
243 quad_sink->UnoccludedContentRect(geometry_rect, draw_transform()); 244 quad_sink->UnoccludedContentRect(geometry_rect, draw_transform());
244 if (visible_geometry_rect.IsEmpty()) 245 if (visible_geometry_rect.IsEmpty())
245 continue; 246 continue;
246 247
247 append_quads_data->visible_content_area += 248 append_quads_data->visible_content_area +=
248 visible_geometry_rect.width() * visible_geometry_rect.height(); 249 visible_geometry_rect.width() * visible_geometry_rect.height();
249 250
250 if (!*iter || !iter->IsReadyToDraw()) { 251 scoped_ptr<DrawQuad> draw_quad;
251 had_checkerboard_quads = true; 252 if (*iter && iter->IsReadyToDraw()) {
253 const ManagedTileState::TileVersion& tile_version =
254 iter->GetTileVersionForDrawing();
255 switch (tile_version.mode()) {
256 case ManagedTileState::TileVersion::RESOURCE_MODE: {
257 gfx::RectF texture_rect = iter.texture_rect();
258 gfx::Rect opaque_rect = iter->opaque_rect();
259 opaque_rect.Intersect(geometry_rect);
260
261 if (iter->contents_scale() != ideal_contents_scale_)
262 append_quads_data->had_incomplete_tile = true;
263
264 scoped_ptr<TileDrawQuad> quad = TileDrawQuad::Create();
265 quad->SetNew(shared_quad_state,
266 geometry_rect,
267 opaque_rect,
268 visible_geometry_rect,
269 tile_version.get_resource_id(),
270 texture_rect,
271 iter.texture_size(),
272 tile_version.contents_swizzled());
273 draw_quad = quad.PassAs<DrawQuad>();
274 break;
275 }
276 case ManagedTileState::TileVersion::PICTURE_PILE_MODE: {
277 if (!layer_tree_impl()
278 ->GetRendererCapabilities()
279 .allow_rasterize_on_demand) {
280 ++on_demand_missing_tile_count;
281 break;
282 }
283
284 gfx::RectF texture_rect = iter.texture_rect();
285 gfx::Rect opaque_rect = iter->opaque_rect();
286 opaque_rect.Intersect(geometry_rect);
287
288 ResourceProvider* resource_provider =
289 layer_tree_impl()->resource_provider();
290 ResourceFormat format =
291 resource_provider->memory_efficient_texture_format();
292 scoped_ptr<PictureDrawQuad> quad = PictureDrawQuad::Create();
293 quad->SetNew(shared_quad_state,
294 geometry_rect,
295 opaque_rect,
296 visible_geometry_rect,
297 texture_rect,
298 iter.texture_size(),
299 format,
300 iter->content_rect(),
301 iter->contents_scale(),
302 pile_);
303 draw_quad = quad.PassAs<DrawQuad>();
304 break;
305 }
306 case ManagedTileState::TileVersion::SOLID_COLOR_MODE: {
307 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
308 quad->SetNew(shared_quad_state,
309 geometry_rect,
310 visible_geometry_rect,
311 tile_version.get_solid_color(),
312 false);
313 draw_quad = quad.PassAs<DrawQuad>();
314 break;
315 }
316 }
317 }
318
319 if (!draw_quad) {
252 if (draw_checkerboard_for_missing_tiles()) { 320 if (draw_checkerboard_for_missing_tiles()) {
253 scoped_ptr<CheckerboardDrawQuad> quad = CheckerboardDrawQuad::Create(); 321 scoped_ptr<CheckerboardDrawQuad> quad = CheckerboardDrawQuad::Create();
254 SkColor color = DebugColors::DefaultCheckerboardColor(); 322 SkColor color = DebugColors::DefaultCheckerboardColor();
255 quad->SetNew( 323 quad->SetNew(
256 shared_quad_state, geometry_rect, visible_geometry_rect, color); 324 shared_quad_state, geometry_rect, visible_geometry_rect, color);
257 quad_sink->Append(quad.PassAs<DrawQuad>()); 325 quad_sink->Append(quad.PassAs<DrawQuad>());
258 } else { 326 } else {
259 SkColor color = SafeOpaqueBackgroundColor(); 327 SkColor color = SafeOpaqueBackgroundColor();
260 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); 328 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
261 quad->SetNew(shared_quad_state, 329 quad->SetNew(shared_quad_state,
262 geometry_rect, 330 geometry_rect,
263 visible_geometry_rect, 331 visible_geometry_rect,
264 color, 332 color,
265 false); 333 false);
266 quad_sink->Append(quad.PassAs<DrawQuad>()); 334 quad_sink->Append(quad.PassAs<DrawQuad>());
267 } 335 }
268 336
269 append_quads_data->num_missing_tiles++; 337 append_quads_data->num_missing_tiles++;
270 append_quads_data->had_incomplete_tile = true; 338 append_quads_data->had_incomplete_tile = true;
271 append_quads_data->approximated_visible_content_area += 339 append_quads_data->approximated_visible_content_area +=
272 visible_geometry_rect.width() * visible_geometry_rect.height(); 340 visible_geometry_rect.width() * visible_geometry_rect.height();
341 ++missing_tile_count;
273 continue; 342 continue;
274 } 343 }
275 344
276 const ManagedTileState::TileVersion& tile_version =
277 iter->GetTileVersionForDrawing();
278 scoped_ptr<DrawQuad> draw_quad;
279 switch (tile_version.mode()) {
280 case ManagedTileState::TileVersion::RESOURCE_MODE: {
281 gfx::RectF texture_rect = iter.texture_rect();
282 gfx::Rect opaque_rect = iter->opaque_rect();
283 opaque_rect.Intersect(geometry_rect);
284
285 if (iter->contents_scale() != ideal_contents_scale_)
286 append_quads_data->had_incomplete_tile = true;
287
288 scoped_ptr<TileDrawQuad> quad = TileDrawQuad::Create();
289 quad->SetNew(shared_quad_state,
290 geometry_rect,
291 opaque_rect,
292 visible_geometry_rect,
293 tile_version.get_resource_id(),
294 texture_rect,
295 iter.texture_size(),
296 tile_version.contents_swizzled());
297 draw_quad = quad.PassAs<DrawQuad>();
298 break;
299 }
300 case ManagedTileState::TileVersion::PICTURE_PILE_MODE: {
301 gfx::RectF texture_rect = iter.texture_rect();
302 gfx::Rect opaque_rect = iter->opaque_rect();
303 opaque_rect.Intersect(geometry_rect);
304
305 ResourceProvider* resource_provider =
306 layer_tree_impl()->resource_provider();
307 ResourceFormat format =
308 resource_provider->memory_efficient_texture_format();
309 scoped_ptr<PictureDrawQuad> quad = PictureDrawQuad::Create();
310 quad->SetNew(shared_quad_state,
311 geometry_rect,
312 opaque_rect,
313 visible_geometry_rect,
314 texture_rect,
315 iter.texture_size(),
316 format,
317 iter->content_rect(),
318 iter->contents_scale(),
319 pile_);
320 draw_quad = quad.PassAs<DrawQuad>();
321 break;
322 }
323 case ManagedTileState::TileVersion::SOLID_COLOR_MODE: {
324 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
325 quad->SetNew(shared_quad_state,
326 geometry_rect,
327 visible_geometry_rect,
328 tile_version.get_solid_color(),
329 false);
330 draw_quad = quad.PassAs<DrawQuad>();
331 break;
332 }
333 }
334
335 DCHECK(draw_quad);
336 quad_sink->Append(draw_quad.Pass()); 345 quad_sink->Append(draw_quad.Pass());
337 346
338 if (iter->priority(ACTIVE_TREE).resolution != HIGH_RESOLUTION) { 347 if (iter->priority(ACTIVE_TREE).resolution != HIGH_RESOLUTION) {
339 append_quads_data->approximated_visible_content_area += 348 append_quads_data->approximated_visible_content_area +=
340 visible_geometry_rect.width() * visible_geometry_rect.height(); 349 visible_geometry_rect.width() * visible_geometry_rect.height();
341 } 350 }
342 351
343 if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling()) 352 if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling())
344 seen_tilings.push_back(iter.CurrentTiling()); 353 seen_tilings.push_back(iter.CurrentTiling());
345 } 354 }
346 355
347 if (had_checkerboard_quads) { 356 if (missing_tile_count) {
348 TRACE_EVENT_INSTANT0("cc", 357 TRACE_EVENT_INSTANT2("cc",
349 "PictureLayerImpl::AppendQuads checkerboard", 358 "PictureLayerImpl::AppendQuads missing",
vmpstr 2014/05/21 22:28:30 nit: I'd still prefer the word "checkerboard" sinc
reveman 2014/05/22 20:47:49 Done.
350 TRACE_EVENT_SCOPE_THREAD); 359 TRACE_EVENT_SCOPE_THREAD,
360 "count",
361 missing_tile_count,
362 "on_demand_count",
363 on_demand_missing_tile_count);
351 } 364 }
352 365
353 // Aggressively remove any tilings that are not seen to save memory. Note 366 // Aggressively remove any tilings that are not seen to save memory. Note
354 // that this is at the expense of doing cause more frequent re-painting. A 367 // that this is at the expense of doing cause more frequent re-painting. A
355 // better scheme would be to maintain a tighter visible_content_rect for the 368 // better scheme would be to maintain a tighter visible_content_rect for the
356 // finer tilings. 369 // finer tilings.
357 CleanUpTilingsOnActiveLayer(seen_tilings); 370 CleanUpTilingsOnActiveLayer(seen_tilings);
358 } 371 }
359 372
360 void PictureLayerImpl::DidUnregisterLayer() { 373 void PictureLayerImpl::DidUnregisterLayer() {
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
422 contents_scale_x(), 435 contents_scale_x(),
423 current_frame_time_in_seconds); 436 current_frame_time_in_seconds);
424 437
425 if (layer_tree_impl()->IsPendingTree()) 438 if (layer_tree_impl()->IsPendingTree())
426 MarkVisibleResourcesAsRequired(); 439 MarkVisibleResourcesAsRequired();
427 440
428 // Tile priorities were modified. 441 // Tile priorities were modified.
429 layer_tree_impl()->DidModifyTilePriorities(); 442 layer_tree_impl()->DidModifyTilePriorities();
430 } 443 }
431 444
432 void PictureLayerImpl::NotifyTileInitialized(const Tile* tile) { 445 void PictureLayerImpl::NotifyTileStateChanged(const Tile* tile) {
433 if (layer_tree_impl()->IsActiveTree()) { 446 if (layer_tree_impl()->IsActiveTree()) {
434 gfx::RectF layer_damage_rect = 447 gfx::RectF layer_damage_rect =
435 gfx::ScaleRect(tile->content_rect(), 1.f / tile->contents_scale()); 448 gfx::ScaleRect(tile->content_rect(), 1.f / tile->contents_scale());
436 AddDamageRect(layer_damage_rect); 449 AddDamageRect(layer_damage_rect);
437 } 450 }
438 } 451 }
439 452
440 void PictureLayerImpl::DidBecomeActive() { 453 void PictureLayerImpl::DidBecomeActive() {
441 LayerImpl::DidBecomeActive(); 454 LayerImpl::DidBecomeActive();
442 tilings_->DidBecomeActive(); 455 tilings_->DidBecomeActive();
(...skipping 906 matching lines...) Expand 10 before | Expand all | Expand 10 after
1349 } 1362 }
1350 1363
1351 WhichTree PictureLayerImpl::GetTree() const { 1364 WhichTree PictureLayerImpl::GetTree() const {
1352 return layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE; 1365 return layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE;
1353 } 1366 }
1354 1367
1355 bool PictureLayerImpl::IsOnActiveOrPendingTree() const { 1368 bool PictureLayerImpl::IsOnActiveOrPendingTree() const {
1356 return !layer_tree_impl()->IsRecycleTree(); 1369 return !layer_tree_impl()->IsRecycleTree();
1357 } 1370 }
1358 1371
1372 bool PictureLayerImpl::AllTilesRequiredForActivationAreReadyToDraw() const {
1373 if (!layer_tree_impl()->IsPendingTree())
1374 return true;
1375
1376 if (!tilings_)
1377 return true;
1378
1379 for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
1380 PictureLayerTiling* tiling = tilings_->tiling_at(i);
1381 if (tiling->resolution() != HIGH_RESOLUTION &&
1382 tiling->resolution() != LOW_RESOLUTION)
1383 continue;
1384
1385 gfx::Rect rect(visible_content_rect());
1386 for (PictureLayerTiling::CoverageIterator iter(
1387 tiling, contents_scale_x(), rect);
reveman 2014/05/21 22:11:40 Using CoverageIterator here but maybe it would be
enne (OOO) 2014/05/21 22:19:32 I'm not sure it's worth adding yet another iterato
1388 iter;
1389 ++iter) {
1390 const Tile* tile = *iter;
1391 // A null tile (i.e. missing recording) can just be skipped.
1392 if (!tile)
1393 continue;
1394
1395 if (tile->required_for_activation() && !tile->IsReadyToDraw())
1396 return false;
1397 }
1398 }
1399
1400 return true;
1401 }
1402
1359 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator() 1403 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator()
1360 : layer_(NULL) {} 1404 : layer_(NULL) {}
1361 1405
1362 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator( 1406 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator(
1363 PictureLayerImpl* layer, 1407 PictureLayerImpl* layer,
1364 bool prioritize_low_res) 1408 bool prioritize_low_res)
1365 : layer_(layer), current_stage_(0) { 1409 : layer_(layer), current_stage_(0) {
1366 DCHECK(layer_); 1410 DCHECK(layer_);
1367 if (!layer_->tilings_ || !layer_->tilings_->num_tilings()) { 1411 if (!layer_->tilings_ || !layer_->tilings_->num_tilings()) {
1368 current_stage_ = arraysize(stages_); 1412 current_stage_ = arraysize(stages_);
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
1572 return iterator_index_ < iterators_.size(); 1616 return iterator_index_ < iterators_.size();
1573 } 1617 }
1574 1618
1575 bool PictureLayerImpl::LayerEvictionTileIterator::IsCorrectType( 1619 bool PictureLayerImpl::LayerEvictionTileIterator::IsCorrectType(
1576 PictureLayerTiling::TilingEvictionTileIterator* it) const { 1620 PictureLayerTiling::TilingEvictionTileIterator* it) const {
1577 return it->get_type() == iteration_stage_ && 1621 return it->get_type() == iteration_stage_ &&
1578 (**it)->required_for_activation() == required_for_activation_; 1622 (**it)->required_for_activation() == required_for_activation_;
1579 } 1623 }
1580 1624
1581 } // namespace cc 1625 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698