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 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 "cc", "LayerTreeHostImpl::CanDraw viewport size recently changed", | 304 "cc", "LayerTreeHostImpl::CanDraw viewport size recently changed", |
305 TRACE_EVENT_SCOPE_THREAD); | 305 TRACE_EVENT_SCOPE_THREAD); |
306 return false; | 306 return false; |
307 } | 307 } |
308 if (active_tree_->ContentsTexturesPurged()) { | 308 if (active_tree_->ContentsTexturesPurged()) { |
309 TRACE_EVENT_INSTANT0( | 309 TRACE_EVENT_INSTANT0( |
310 "cc", "LayerTreeHostImpl::CanDraw contents textures purged", | 310 "cc", "LayerTreeHostImpl::CanDraw contents textures purged", |
311 TRACE_EVENT_SCOPE_THREAD); | 311 TRACE_EVENT_SCOPE_THREAD); |
312 return false; | 312 return false; |
313 } | 313 } |
| 314 if (EvictedUIResourcesExist()) { |
| 315 TRACE_EVENT_INSTANT0( |
| 316 "cc", "LayerTreeHostImpl::CanDraw UI resources evicted not recreated", |
| 317 TRACE_EVENT_SCOPE_THREAD); |
| 318 return false; |
| 319 } |
314 return true; | 320 return true; |
315 } | 321 } |
316 | 322 |
317 void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time, | 323 void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time, |
318 base::Time wall_clock_time) { | 324 base::Time wall_clock_time) { |
319 if (input_handler_client_) | 325 if (input_handler_client_) |
320 input_handler_client_->Animate(monotonic_time); | 326 input_handler_client_->Animate(monotonic_time); |
321 AnimatePageScale(monotonic_time); | 327 AnimatePageScale(monotonic_time); |
322 AnimateLayers(monotonic_time, wall_clock_time); | 328 AnimateLayers(monotonic_time, wall_clock_time); |
323 AnimateScrollbars(monotonic_time); | 329 AnimateScrollbars(monotonic_time); |
(...skipping 1227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1551 | 1557 |
1552 void LayerTreeHostImpl::SetVisible(bool visible) { | 1558 void LayerTreeHostImpl::SetVisible(bool visible) { |
1553 DCHECK(proxy_->IsImplThread()); | 1559 DCHECK(proxy_->IsImplThread()); |
1554 | 1560 |
1555 if (visible_ == visible) | 1561 if (visible_ == visible) |
1556 return; | 1562 return; |
1557 visible_ = visible; | 1563 visible_ = visible; |
1558 DidVisibilityChange(this, visible_); | 1564 DidVisibilityChange(this, visible_); |
1559 EnforceManagedMemoryPolicy(ActualManagedMemoryPolicy()); | 1565 EnforceManagedMemoryPolicy(ActualManagedMemoryPolicy()); |
1560 | 1566 |
| 1567 if (!visible_) |
| 1568 EvictAllUIResources(); |
| 1569 |
1561 // Evict tiles immediately if invisible since this tab may never get another | 1570 // Evict tiles immediately if invisible since this tab may never get another |
1562 // draw or timer tick. | 1571 // draw or timer tick. |
1563 if (!visible_) | 1572 if (!visible_) |
1564 ManageTiles(); | 1573 ManageTiles(); |
1565 | 1574 |
1566 if (!renderer_) | 1575 if (!renderer_) |
1567 return; | 1576 return; |
1568 | 1577 |
1569 renderer_->SetVisible(visible); | 1578 renderer_->SetVisible(visible); |
1570 } | 1579 } |
(...skipping 20 matching lines...) Expand all Loading... |
1591 } | 1600 } |
1592 | 1601 |
1593 void LayerTreeHostImpl::ReleaseTreeResources() { | 1602 void LayerTreeHostImpl::ReleaseTreeResources() { |
1594 if (active_tree_->root_layer()) | 1603 if (active_tree_->root_layer()) |
1595 SendReleaseResourcesRecursive(active_tree_->root_layer()); | 1604 SendReleaseResourcesRecursive(active_tree_->root_layer()); |
1596 if (pending_tree_ && pending_tree_->root_layer()) | 1605 if (pending_tree_ && pending_tree_->root_layer()) |
1597 SendReleaseResourcesRecursive(pending_tree_->root_layer()); | 1606 SendReleaseResourcesRecursive(pending_tree_->root_layer()); |
1598 if (recycle_tree_ && recycle_tree_->root_layer()) | 1607 if (recycle_tree_ && recycle_tree_->root_layer()) |
1599 SendReleaseResourcesRecursive(recycle_tree_->root_layer()); | 1608 SendReleaseResourcesRecursive(recycle_tree_->root_layer()); |
1600 | 1609 |
1601 DeleteAllUIResources(); | 1610 EvictAllUIResources(); |
1602 } | 1611 } |
1603 | 1612 |
1604 void LayerTreeHostImpl::CreateAndSetRenderer( | 1613 void LayerTreeHostImpl::CreateAndSetRenderer( |
1605 OutputSurface* output_surface, | 1614 OutputSurface* output_surface, |
1606 ResourceProvider* resource_provider, | 1615 ResourceProvider* resource_provider, |
1607 bool skip_gl_renderer) { | 1616 bool skip_gl_renderer) { |
1608 DCHECK(!renderer_); | 1617 DCHECK(!renderer_); |
1609 if (output_surface->capabilities().delegated_rendering) { | 1618 if (output_surface->capabilities().delegated_rendering) { |
1610 renderer_ = | 1619 renderer_ = |
1611 DelegatingRenderer::Create(this, output_surface, resource_provider); | 1620 DelegatingRenderer::Create(this, output_surface, resource_provider); |
(...skipping 1009 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2621 resource_provider_->best_texture_format(), | 2630 resource_provider_->best_texture_format(), |
2622 wrap_mode, | 2631 wrap_mode, |
2623 ResourceProvider::TextureUsageAny); | 2632 ResourceProvider::TextureUsageAny); |
2624 | 2633 |
2625 ui_resource_map_[uid] = id; | 2634 ui_resource_map_[uid] = id; |
2626 resource_provider_->SetPixels(id, | 2635 resource_provider_->SetPixels(id, |
2627 reinterpret_cast<uint8_t*>(bitmap->GetPixels()), | 2636 reinterpret_cast<uint8_t*>(bitmap->GetPixels()), |
2628 gfx::Rect(bitmap->GetSize()), | 2637 gfx::Rect(bitmap->GetSize()), |
2629 gfx::Rect(bitmap->GetSize()), | 2638 gfx::Rect(bitmap->GetSize()), |
2630 gfx::Vector2d(0, 0)); | 2639 gfx::Vector2d(0, 0)); |
| 2640 MarkUIResourceNotEvicted(uid); |
2631 } | 2641 } |
2632 | 2642 |
2633 void LayerTreeHostImpl::DeleteUIResource(UIResourceId uid) { | 2643 void LayerTreeHostImpl::DeleteUIResource(UIResourceId uid) { |
2634 ResourceProvider::ResourceId id = ResourceIdForUIResource(uid); | 2644 ResourceProvider::ResourceId id = ResourceIdForUIResource(uid); |
2635 if (id) { | 2645 if (id) { |
2636 resource_provider_->DeleteResource(id); | 2646 resource_provider_->DeleteResource(id); |
2637 ui_resource_map_.erase(uid); | 2647 ui_resource_map_.erase(uid); |
2638 } | 2648 } |
| 2649 MarkUIResourceNotEvicted(uid); |
2639 } | 2650 } |
2640 | 2651 |
2641 void LayerTreeHostImpl::DeleteAllUIResources() { | 2652 void LayerTreeHostImpl::EvictAllUIResources() { |
| 2653 if (ui_resource_map_.empty()) |
| 2654 return; |
| 2655 |
2642 for (UIResourceMap::const_iterator iter = ui_resource_map_.begin(); | 2656 for (UIResourceMap::const_iterator iter = ui_resource_map_.begin(); |
2643 iter != ui_resource_map_.end(); | 2657 iter != ui_resource_map_.end(); |
2644 ++iter) { | 2658 ++iter) { |
| 2659 evicted_ui_resources_.insert(iter->first); |
2645 resource_provider_->DeleteResource(iter->second); | 2660 resource_provider_->DeleteResource(iter->second); |
2646 } | 2661 } |
2647 ui_resource_map_.clear(); | 2662 ui_resource_map_.clear(); |
| 2663 |
| 2664 client_->SetNeedsCommitOnImplThread(); |
| 2665 client_->OnCanDrawStateChanged(CanDraw()); |
| 2666 client_->RenewTreePriority(); |
2648 } | 2667 } |
2649 | 2668 |
2650 ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource( | 2669 ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource( |
2651 UIResourceId uid) const { | 2670 UIResourceId uid) const { |
2652 UIResourceMap::const_iterator iter = ui_resource_map_.find(uid); | 2671 UIResourceMap::const_iterator iter = ui_resource_map_.find(uid); |
2653 if (iter != ui_resource_map_.end()) | 2672 if (iter != ui_resource_map_.end()) |
2654 return iter->second; | 2673 return iter->second; |
2655 return 0; | 2674 return 0; |
2656 } | 2675 } |
2657 | 2676 |
| 2677 bool LayerTreeHostImpl::EvictedUIResourcesExist() const { |
| 2678 return !evicted_ui_resources_.empty(); |
| 2679 } |
| 2680 |
| 2681 void LayerTreeHostImpl::MarkUIResourceNotEvicted(UIResourceId uid) { |
| 2682 std::set<UIResourceId>::iterator found_in_evicted = |
| 2683 evicted_ui_resources_.find(uid); |
| 2684 if (found_in_evicted == evicted_ui_resources_.end()) |
| 2685 return; |
| 2686 evicted_ui_resources_.erase(found_in_evicted); |
| 2687 if (evicted_ui_resources_.empty()) |
| 2688 client_->OnCanDrawStateChanged(CanDraw()); |
| 2689 } |
| 2690 |
2658 } // namespace cc | 2691 } // namespace cc |
OLD | NEW |