| OLD | NEW |
| 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 #include <set> | 9 #include <set> |
| 10 | 10 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 ideal_source_scale_(0.f), | 68 ideal_source_scale_(0.f), |
| 69 ideal_contents_scale_(0.f), | 69 ideal_contents_scale_(0.f), |
| 70 raster_page_scale_(0.f), | 70 raster_page_scale_(0.f), |
| 71 raster_device_scale_(0.f), | 71 raster_device_scale_(0.f), |
| 72 raster_source_scale_(0.f), | 72 raster_source_scale_(0.f), |
| 73 raster_contents_scale_(0.f), | 73 raster_contents_scale_(0.f), |
| 74 low_res_raster_contents_scale_(0.f), | 74 low_res_raster_contents_scale_(0.f), |
| 75 raster_source_scale_is_fixed_(false), | 75 raster_source_scale_is_fixed_(false), |
| 76 was_screen_space_transform_animating_(false), | 76 was_screen_space_transform_animating_(false), |
| 77 needs_post_commit_initialization_(true), | 77 needs_post_commit_initialization_(true), |
| 78 should_update_tile_priorities_(false) { | 78 should_update_tile_priorities_(false), |
| 79 only_used_low_res_last_append_quads_(false) { |
| 79 layer_tree_impl()->RegisterPictureLayerImpl(this); | 80 layer_tree_impl()->RegisterPictureLayerImpl(this); |
| 80 } | 81 } |
| 81 | 82 |
| 82 PictureLayerImpl::~PictureLayerImpl() { | 83 PictureLayerImpl::~PictureLayerImpl() { |
| 83 layer_tree_impl()->UnregisterPictureLayerImpl(this); | 84 layer_tree_impl()->UnregisterPictureLayerImpl(this); |
| 84 } | 85 } |
| 85 | 86 |
| 86 const char* PictureLayerImpl::LayerTypeAsString() const { | 87 const char* PictureLayerImpl::LayerTypeAsString() const { |
| 87 return "cc::PictureLayerImpl"; | 88 return "cc::PictureLayerImpl"; |
| 88 } | 89 } |
| 89 | 90 |
| 90 scoped_ptr<LayerImpl> PictureLayerImpl::CreateLayerImpl( | 91 scoped_ptr<LayerImpl> PictureLayerImpl::CreateLayerImpl( |
| 91 LayerTreeImpl* tree_impl) { | 92 LayerTreeImpl* tree_impl) { |
| 92 return PictureLayerImpl::Create(tree_impl, id()); | 93 return PictureLayerImpl::Create(tree_impl, id()); |
| 93 } | 94 } |
| 94 | 95 |
| 95 void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) { | 96 void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) { |
| 96 // It's possible this layer was never drawn or updated (e.g. because it was | 97 // It's possible this layer was never drawn or updated (e.g. because it was |
| 97 // a descendant of an opacity 0 layer). | 98 // a descendant of an opacity 0 layer). |
| 98 DoPostCommitInitializationIfNeeded(); | 99 DoPostCommitInitializationIfNeeded(); |
| 99 PictureLayerImpl* layer_impl = static_cast<PictureLayerImpl*>(base_layer); | 100 PictureLayerImpl* layer_impl = static_cast<PictureLayerImpl*>(base_layer); |
| 100 | 101 |
| 101 // We have already synced the important bits from the the active layer, and | |
| 102 // we will soon swap out its tilings and use them for recycling. However, | |
| 103 // there are now tiles in this layer's tilings that were unref'd and replaced | |
| 104 // with new tiles (due to invalidation). This resets all active priorities on | |
| 105 // the to-be-recycled tiling to ensure replaced tiles don't linger and take | |
| 106 // memory (due to a stale 'active' priority). | |
| 107 if (layer_impl->tilings_) | |
| 108 layer_impl->tilings_->DidBecomeRecycled(); | |
| 109 | |
| 110 LayerImpl::PushPropertiesTo(base_layer); | 102 LayerImpl::PushPropertiesTo(base_layer); |
| 111 | 103 |
| 112 // When the pending tree pushes to the active tree, the pending twin | 104 // When the pending tree pushes to the active tree, the pending twin |
| 113 // becomes recycled. | 105 // becomes recycled. |
| 114 layer_impl->twin_layer_ = NULL; | 106 layer_impl->twin_layer_ = NULL; |
| 115 twin_layer_ = NULL; | 107 twin_layer_ = NULL; |
| 116 | 108 |
| 117 layer_impl->pile_ = pile_; | 109 layer_impl->pile_ = pile_; |
| 118 | 110 |
| 119 DCHECK(!pile_->is_solid_color() || !tilings_->num_tilings()); | 111 DCHECK(!pile_->is_solid_color() || !tilings_->num_tilings()); |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 244 SkColor color; | 236 SkColor color; |
| 245 float width; | 237 float width; |
| 246 if (*iter && iter->IsReadyToDraw()) { | 238 if (*iter && iter->IsReadyToDraw()) { |
| 247 ManagedTileState::DrawInfo::Mode mode = iter->draw_info().mode(); | 239 ManagedTileState::DrawInfo::Mode mode = iter->draw_info().mode(); |
| 248 if (mode == ManagedTileState::DrawInfo::SOLID_COLOR_MODE) { | 240 if (mode == ManagedTileState::DrawInfo::SOLID_COLOR_MODE) { |
| 249 color = DebugColors::SolidColorTileBorderColor(); | 241 color = DebugColors::SolidColorTileBorderColor(); |
| 250 width = DebugColors::SolidColorTileBorderWidth(layer_tree_impl()); | 242 width = DebugColors::SolidColorTileBorderWidth(layer_tree_impl()); |
| 251 } else if (mode == ManagedTileState::DrawInfo::PICTURE_PILE_MODE) { | 243 } else if (mode == ManagedTileState::DrawInfo::PICTURE_PILE_MODE) { |
| 252 color = DebugColors::PictureTileBorderColor(); | 244 color = DebugColors::PictureTileBorderColor(); |
| 253 width = DebugColors::PictureTileBorderWidth(layer_tree_impl()); | 245 width = DebugColors::PictureTileBorderWidth(layer_tree_impl()); |
| 254 } else if (iter->priority(ACTIVE_TREE).resolution == HIGH_RESOLUTION) { | 246 } else if (iter.resolution() == HIGH_RESOLUTION) { |
| 255 color = DebugColors::HighResTileBorderColor(); | 247 color = DebugColors::HighResTileBorderColor(); |
| 256 width = DebugColors::HighResTileBorderWidth(layer_tree_impl()); | 248 width = DebugColors::HighResTileBorderWidth(layer_tree_impl()); |
| 257 } else if (iter->priority(ACTIVE_TREE).resolution == LOW_RESOLUTION) { | 249 } else if (iter.resolution() == LOW_RESOLUTION) { |
| 258 color = DebugColors::LowResTileBorderColor(); | 250 color = DebugColors::LowResTileBorderColor(); |
| 259 width = DebugColors::LowResTileBorderWidth(layer_tree_impl()); | 251 width = DebugColors::LowResTileBorderWidth(layer_tree_impl()); |
| 260 } else if (iter->contents_scale() > max_contents_scale) { | 252 } else if (iter->contents_scale() > max_contents_scale) { |
| 261 color = DebugColors::ExtraHighResTileBorderColor(); | 253 color = DebugColors::ExtraHighResTileBorderColor(); |
| 262 width = DebugColors::ExtraHighResTileBorderWidth(layer_tree_impl()); | 254 width = DebugColors::ExtraHighResTileBorderWidth(layer_tree_impl()); |
| 263 } else { | 255 } else { |
| 264 color = DebugColors::ExtraLowResTileBorderColor(); | 256 color = DebugColors::ExtraLowResTileBorderColor(); |
| 265 width = DebugColors::ExtraLowResTileBorderWidth(layer_tree_impl()); | 257 width = DebugColors::ExtraLowResTileBorderWidth(layer_tree_impl()); |
| 266 } | 258 } |
| 267 } else { | 259 } else { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 286 std::vector<PictureLayerTiling*> seen_tilings; | 278 std::vector<PictureLayerTiling*> seen_tilings; |
| 287 | 279 |
| 288 // Ignore missing tiles outside of viewport for tile priority. This is | 280 // Ignore missing tiles outside of viewport for tile priority. This is |
| 289 // normally the same as draw viewport but can be independently overridden by | 281 // normally the same as draw viewport but can be independently overridden by |
| 290 // embedders like Android WebView with SetExternalDrawConstraints. | 282 // embedders like Android WebView with SetExternalDrawConstraints. |
| 291 gfx::Rect scaled_viewport_for_tile_priority = gfx::ScaleToEnclosingRect( | 283 gfx::Rect scaled_viewport_for_tile_priority = gfx::ScaleToEnclosingRect( |
| 292 GetViewportForTilePriorityInContentSpace(), max_contents_scale); | 284 GetViewportForTilePriorityInContentSpace(), max_contents_scale); |
| 293 | 285 |
| 294 size_t missing_tile_count = 0u; | 286 size_t missing_tile_count = 0u; |
| 295 size_t on_demand_missing_tile_count = 0u; | 287 size_t on_demand_missing_tile_count = 0u; |
| 288 only_used_low_res_last_append_quads_ = true; |
| 296 for (PictureLayerTilingSet::CoverageIterator iter(tilings_.get(), | 289 for (PictureLayerTilingSet::CoverageIterator iter(tilings_.get(), |
| 297 max_contents_scale, | 290 max_contents_scale, |
| 298 scaled_visible_content_rect, | 291 scaled_visible_content_rect, |
| 299 ideal_contents_scale_); | 292 ideal_contents_scale_); |
| 300 iter; | 293 iter; |
| 301 ++iter) { | 294 ++iter) { |
| 302 gfx::Rect geometry_rect = iter.geometry_rect(); | 295 gfx::Rect geometry_rect = iter.geometry_rect(); |
| 303 gfx::Rect opaque_rect = contents_opaque() ? geometry_rect : gfx::Rect(); | 296 gfx::Rect opaque_rect = contents_opaque() ? geometry_rect : gfx::Rect(); |
| 304 gfx::Rect visible_geometry_rect = | 297 gfx::Rect visible_geometry_rect = |
| 305 scaled_occlusion.GetUnoccludedContentRect(geometry_rect); | 298 scaled_occlusion.GetUnoccludedContentRect(geometry_rect); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 | 397 |
| 405 if (geometry_rect.Intersects(scaled_viewport_for_tile_priority)) { | 398 if (geometry_rect.Intersects(scaled_viewport_for_tile_priority)) { |
| 406 append_quads_data->num_missing_tiles++; | 399 append_quads_data->num_missing_tiles++; |
| 407 ++missing_tile_count; | 400 ++missing_tile_count; |
| 408 } | 401 } |
| 409 append_quads_data->approximated_visible_content_area += | 402 append_quads_data->approximated_visible_content_area += |
| 410 visible_geometry_rect.width() * visible_geometry_rect.height(); | 403 visible_geometry_rect.width() * visible_geometry_rect.height(); |
| 411 continue; | 404 continue; |
| 412 } | 405 } |
| 413 | 406 |
| 414 if (iter->priority(ACTIVE_TREE).resolution != HIGH_RESOLUTION) { | 407 if (iter.resolution() != HIGH_RESOLUTION) { |
| 415 append_quads_data->approximated_visible_content_area += | 408 append_quads_data->approximated_visible_content_area += |
| 416 visible_geometry_rect.width() * visible_geometry_rect.height(); | 409 visible_geometry_rect.width() * visible_geometry_rect.height(); |
| 417 } | 410 } |
| 418 | 411 |
| 412 // If we have a draw quad, but it's not low resolution, then |
| 413 // mark that we've used something other than low res to draw. |
| 414 if (iter.resolution() != LOW_RESOLUTION) |
| 415 only_used_low_res_last_append_quads_ = false; |
| 416 |
| 419 if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling()) | 417 if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling()) |
| 420 seen_tilings.push_back(iter.CurrentTiling()); | 418 seen_tilings.push_back(iter.CurrentTiling()); |
| 421 } | 419 } |
| 422 | 420 |
| 423 if (missing_tile_count) { | 421 if (missing_tile_count) { |
| 424 TRACE_EVENT_INSTANT2("cc", | 422 TRACE_EVENT_INSTANT2("cc", |
| 425 "PictureLayerImpl::AppendQuads checkerboard", | 423 "PictureLayerImpl::AppendQuads checkerboard", |
| 426 TRACE_EVENT_SCOPE_THREAD, | 424 TRACE_EVENT_SCOPE_THREAD, |
| 427 "missing_tile_count", | 425 "missing_tile_count", |
| 428 missing_tile_count, | 426 missing_tile_count, |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 472 DCHECK(raster_source_scale_); | 470 DCHECK(raster_source_scale_); |
| 473 DCHECK(raster_contents_scale_); | 471 DCHECK(raster_contents_scale_); |
| 474 DCHECK(low_res_raster_contents_scale_); | 472 DCHECK(low_res_raster_contents_scale_); |
| 475 | 473 |
| 476 was_screen_space_transform_animating_ = | 474 was_screen_space_transform_animating_ = |
| 477 draw_properties().screen_space_transform_is_animating; | 475 draw_properties().screen_space_transform_is_animating; |
| 478 | 476 |
| 479 should_update_tile_priorities_ = true; | 477 should_update_tile_priorities_ = true; |
| 480 | 478 |
| 481 UpdateTilePriorities(occlusion_in_content_space); | 479 UpdateTilePriorities(occlusion_in_content_space); |
| 482 | |
| 483 if (layer_tree_impl()->IsPendingTree()) | |
| 484 MarkVisibleResourcesAsRequired(); | |
| 485 } | 480 } |
| 486 | 481 |
| 487 void PictureLayerImpl::UpdateTilePriorities( | 482 void PictureLayerImpl::UpdateTilePriorities( |
| 488 const Occlusion& occlusion_in_content_space) { | 483 const Occlusion& occlusion_in_content_space) { |
| 489 DCHECK(!pile_->is_solid_color() || !tilings_->num_tilings()); | 484 DCHECK(!pile_->is_solid_color() || !tilings_->num_tilings()); |
| 490 | 485 |
| 491 TRACE_EVENT0("cc", "PictureLayerImpl::UpdateTilePriorities"); | 486 TRACE_EVENT0("cc", "PictureLayerImpl::UpdateTilePriorities"); |
| 492 | 487 |
| 493 double current_frame_time_in_seconds = | 488 double current_frame_time_in_seconds = |
| 494 (layer_tree_impl()->CurrentBeginFrameArgs().frame_time - | 489 (layer_tree_impl()->CurrentBeginFrameArgs().frame_time - |
| 495 base::TimeTicks()).InSecondsF(); | 490 base::TimeTicks()).InSecondsF(); |
| 496 | 491 |
| 497 bool tiling_needs_update = false; | 492 bool tiling_needs_update = false; |
| 498 for (size_t i = 0; i < tilings_->num_tilings(); ++i) { | 493 for (size_t i = 0; i < tilings_->num_tilings(); ++i) { |
| 499 if (tilings_->tiling_at(i)->NeedsUpdateForFrameAtTime( | 494 if (tilings_->tiling_at(i)->NeedsUpdateForFrameAtTime( |
| 500 current_frame_time_in_seconds)) { | 495 current_frame_time_in_seconds)) { |
| 501 tiling_needs_update = true; | 496 tiling_needs_update = true; |
| 502 break; | 497 break; |
| 503 } | 498 } |
| 504 } | 499 } |
| 505 if (!tiling_needs_update) | 500 if (!tiling_needs_update) |
| 506 return; | 501 return; |
| 507 | 502 |
| 508 gfx::Rect viewport_rect_in_layer_space = | 503 gfx::Rect viewport_rect_in_layer_space = |
| 509 GetViewportForTilePriorityInContentSpace(); | 504 GetViewportForTilePriorityInContentSpace(); |
| 510 WhichTree tree = | 505 WhichTree tree = |
| 511 layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE; | 506 layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE; |
| 507 bool can_require_tiles_for_activation = |
| 508 !only_used_low_res_last_append_quads_ || RequiresHighResToDraw() || |
| 509 !layer_tree_impl()->SmoothnessTakesPriority(); |
| 512 for (size_t i = 0; i < tilings_->num_tilings(); ++i) { | 510 for (size_t i = 0; i < tilings_->num_tilings(); ++i) { |
| 511 PictureLayerTiling* tiling = tilings_->tiling_at(i); |
| 512 |
| 513 tiling->set_can_require_tiles_for_activation( |
| 514 can_require_tiles_for_activation); |
| 515 |
| 513 // Pass |occlusion_in_content_space| for |occlusion_in_layer_space| since | 516 // Pass |occlusion_in_content_space| for |occlusion_in_layer_space| since |
| 514 // they are the same space in picture lbayer, as contents scale is always 1. | 517 // they are the same space in picture layer, as contents scale is always 1. |
| 515 tilings_->tiling_at(i)->UpdateTilePriorities(tree, | 518 tiling->ComputeTilePriorityRects(tree, |
| 516 viewport_rect_in_layer_space, | 519 viewport_rect_in_layer_space, |
| 517 ideal_contents_scale_, | 520 ideal_contents_scale_, |
| 518 current_frame_time_in_seconds, | 521 current_frame_time_in_seconds, |
| 519 occlusion_in_content_space); | 522 occlusion_in_content_space); |
| 520 } | 523 } |
| 521 | 524 |
| 522 // Tile priorities were modified. | 525 // Tile priorities were modified. |
| 526 // TODO(vmpstr): See if this can be removed in favour of calling it from LTHI |
| 523 layer_tree_impl()->DidModifyTilePriorities(); | 527 layer_tree_impl()->DidModifyTilePriorities(); |
| 524 } | 528 } |
| 525 | 529 |
| 526 gfx::Rect PictureLayerImpl::GetViewportForTilePriorityInContentSpace() const { | 530 gfx::Rect PictureLayerImpl::GetViewportForTilePriorityInContentSpace() const { |
| 527 // If visible_rect_for_tile_priority_ is empty or | 531 // If visible_rect_for_tile_priority_ is empty or |
| 528 // viewport_rect_for_tile_priority is set to be different from the device | 532 // viewport_rect_for_tile_priority is set to be different from the device |
| 529 // viewport, try to inverse project the viewport into layer space and use | 533 // viewport, try to inverse project the viewport into layer space and use |
| 530 // that. Otherwise just use visible_rect_for_tile_priority_ | 534 // that. Otherwise just use visible_rect_for_tile_priority_ |
| 531 gfx::Rect visible_rect_in_content_space = visible_rect_for_tile_priority_; | 535 gfx::Rect visible_rect_in_content_space = visible_rect_for_tile_priority_; |
| 532 gfx::Rect viewport_rect_for_tile_priority = | 536 gfx::Rect viewport_rect_for_tile_priority = |
| (...skipping 21 matching lines...) Expand all Loading... |
| 554 void PictureLayerImpl::NotifyTileStateChanged(const Tile* tile) { | 558 void PictureLayerImpl::NotifyTileStateChanged(const Tile* tile) { |
| 555 if (layer_tree_impl()->IsActiveTree()) { | 559 if (layer_tree_impl()->IsActiveTree()) { |
| 556 gfx::RectF layer_damage_rect = | 560 gfx::RectF layer_damage_rect = |
| 557 gfx::ScaleRect(tile->content_rect(), 1.f / tile->contents_scale()); | 561 gfx::ScaleRect(tile->content_rect(), 1.f / tile->contents_scale()); |
| 558 AddDamageRect(layer_damage_rect); | 562 AddDamageRect(layer_damage_rect); |
| 559 } | 563 } |
| 560 } | 564 } |
| 561 | 565 |
| 562 void PictureLayerImpl::DidBecomeActive() { | 566 void PictureLayerImpl::DidBecomeActive() { |
| 563 LayerImpl::DidBecomeActive(); | 567 LayerImpl::DidBecomeActive(); |
| 564 tilings_->DidBecomeActive(); | 568 // TODO(vmpstr): See if this can be removed in favour of calling it from LTHI |
| 565 layer_tree_impl()->DidModifyTilePriorities(); | 569 layer_tree_impl()->DidModifyTilePriorities(); |
| 566 } | 570 } |
| 567 | 571 |
| 568 void PictureLayerImpl::DidBeginTracing() { | 572 void PictureLayerImpl::DidBeginTracing() { |
| 569 pile_->DidBeginTracing(); | 573 pile_->DidBeginTracing(); |
| 570 } | 574 } |
| 571 | 575 |
| 572 void PictureLayerImpl::ReleaseResources() { | 576 void PictureLayerImpl::ReleaseResources() { |
| 573 if (tilings_) | 577 if (tilings_) |
| 574 RemoveAllTilings(); | 578 RemoveAllTilings(); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 648 layer_tree_impl()->begin_impl_frame_interval().InSecondsF() * | 652 layer_tree_impl()->begin_impl_frame_interval().InSecondsF() * |
| 649 layer_tree_impl()->settings().skewport_target_time_multiplier; | 653 layer_tree_impl()->settings().skewport_target_time_multiplier; |
| 650 } | 654 } |
| 651 | 655 |
| 652 int PictureLayerImpl::GetSkewportExtrapolationLimitInContentPixels() const { | 656 int PictureLayerImpl::GetSkewportExtrapolationLimitInContentPixels() const { |
| 653 return layer_tree_impl() | 657 return layer_tree_impl() |
| 654 ->settings() | 658 ->settings() |
| 655 .skewport_extrapolation_limit_in_content_pixels; | 659 .skewport_extrapolation_limit_in_content_pixels; |
| 656 } | 660 } |
| 657 | 661 |
| 662 bool PictureLayerImpl::RequiresHighResToDraw() const { |
| 663 return layer_tree_impl()->RequiresHighResToDraw(); |
| 664 } |
| 665 |
| 658 gfx::Size PictureLayerImpl::CalculateTileSize( | 666 gfx::Size PictureLayerImpl::CalculateTileSize( |
| 659 const gfx::Size& content_bounds) const { | 667 const gfx::Size& content_bounds) const { |
| 660 int max_texture_size = | 668 int max_texture_size = |
| 661 layer_tree_impl()->resource_provider()->max_texture_size(); | 669 layer_tree_impl()->resource_provider()->max_texture_size(); |
| 662 | 670 |
| 663 if (pile_->is_mask()) { | 671 if (pile_->is_mask()) { |
| 664 // Masks are not tiled, so if we can't cover the whole mask with one tile, | 672 // Masks are not tiled, so if we can't cover the whole mask with one tile, |
| 665 // don't make any tiles at all. Returning an empty size signals this. | 673 // don't make any tiles at all. Returning an empty size signals this. |
| 666 if (content_bounds.width() > max_texture_size || | 674 if (content_bounds.width() > max_texture_size || |
| 667 content_bounds.height() > max_texture_size) | 675 content_bounds.height() > max_texture_size) |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 785 << content_rect.ToString(); | 793 << content_rect.ToString(); |
| 786 | 794 |
| 787 const ManagedTileState::DrawInfo& draw_info = iter->draw_info(); | 795 const ManagedTileState::DrawInfo& draw_info = iter->draw_info(); |
| 788 if (!draw_info.IsReadyToDraw() || | 796 if (!draw_info.IsReadyToDraw() || |
| 789 draw_info.mode() != ManagedTileState::DrawInfo::RESOURCE_MODE) | 797 draw_info.mode() != ManagedTileState::DrawInfo::RESOURCE_MODE) |
| 790 return 0; | 798 return 0; |
| 791 | 799 |
| 792 return draw_info.get_resource_id(); | 800 return draw_info.get_resource_id(); |
| 793 } | 801 } |
| 794 | 802 |
| 795 void PictureLayerImpl::MarkVisibleResourcesAsRequired() const { | |
| 796 DCHECK(layer_tree_impl()->IsPendingTree()); | |
| 797 DCHECK(ideal_contents_scale_); | |
| 798 DCHECK_GT(tilings_->num_tilings(), 0u); | |
| 799 | |
| 800 // The goal of this function is to find the minimum set of tiles that need to | |
| 801 // be ready to draw in order to activate without flashing content from a | |
| 802 // higher res on the active tree to a lower res on the pending tree. | |
| 803 | |
| 804 // First, early out for layers with no visible content. | |
| 805 if (visible_rect_for_tile_priority_.IsEmpty()) | |
| 806 return; | |
| 807 | |
| 808 // Only mark tiles inside the viewport for tile priority as required for | |
| 809 // activation. This viewport is normally the same as the draw viewport but | |
| 810 // can be independently overridden by embedders like Android WebView with | |
| 811 // SetExternalDrawConstraints. | |
| 812 gfx::Rect rect = GetViewportForTilePriorityInContentSpace(); | |
| 813 rect.Intersect(visible_rect_for_tile_priority_); | |
| 814 | |
| 815 float min_acceptable_scale = | |
| 816 std::min(raster_contents_scale_, ideal_contents_scale_); | |
| 817 | |
| 818 if (PictureLayerImpl* twin = twin_layer_) { | |
| 819 float twin_min_acceptable_scale = | |
| 820 std::min(twin->ideal_contents_scale_, twin->raster_contents_scale_); | |
| 821 // Ignore 0 scale in case CalculateContentsScale() has never been | |
| 822 // called for active twin. | |
| 823 if (twin_min_acceptable_scale != 0.0f) { | |
| 824 min_acceptable_scale = | |
| 825 std::min(min_acceptable_scale, twin_min_acceptable_scale); | |
| 826 } | |
| 827 } | |
| 828 | |
| 829 PictureLayerTiling* high_res = NULL; | |
| 830 PictureLayerTiling* low_res = NULL; | |
| 831 | |
| 832 // First pass: ready to draw tiles in acceptable but non-ideal tilings are | |
| 833 // marked as required for activation so that their textures are not thrown | |
| 834 // away; any non-ready tiles are not marked as required. | |
| 835 Region missing_region = rect; | |
| 836 for (size_t i = 0; i < tilings_->num_tilings(); ++i) { | |
| 837 PictureLayerTiling* tiling = tilings_->tiling_at(i); | |
| 838 DCHECK(tiling->has_ever_been_updated()); | |
| 839 | |
| 840 if (tiling->resolution() == LOW_RESOLUTION) { | |
| 841 DCHECK(!low_res) << "There can only be one low res tiling"; | |
| 842 low_res = tiling; | |
| 843 } | |
| 844 if (tiling->contents_scale() < min_acceptable_scale) | |
| 845 continue; | |
| 846 if (tiling->resolution() == HIGH_RESOLUTION) { | |
| 847 DCHECK(!high_res) << "There can only be one high res tiling"; | |
| 848 high_res = tiling; | |
| 849 continue; | |
| 850 } | |
| 851 for (PictureLayerTiling::CoverageIterator iter(tiling, 1.f, rect); iter; | |
| 852 ++iter) { | |
| 853 if (!*iter || !iter->IsReadyToDraw()) | |
| 854 continue; | |
| 855 | |
| 856 missing_region.Subtract(iter.geometry_rect()); | |
| 857 iter->MarkRequiredForActivation(); | |
| 858 } | |
| 859 } | |
| 860 DCHECK(high_res) << "There must be one high res tiling"; | |
| 861 | |
| 862 // If these pointers are null (because no twin, no matching tiling, or the | |
| 863 // simpification just below), then high res tiles will be required to fill any | |
| 864 // holes left by the first pass above. If the pointers are valid, then this | |
| 865 // layer is allowed to skip any tiles that are not ready on its twin. | |
| 866 const PictureLayerTiling* twin_high_res = NULL; | |
| 867 const PictureLayerTiling* twin_low_res = NULL; | |
| 868 | |
| 869 if (twin_layer_) { | |
| 870 // As a simplification, only allow activating to skip twin tiles that the | |
| 871 // active layer is also missing when both this layer and its twin have | |
| 872 // "simple" sets of tilings: only 2 tilings (high and low) or only 1 high | |
| 873 // res tiling. This avoids having to iterate/track coverage of non-ideal | |
| 874 // tilings during the last draw call on the active layer. | |
| 875 if (tilings_->num_tilings() <= 2 && | |
| 876 twin_layer_->tilings_->num_tilings() <= tilings_->num_tilings()) { | |
| 877 twin_low_res = low_res ? GetTwinTiling(low_res) : NULL; | |
| 878 twin_high_res = high_res ? GetTwinTiling(high_res) : NULL; | |
| 879 } | |
| 880 | |
| 881 // If this layer and its twin have different transforms, then don't compare | |
| 882 // them and only allow activating to high res tiles, since tiles on each | |
| 883 // layer will be in different places on screen. | |
| 884 if (layer_tree_impl()->RequiresHighResToDraw() || | |
| 885 bounds() != twin_layer_->bounds() || | |
| 886 draw_properties().screen_space_transform != | |
| 887 twin_layer_->draw_properties().screen_space_transform) { | |
| 888 twin_high_res = NULL; | |
| 889 twin_low_res = NULL; | |
| 890 } | |
| 891 } | |
| 892 | |
| 893 // As a second pass, mark as required any visible high res tiles not filled in | |
| 894 // by acceptable non-ideal tiles from the first pass. | |
| 895 if (MarkVisibleTilesAsRequired( | |
| 896 high_res, twin_high_res, rect, missing_region)) { | |
| 897 // As an optional third pass, if a high res tile was skipped because its | |
| 898 // twin was also missing, then fall back to mark low res tiles as required | |
| 899 // in case the active twin is substituting those for missing high res | |
| 900 // content. Only suitable, when low res is enabled. | |
| 901 if (low_res) { | |
| 902 MarkVisibleTilesAsRequired(low_res, twin_low_res, rect, missing_region); | |
| 903 } | |
| 904 } | |
| 905 } | |
| 906 | |
| 907 bool PictureLayerImpl::MarkVisibleTilesAsRequired( | |
| 908 PictureLayerTiling* tiling, | |
| 909 const PictureLayerTiling* optional_twin_tiling, | |
| 910 const gfx::Rect& rect, | |
| 911 const Region& missing_region) const { | |
| 912 bool twin_had_missing_tile = false; | |
| 913 for (PictureLayerTiling::CoverageIterator iter(tiling, 1.f, rect); iter; | |
| 914 ++iter) { | |
| 915 Tile* tile = *iter; | |
| 916 // A null tile (i.e. missing recording) can just be skipped. | |
| 917 if (!tile) | |
| 918 continue; | |
| 919 | |
| 920 // If the tile is occluded, don't mark it as required for activation. | |
| 921 if (tile->is_occluded(PENDING_TREE)) | |
| 922 continue; | |
| 923 | |
| 924 // If the missing region doesn't cover it, this tile is fully | |
| 925 // covered by acceptable tiles at other scales. | |
| 926 if (!missing_region.Intersects(iter.geometry_rect())) | |
| 927 continue; | |
| 928 | |
| 929 // If the twin tile doesn't exist (i.e. missing recording or so far away | |
| 930 // that it is outside the visible tile rect) or this tile is shared between | |
| 931 // with the twin, then this tile isn't required to prevent flashing. | |
| 932 if (optional_twin_tiling) { | |
| 933 Tile* twin_tile = optional_twin_tiling->TileAt(iter.i(), iter.j()); | |
| 934 if (!twin_tile || twin_tile == tile) { | |
| 935 // However if the shared tile is being used on the active tree, then | |
| 936 // there's no missing content in this place, and low res is not needed. | |
| 937 if (!twin_tile || !twin_tile->IsReadyToDraw()) | |
| 938 twin_had_missing_tile = true; | |
| 939 continue; | |
| 940 } | |
| 941 } | |
| 942 | |
| 943 tile->MarkRequiredForActivation(); | |
| 944 } | |
| 945 return twin_had_missing_tile; | |
| 946 } | |
| 947 | |
| 948 void PictureLayerImpl::DoPostCommitInitialization() { | 803 void PictureLayerImpl::DoPostCommitInitialization() { |
| 949 DCHECK(needs_post_commit_initialization_); | 804 DCHECK(needs_post_commit_initialization_); |
| 950 DCHECK(layer_tree_impl()->IsPendingTree()); | 805 DCHECK(layer_tree_impl()->IsPendingTree()); |
| 951 | 806 |
| 952 if (!tilings_) | 807 if (!tilings_) |
| 953 tilings_.reset(new PictureLayerTilingSet(this, bounds())); | 808 tilings_.reset(new PictureLayerTilingSet(this, bounds())); |
| 954 | 809 |
| 955 DCHECK(!twin_layer_); | 810 DCHECK(!twin_layer_); |
| 956 twin_layer_ = static_cast<PictureLayerImpl*>( | 811 twin_layer_ = static_cast<PictureLayerImpl*>( |
| 957 layer_tree_impl()->FindActiveTreeLayerById(id())); | 812 layer_tree_impl()->FindActiveTreeLayerById(id())); |
| (...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1335 if (layer_tree_impl()->IsRecycleTree()) | 1190 if (layer_tree_impl()->IsRecycleTree()) |
| 1336 return; | 1191 return; |
| 1337 | 1192 |
| 1338 if (!CanHaveTilings()) { | 1193 if (!CanHaveTilings()) { |
| 1339 DCHECK_EQ(0u, tilings_->num_tilings()); | 1194 DCHECK_EQ(0u, tilings_->num_tilings()); |
| 1340 return; | 1195 return; |
| 1341 } | 1196 } |
| 1342 if (tilings_->num_tilings() == 0) | 1197 if (tilings_->num_tilings() == 0) |
| 1343 return; | 1198 return; |
| 1344 | 1199 |
| 1345 // MarkVisibleResourcesAsRequired depends on having exactly 1 high res | 1200 // We should only have one high res tiling. |
| 1346 // tiling to mark its tiles as being required for activation. | |
| 1347 DCHECK_EQ(1, tilings_->NumHighResTilings()); | 1201 DCHECK_EQ(1, tilings_->NumHighResTilings()); |
| 1348 #endif | 1202 #endif |
| 1349 } | 1203 } |
| 1350 | 1204 |
| 1351 bool PictureLayerImpl::ShouldAdjustRasterScaleDuringScaleAnimations() const { | 1205 bool PictureLayerImpl::ShouldAdjustRasterScaleDuringScaleAnimations() const { |
| 1352 if (!layer_tree_impl()->use_gpu_rasterization()) | 1206 if (!layer_tree_impl()->use_gpu_rasterization()) |
| 1353 return false; | 1207 return false; |
| 1354 | 1208 |
| 1355 // Re-rastering text at different scales using GPU rasterization causes | 1209 // Re-rastering text at different scales using GPU rasterization causes |
| 1356 // texture uploads for glyphs at each scale (see crbug.com/366225). To | 1210 // texture uploads for glyphs at each scale (see crbug.com/366225). To |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1497 for (size_t i = 0; i < tilings_->num_tilings(); ++i) { | 1351 for (size_t i = 0; i < tilings_->num_tilings(); ++i) { |
| 1498 PictureLayerTiling* tiling = tilings_->tiling_at(i); | 1352 PictureLayerTiling* tiling = tilings_->tiling_at(i); |
| 1499 if (tiling->resolution() != HIGH_RESOLUTION && | 1353 if (tiling->resolution() != HIGH_RESOLUTION && |
| 1500 tiling->resolution() != LOW_RESOLUTION) | 1354 tiling->resolution() != LOW_RESOLUTION) |
| 1501 continue; | 1355 continue; |
| 1502 | 1356 |
| 1503 for (PictureLayerTiling::CoverageIterator iter(tiling, 1.f, rect); iter; | 1357 for (PictureLayerTiling::CoverageIterator iter(tiling, 1.f, rect); iter; |
| 1504 ++iter) { | 1358 ++iter) { |
| 1505 const Tile* tile = *iter; | 1359 const Tile* tile = *iter; |
| 1506 // A null tile (i.e. missing recording) can just be skipped. | 1360 // A null tile (i.e. missing recording) can just be skipped. |
| 1361 // TODO(vmpstr): Verify this is true if we create tiles in raster |
| 1362 // iterators. |
| 1507 if (!tile) | 1363 if (!tile) |
| 1508 continue; | 1364 continue; |
| 1509 | 1365 |
| 1510 if (tile->required_for_activation() && !tile->IsReadyToDraw()) | 1366 // We can't check tile->required_for_activation, because that value might |
| 1367 // be out of date. It is updated in the raster/eviction iterators. |
| 1368 // TODO(vmpstr): Remove the comment once you can't access this information |
| 1369 // from the tile. |
| 1370 if (tiling->IsTileRequiredForActivation(tile) && !tile->IsReadyToDraw()) |
| 1511 return false; | 1371 return false; |
| 1512 } | 1372 } |
| 1513 } | 1373 } |
| 1514 | 1374 |
| 1515 return true; | 1375 return true; |
| 1516 } | 1376 } |
| 1517 | 1377 |
| 1518 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator() | 1378 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator() |
| 1519 : layer_(NULL), current_stage_(arraysize(stages_)) { | 1379 : layer_(NULL), current_stage_(arraysize(stages_)) { |
| 1520 } | 1380 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1531 return; | 1391 return; |
| 1532 } | 1392 } |
| 1533 | 1393 |
| 1534 // Tiles without valid priority are treated as having lowest priority and | 1394 // Tiles without valid priority are treated as having lowest priority and |
| 1535 // never considered for raster. | 1395 // never considered for raster. |
| 1536 if (!layer_->HasValidTilePriorities()) { | 1396 if (!layer_->HasValidTilePriorities()) { |
| 1537 current_stage_ = arraysize(stages_); | 1397 current_stage_ = arraysize(stages_); |
| 1538 return; | 1398 return; |
| 1539 } | 1399 } |
| 1540 | 1400 |
| 1541 WhichTree tree = layer_->GetTree(); | |
| 1542 | |
| 1543 // Find high and low res tilings and initialize the iterators. | 1401 // Find high and low res tilings and initialize the iterators. |
| 1544 for (size_t i = 0; i < layer_->tilings_->num_tilings(); ++i) { | 1402 for (size_t i = 0; i < layer_->tilings_->num_tilings(); ++i) { |
| 1545 PictureLayerTiling* tiling = layer_->tilings_->tiling_at(i); | 1403 PictureLayerTiling* tiling = layer_->tilings_->tiling_at(i); |
| 1546 if (tiling->resolution() == HIGH_RESOLUTION) { | 1404 if (tiling->resolution() == HIGH_RESOLUTION) { |
| 1547 iterators_[HIGH_RES] = | 1405 iterators_[HIGH_RES] = |
| 1548 PictureLayerTiling::TilingRasterTileIterator(tiling, tree); | 1406 PictureLayerTiling::TilingRasterTileIterator(tiling); |
| 1549 } | 1407 } |
| 1550 | 1408 |
| 1551 if (tiling->resolution() == LOW_RESOLUTION) { | 1409 if (tiling->resolution() == LOW_RESOLUTION) { |
| 1552 iterators_[LOW_RES] = | 1410 iterators_[LOW_RES] = |
| 1553 PictureLayerTiling::TilingRasterTileIterator(tiling, tree); | 1411 PictureLayerTiling::TilingRasterTileIterator(tiling); |
| 1554 } | 1412 } |
| 1555 } | 1413 } |
| 1556 | 1414 |
| 1557 if (prioritize_low_res) { | 1415 if (prioritize_low_res) { |
| 1558 stages_[0].iterator_type = LOW_RES; | 1416 stages_[0].iterator_type = LOW_RES; |
| 1559 stages_[0].tile_type = TilePriority::NOW; | 1417 stages_[0].tile_type = TilePriority::NOW; |
| 1560 | 1418 |
| 1561 stages_[1].iterator_type = HIGH_RES; | 1419 stages_[1].iterator_type = HIGH_RES; |
| 1562 stages_[1].tile_type = TilePriority::NOW; | 1420 stages_[1].tile_type = TilePriority::NOW; |
| 1563 } else { | 1421 } else { |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1783 PictureLayerTilingSet::TilingRange tiling_range = CurrentTilingRange(); | 1641 PictureLayerTilingSet::TilingRange tiling_range = CurrentTilingRange(); |
| 1784 size_t current_tiling_range_offset = current_tiling_ - tiling_range.start; | 1642 size_t current_tiling_range_offset = current_tiling_ - tiling_range.start; |
| 1785 return tiling_range.end - 1 - current_tiling_range_offset; | 1643 return tiling_range.end - 1 - current_tiling_range_offset; |
| 1786 } | 1644 } |
| 1787 } | 1645 } |
| 1788 NOTREACHED(); | 1646 NOTREACHED(); |
| 1789 return 0; | 1647 return 0; |
| 1790 } | 1648 } |
| 1791 | 1649 |
| 1792 } // namespace cc | 1650 } // namespace cc |
| OLD | NEW |