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

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: init check_if_ready_to_activate_pending_ properly 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
« no previous file with comments | « cc/layers/picture_layer_impl.h ('k') | cc/layers/picture_layer_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 checkerboard",
350 TRACE_EVENT_SCOPE_THREAD); 359 TRACE_EVENT_SCOPE_THREAD,
360 "missing_tile_count",
361 missing_tile_count,
362 "on_demand_missing_tile_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 904 matching lines...) Expand 10 before | Expand all | Expand 10 after
1347 } 1360 }
1348 1361
1349 WhichTree PictureLayerImpl::GetTree() const { 1362 WhichTree PictureLayerImpl::GetTree() const {
1350 return layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE; 1363 return layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE;
1351 } 1364 }
1352 1365
1353 bool PictureLayerImpl::IsOnActiveOrPendingTree() const { 1366 bool PictureLayerImpl::IsOnActiveOrPendingTree() const {
1354 return !layer_tree_impl()->IsRecycleTree(); 1367 return !layer_tree_impl()->IsRecycleTree();
1355 } 1368 }
1356 1369
1370 bool PictureLayerImpl::AllTilesRequiredForActivationAreReadyToDraw() const {
1371 if (!layer_tree_impl()->IsPendingTree())
1372 return true;
1373
1374 if (!tilings_)
1375 return true;
1376
1377 for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
1378 PictureLayerTiling* tiling = tilings_->tiling_at(i);
1379 if (tiling->resolution() != HIGH_RESOLUTION &&
1380 tiling->resolution() != LOW_RESOLUTION)
1381 continue;
1382
1383 gfx::Rect rect(visible_content_rect());
1384 for (PictureLayerTiling::CoverageIterator iter(
1385 tiling, contents_scale_x(), rect);
1386 iter;
1387 ++iter) {
1388 const Tile* tile = *iter;
1389 // A null tile (i.e. missing recording) can just be skipped.
1390 if (!tile)
1391 continue;
1392
1393 if (tile->required_for_activation() && !tile->IsReadyToDraw())
1394 return false;
1395 }
1396 }
1397
1398 return true;
1399 }
1400
1357 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator() 1401 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator()
1358 : layer_(NULL) {} 1402 : layer_(NULL) {}
1359 1403
1360 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator( 1404 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator(
1361 PictureLayerImpl* layer, 1405 PictureLayerImpl* layer,
1362 bool prioritize_low_res) 1406 bool prioritize_low_res)
1363 : layer_(layer), current_stage_(0) { 1407 : layer_(layer), current_stage_(0) {
1364 DCHECK(layer_); 1408 DCHECK(layer_);
1365 if (!layer_->tilings_ || !layer_->tilings_->num_tilings()) { 1409 if (!layer_->tilings_ || !layer_->tilings_->num_tilings()) {
1366 current_stage_ = arraysize(stages_); 1410 current_stage_ = arraysize(stages_);
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
1570 return iterator_index_ < iterators_.size(); 1614 return iterator_index_ < iterators_.size();
1571 } 1615 }
1572 1616
1573 bool PictureLayerImpl::LayerEvictionTileIterator::IsCorrectType( 1617 bool PictureLayerImpl::LayerEvictionTileIterator::IsCorrectType(
1574 PictureLayerTiling::TilingEvictionTileIterator* it) const { 1618 PictureLayerTiling::TilingEvictionTileIterator* it) const {
1575 return it->get_type() == iteration_stage_ && 1619 return it->get_type() == iteration_stage_ &&
1576 (**it)->required_for_activation() == required_for_activation_; 1620 (**it)->required_for_activation() == required_for_activation_;
1577 } 1621 }
1578 1622
1579 } // namespace cc 1623 } // namespace cc
OLDNEW
« no previous file with comments | « cc/layers/picture_layer_impl.h ('k') | cc/layers/picture_layer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698