| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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/trees/layer_tree_host_impl.h" | 5 #include "cc/trees/layer_tree_host_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 103 // correct. In fact, setting fake thread id's interferes with the real | 103 // correct. In fact, setting fake thread id's interferes with the real |
| 104 // thread id's and causes breakage. | 104 // thread id's and causes breakage. |
| 105 scoped_ptr<DebugScopedSetImplThread> set_impl_thread; | 105 scoped_ptr<DebugScopedSetImplThread> set_impl_thread; |
| 106 if (!layer_tree_host_impl_->proxy()->HasImplThread()) { | 106 if (!layer_tree_host_impl_->proxy()->HasImplThread()) { |
| 107 set_impl_thread.reset( | 107 set_impl_thread.reset( |
| 108 new DebugScopedSetImplThread(layer_tree_host_impl_->proxy())); | 108 new DebugScopedSetImplThread(layer_tree_host_impl_->proxy())); |
| 109 } | 109 } |
| 110 | 110 |
| 111 // TODO(enne): This should probably happen post-animate. | 111 // TODO(enne): This should probably happen post-animate. |
| 112 if (layer_tree_host_impl_->pending_tree()) { | 112 if (layer_tree_host_impl_->pending_tree()) { |
| 113 layer_tree_host_impl_->ActivatePendingTreeIfNeeded(); | 113 layer_tree_host_impl_->pending_tree()->UpdateDrawProperties(); |
| 114 | 114 layer_tree_host_impl_->ManageTiles(); |
| 115 if (layer_tree_host_impl_->pending_tree()) { | |
| 116 layer_tree_host_impl_->pending_tree()->UpdateDrawProperties(); | |
| 117 layer_tree_host_impl_->ManageTiles(); | |
| 118 } | |
| 119 } | 115 } |
| 120 | 116 |
| 121 layer_tree_host_impl_->Animate( | 117 layer_tree_host_impl_->Animate( |
| 122 layer_tree_host_impl_->CurrentFrameTimeTicks(), | 118 layer_tree_host_impl_->CurrentFrameTimeTicks(), |
| 123 layer_tree_host_impl_->CurrentFrameTime()); | 119 layer_tree_host_impl_->CurrentFrameTime()); |
| 124 layer_tree_host_impl_->UpdateBackgroundAnimateTicking(true); | 120 layer_tree_host_impl_->UpdateBackgroundAnimateTicking(true); |
| 125 bool start_ready_animations = true; | 121 bool start_ready_animations = true; |
| 126 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations); | 122 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations); |
| 127 layer_tree_host_impl_->ResetCurrentFrameTimeForNextFrame(); | 123 layer_tree_host_impl_->ResetCurrentFrameTimeForNextFrame(); |
| 128 } | 124 } |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 TRACE_EVENT0("cc", "LayerTreeHostImpl::CommitComplete"); | 243 TRACE_EVENT0("cc", "LayerTreeHostImpl::CommitComplete"); |
| 248 | 244 |
| 249 if (settings_.impl_side_painting) { | 245 if (settings_.impl_side_painting) { |
| 250 // Impl-side painting needs an update immediately post-commit to have the | 246 // Impl-side painting needs an update immediately post-commit to have the |
| 251 // opportunity to create tilings. Other paths can call UpdateDrawProperties | 247 // opportunity to create tilings. Other paths can call UpdateDrawProperties |
| 252 // more lazily when needed prior to drawing. | 248 // more lazily when needed prior to drawing. |
| 253 pending_tree()->ApplyScrollDeltasSinceBeginFrame(); | 249 pending_tree()->ApplyScrollDeltasSinceBeginFrame(); |
| 254 pending_tree_->set_needs_update_draw_properties(); | 250 pending_tree_->set_needs_update_draw_properties(); |
| 255 pending_tree_->UpdateDrawProperties(); | 251 pending_tree_->UpdateDrawProperties(); |
| 256 // Start working on newly created tiles immediately if needed. | 252 // Start working on newly created tiles immediately if needed. |
| 257 ManageTiles(); | 253 if (!tile_manager_ || !manage_tiles_needed_) |
| 254 NotifyReadyToActivate(); |
| 255 else |
| 256 ManageTiles(); |
| 258 } else { | 257 } else { |
| 259 active_tree_->set_needs_update_draw_properties(); | 258 active_tree_->set_needs_update_draw_properties(); |
| 260 } | 259 } |
| 261 | 260 |
| 262 client_->SendManagedMemoryStats(); | 261 client_->SendManagedMemoryStats(); |
| 263 } | 262 } |
| 264 | 263 |
| 265 bool LayerTreeHostImpl::CanDraw() const { | 264 bool LayerTreeHostImpl::CanDraw() const { |
| 266 // Note: If you are changing this function or any other function that might | 265 // Note: If you are changing this function or any other function that might |
| 267 // affect the result of CanDraw, make sure to call | 266 // affect the result of CanDraw, make sure to call |
| (...skipping 751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1019 | 1018 |
| 1020 // If we return true, then we expect DrawLayers() to be called before this | 1019 // If we return true, then we expect DrawLayers() to be called before this |
| 1021 // function is called again. | 1020 // function is called again. |
| 1022 return true; | 1021 return true; |
| 1023 } | 1022 } |
| 1024 | 1023 |
| 1025 void LayerTreeHostImpl::EvictTexturesForTesting() { | 1024 void LayerTreeHostImpl::EvictTexturesForTesting() { |
| 1026 EnforceManagedMemoryPolicy(ManagedMemoryPolicy(0)); | 1025 EnforceManagedMemoryPolicy(ManagedMemoryPolicy(0)); |
| 1027 } | 1026 } |
| 1028 | 1027 |
| 1028 void LayerTreeHostImpl::BlockNotifyReadyToActivateForTesting(bool block) { |
| 1029 NOTREACHED(); |
| 1030 } |
| 1031 |
| 1029 void LayerTreeHostImpl::EnforceManagedMemoryPolicy( | 1032 void LayerTreeHostImpl::EnforceManagedMemoryPolicy( |
| 1030 const ManagedMemoryPolicy& policy) { | 1033 const ManagedMemoryPolicy& policy) { |
| 1031 | 1034 |
| 1032 bool evicted_resources = client_->ReduceContentsTextureMemoryOnImplThread( | 1035 bool evicted_resources = client_->ReduceContentsTextureMemoryOnImplThread( |
| 1033 visible_ ? policy.bytes_limit_when_visible | 1036 visible_ ? policy.bytes_limit_when_visible |
| 1034 : policy.bytes_limit_when_not_visible, | 1037 : policy.bytes_limit_when_not_visible, |
| 1035 ManagedMemoryPolicy::PriorityCutoffToValue( | 1038 ManagedMemoryPolicy::PriorityCutoffToValue( |
| 1036 visible_ ? policy.priority_cutoff_when_visible | 1039 visible_ ? policy.priority_cutoff_when_visible |
| 1037 : policy.priority_cutoff_when_not_visible)); | 1040 : policy.priority_cutoff_when_not_visible)); |
| 1038 if (evicted_resources) { | 1041 if (evicted_resources) { |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1078 | 1081 |
| 1079 void LayerTreeHostImpl::DidInitializeVisibleTile() { | 1082 void LayerTreeHostImpl::DidInitializeVisibleTile() { |
| 1080 // TODO(reveman): Determine tiles that changed and only damage | 1083 // TODO(reveman): Determine tiles that changed and only damage |
| 1081 // what's necessary. | 1084 // what's necessary. |
| 1082 SetFullRootLayerDamage(); | 1085 SetFullRootLayerDamage(); |
| 1083 if (client_) | 1086 if (client_) |
| 1084 client_->DidInitializeVisibleTileOnImplThread(); | 1087 client_->DidInitializeVisibleTileOnImplThread(); |
| 1085 } | 1088 } |
| 1086 | 1089 |
| 1087 void LayerTreeHostImpl::NotifyReadyToActivate() { | 1090 void LayerTreeHostImpl::NotifyReadyToActivate() { |
| 1088 if (pending_tree_) { | 1091 client_->NotifyReadyToActivate(); |
| 1089 need_to_update_visible_tiles_before_draw_ = true; | |
| 1090 ActivatePendingTree(); | |
| 1091 } | |
| 1092 } | 1092 } |
| 1093 | 1093 |
| 1094 bool LayerTreeHostImpl::ShouldClearRootRenderPass() const { | 1094 bool LayerTreeHostImpl::ShouldClearRootRenderPass() const { |
| 1095 return settings_.should_clear_root_render_pass; | 1095 return settings_.should_clear_root_render_pass; |
| 1096 } | 1096 } |
| 1097 | 1097 |
| 1098 void LayerTreeHostImpl::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { | 1098 void LayerTreeHostImpl::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { |
| 1099 SetManagedMemoryPolicy(policy, zero_budget_); | 1099 SetManagedMemoryPolicy(policy, zero_budget_); |
| 1100 } | 1100 } |
| 1101 | 1101 |
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1426 return 0; | 1426 return 0; |
| 1427 } | 1427 } |
| 1428 | 1428 |
| 1429 void LayerTreeHostImpl::CreatePendingTree() { | 1429 void LayerTreeHostImpl::CreatePendingTree() { |
| 1430 CHECK(!pending_tree_); | 1430 CHECK(!pending_tree_); |
| 1431 if (recycle_tree_) | 1431 if (recycle_tree_) |
| 1432 recycle_tree_.swap(pending_tree_); | 1432 recycle_tree_.swap(pending_tree_); |
| 1433 else | 1433 else |
| 1434 pending_tree_ = LayerTreeImpl::create(this); | 1434 pending_tree_ = LayerTreeImpl::create(this); |
| 1435 client_->OnCanDrawStateChanged(CanDraw()); | 1435 client_->OnCanDrawStateChanged(CanDraw()); |
| 1436 client_->OnHasPendingTreeStateChanged(pending_tree_); | |
| 1437 TRACE_EVENT_ASYNC_BEGIN0("cc", "PendingTree", pending_tree_.get()); | 1436 TRACE_EVENT_ASYNC_BEGIN0("cc", "PendingTree", pending_tree_.get()); |
| 1438 TRACE_EVENT_ASYNC_STEP0("cc", | 1437 TRACE_EVENT_ASYNC_STEP0("cc", |
| 1439 "PendingTree", pending_tree_.get(), "waiting"); | 1438 "PendingTree", pending_tree_.get(), "waiting"); |
| 1440 } | 1439 } |
| 1441 | 1440 |
| 1442 void LayerTreeHostImpl::UpdateVisibleTiles() { | 1441 void LayerTreeHostImpl::UpdateVisibleTiles() { |
| 1443 DCHECK(!client_->IsInsideDraw()) << | 1442 DCHECK(!client_->IsInsideDraw()) << |
| 1444 "Updating visible tiles within a draw may trigger " | 1443 "Updating visible tiles within a draw may trigger " |
| 1445 "spurious redraws."; | 1444 "spurious redraws."; |
| 1446 if (tile_manager_ && tile_manager_->UpdateVisibleTiles()) | 1445 if (tile_manager_ && tile_manager_->UpdateVisibleTiles()) |
| 1447 DidInitializeVisibleTile(); | 1446 DidInitializeVisibleTile(); |
| 1448 | 1447 |
| 1449 need_to_update_visible_tiles_before_draw_ = false; | 1448 need_to_update_visible_tiles_before_draw_ = false; |
| 1450 } | 1449 } |
| 1451 | 1450 |
| 1452 void LayerTreeHostImpl::ActivatePendingTreeIfNeeded() { | |
| 1453 DCHECK(pending_tree_); | |
| 1454 CHECK(settings_.impl_side_painting); | |
| 1455 | |
| 1456 if (!pending_tree_) | |
| 1457 return; | |
| 1458 | |
| 1459 // The tile manager is usually responsible for notifying activation. | |
| 1460 // If there is no tile manager, then we need to manually activate. | |
| 1461 if (!tile_manager_ || tile_manager_->AreTilesRequiredForActivationReady()) { | |
| 1462 ActivatePendingTree(); | |
| 1463 return; | |
| 1464 } | |
| 1465 | |
| 1466 // Manage tiles in case state affecting tile priority has changed. | |
| 1467 ManageTiles(); | |
| 1468 | |
| 1469 TRACE_EVENT_ASYNC_STEP1( | |
| 1470 "cc", | |
| 1471 "PendingTree", pending_tree_.get(), "activate", | |
| 1472 "state", TracedValue::FromValue(ActivationStateAsValue().release())); | |
| 1473 } | |
| 1474 | |
| 1475 void LayerTreeHostImpl::ActivatePendingTree() { | 1451 void LayerTreeHostImpl::ActivatePendingTree() { |
| 1476 CHECK(pending_tree_); | 1452 CHECK(pending_tree_); |
| 1477 TRACE_EVENT_ASYNC_END0("cc", "PendingTree", pending_tree_.get()); | 1453 TRACE_EVENT_ASYNC_END0("cc", "PendingTree", pending_tree_.get()); |
| 1478 | 1454 |
| 1455 need_to_update_visible_tiles_before_draw_ = true; |
| 1456 |
| 1479 active_tree_->SetRootLayerScrollOffsetDelegate(NULL); | 1457 active_tree_->SetRootLayerScrollOffsetDelegate(NULL); |
| 1480 active_tree_->PushPersistedState(pending_tree_.get()); | 1458 active_tree_->PushPersistedState(pending_tree_.get()); |
| 1481 if (pending_tree_->needs_full_tree_sync()) { | 1459 if (pending_tree_->needs_full_tree_sync()) { |
| 1482 active_tree_->SetRootLayer( | 1460 active_tree_->SetRootLayer( |
| 1483 TreeSynchronizer::SynchronizeTrees(pending_tree_->root_layer(), | 1461 TreeSynchronizer::SynchronizeTrees(pending_tree_->root_layer(), |
| 1484 active_tree_->DetachLayerTree(), | 1462 active_tree_->DetachLayerTree(), |
| 1485 active_tree_.get())); | 1463 active_tree_.get())); |
| 1486 } | 1464 } |
| 1487 TreeSynchronizer::PushProperties(pending_tree_->root_layer(), | 1465 TreeSynchronizer::PushProperties(pending_tree_->root_layer(), |
| 1488 active_tree_->root_layer()); | 1466 active_tree_->root_layer()); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1502 | 1480 |
| 1503 active_tree_->SetRootLayerScrollOffsetDelegate( | 1481 active_tree_->SetRootLayerScrollOffsetDelegate( |
| 1504 root_layer_scroll_offset_delegate_); | 1482 root_layer_scroll_offset_delegate_); |
| 1505 active_tree_->DidBecomeActive(); | 1483 active_tree_->DidBecomeActive(); |
| 1506 | 1484 |
| 1507 // Reduce wasted memory now that unlinked resources are guaranteed not | 1485 // Reduce wasted memory now that unlinked resources are guaranteed not |
| 1508 // to be used. | 1486 // to be used. |
| 1509 client_->ReduceWastedContentsTextureMemoryOnImplThread(); | 1487 client_->ReduceWastedContentsTextureMemoryOnImplThread(); |
| 1510 | 1488 |
| 1511 client_->OnCanDrawStateChanged(CanDraw()); | 1489 client_->OnCanDrawStateChanged(CanDraw()); |
| 1512 client_->OnHasPendingTreeStateChanged(pending_tree_); | |
| 1513 client_->SetNeedsRedrawOnImplThread(); | 1490 client_->SetNeedsRedrawOnImplThread(); |
| 1514 client_->RenewTreePriority(); | 1491 client_->RenewTreePriority(); |
| 1515 | 1492 |
| 1516 if (debug_state_.continuous_painting) { | 1493 if (debug_state_.continuous_painting) { |
| 1517 const RenderingStats& stats = | 1494 const RenderingStats& stats = |
| 1518 rendering_stats_instrumentation_->GetRenderingStats(); | 1495 rendering_stats_instrumentation_->GetRenderingStats(); |
| 1519 paint_time_counter_->SavePaintTime( | 1496 paint_time_counter_->SavePaintTime( |
| 1520 stats.main_stats.paint_time + stats.main_stats.record_time + | 1497 stats.main_stats.paint_time + stats.main_stats.record_time + |
| 1521 stats.impl_stats.rasterize_time_for_now_bins_on_pending_tree); | 1498 stats.impl_stats.rasterize_time_for_now_bins_on_pending_tree); |
| 1522 } | 1499 } |
| (...skipping 1012 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2535 | 2512 |
| 2536 ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource( | 2513 ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource( |
| 2537 UIResourceId uid) const { | 2514 UIResourceId uid) const { |
| 2538 UIResourceMap::const_iterator iter = ui_resource_map_.find(uid); | 2515 UIResourceMap::const_iterator iter = ui_resource_map_.find(uid); |
| 2539 if (iter != ui_resource_map_.end()) | 2516 if (iter != ui_resource_map_.end()) |
| 2540 return iter->second; | 2517 return iter->second; |
| 2541 return 0; | 2518 return 0; |
| 2542 } | 2519 } |
| 2543 | 2520 |
| 2544 } // namespace cc | 2521 } // namespace cc |
| OLD | NEW |