| 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 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 328 "cc", "LayerTreeHostImpl::CanDraw viewport size recently changed", | 328 "cc", "LayerTreeHostImpl::CanDraw viewport size recently changed", |
| 329 TRACE_EVENT_SCOPE_THREAD); | 329 TRACE_EVENT_SCOPE_THREAD); |
| 330 return false; | 330 return false; |
| 331 } | 331 } |
| 332 if (active_tree_->ContentsTexturesPurged()) { | 332 if (active_tree_->ContentsTexturesPurged()) { |
| 333 TRACE_EVENT_INSTANT0( | 333 TRACE_EVENT_INSTANT0( |
| 334 "cc", "LayerTreeHostImpl::CanDraw contents textures purged", | 334 "cc", "LayerTreeHostImpl::CanDraw contents textures purged", |
| 335 TRACE_EVENT_SCOPE_THREAD); | 335 TRACE_EVENT_SCOPE_THREAD); |
| 336 return false; | 336 return false; |
| 337 } | 337 } |
| 338 if (EvictedUIResourcesExist()) { |
| 339 TRACE_EVENT_INSTANT0( |
| 340 "cc", "LayerTreeHostImpl::CanDraw UI resources evicted not recreated", |
| 341 TRACE_EVENT_SCOPE_THREAD); |
| 342 return false; |
| 343 } |
| 338 return true; | 344 return true; |
| 339 } | 345 } |
| 340 | 346 |
| 341 void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time, | 347 void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time, |
| 342 base::Time wall_clock_time) { | 348 base::Time wall_clock_time) { |
| 343 if (input_handler_client_) | 349 if (input_handler_client_) |
| 344 input_handler_client_->Animate(monotonic_time); | 350 input_handler_client_->Animate(monotonic_time); |
| 345 AnimatePageScale(monotonic_time); | 351 AnimatePageScale(monotonic_time); |
| 346 AnimateLayers(monotonic_time, wall_clock_time); | 352 AnimateLayers(monotonic_time, wall_clock_time); |
| 347 AnimateScrollbars(monotonic_time); | 353 AnimateScrollbars(monotonic_time); |
| (...skipping 1208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1556 | 1562 |
| 1557 void LayerTreeHostImpl::SetVisible(bool visible) { | 1563 void LayerTreeHostImpl::SetVisible(bool visible) { |
| 1558 DCHECK(proxy_->IsImplThread()); | 1564 DCHECK(proxy_->IsImplThread()); |
| 1559 | 1565 |
| 1560 if (visible_ == visible) | 1566 if (visible_ == visible) |
| 1561 return; | 1567 return; |
| 1562 visible_ = visible; | 1568 visible_ = visible; |
| 1563 DidVisibilityChange(this, visible_); | 1569 DidVisibilityChange(this, visible_); |
| 1564 EnforceManagedMemoryPolicy(ActualManagedMemoryPolicy()); | 1570 EnforceManagedMemoryPolicy(ActualManagedMemoryPolicy()); |
| 1565 | 1571 |
| 1572 if (!visible_) |
| 1573 EvictAllUIResources(); |
| 1574 |
| 1566 // Evict tiles immediately if invisible since this tab may never get another | 1575 // Evict tiles immediately if invisible since this tab may never get another |
| 1567 // draw or timer tick. | 1576 // draw or timer tick. |
| 1568 if (!visible_) | 1577 if (!visible_) |
| 1569 ManageTiles(); | 1578 ManageTiles(); |
| 1570 | 1579 |
| 1571 if (!renderer_) | 1580 if (!renderer_) |
| 1572 return; | 1581 return; |
| 1573 | 1582 |
| 1574 renderer_->SetVisible(visible); | 1583 renderer_->SetVisible(visible); |
| 1575 } | 1584 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1596 } | 1605 } |
| 1597 | 1606 |
| 1598 void LayerTreeHostImpl::ReleaseTreeResources() { | 1607 void LayerTreeHostImpl::ReleaseTreeResources() { |
| 1599 if (active_tree_->root_layer()) | 1608 if (active_tree_->root_layer()) |
| 1600 SendReleaseResourcesRecursive(active_tree_->root_layer()); | 1609 SendReleaseResourcesRecursive(active_tree_->root_layer()); |
| 1601 if (pending_tree_ && pending_tree_->root_layer()) | 1610 if (pending_tree_ && pending_tree_->root_layer()) |
| 1602 SendReleaseResourcesRecursive(pending_tree_->root_layer()); | 1611 SendReleaseResourcesRecursive(pending_tree_->root_layer()); |
| 1603 if (recycle_tree_ && recycle_tree_->root_layer()) | 1612 if (recycle_tree_ && recycle_tree_->root_layer()) |
| 1604 SendReleaseResourcesRecursive(recycle_tree_->root_layer()); | 1613 SendReleaseResourcesRecursive(recycle_tree_->root_layer()); |
| 1605 | 1614 |
| 1606 DeleteAllUIResources(); | 1615 EvictAllUIResources(); |
| 1607 } | 1616 } |
| 1608 | 1617 |
| 1609 void LayerTreeHostImpl::CreateAndSetRenderer( | 1618 void LayerTreeHostImpl::CreateAndSetRenderer( |
| 1610 OutputSurface* output_surface, | 1619 OutputSurface* output_surface, |
| 1611 ResourceProvider* resource_provider, | 1620 ResourceProvider* resource_provider, |
| 1612 bool skip_gl_renderer) { | 1621 bool skip_gl_renderer) { |
| 1613 DCHECK(!renderer_); | 1622 DCHECK(!renderer_); |
| 1614 if (output_surface->capabilities().delegated_rendering) { | 1623 if (output_surface->capabilities().delegated_rendering) { |
| 1615 renderer_ = DelegatingRenderer::Create( | 1624 renderer_ = DelegatingRenderer::Create( |
| 1616 this, &settings_, output_surface, resource_provider); | 1625 this, &settings_, output_surface, resource_provider); |
| (...skipping 1017 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2634 resource_provider_->best_texture_format(), | 2643 resource_provider_->best_texture_format(), |
| 2635 wrap_mode, | 2644 wrap_mode, |
| 2636 ResourceProvider::TextureUsageAny); | 2645 ResourceProvider::TextureUsageAny); |
| 2637 | 2646 |
| 2638 ui_resource_map_[uid] = id; | 2647 ui_resource_map_[uid] = id; |
| 2639 resource_provider_->SetPixels(id, | 2648 resource_provider_->SetPixels(id, |
| 2640 reinterpret_cast<uint8_t*>(bitmap->GetPixels()), | 2649 reinterpret_cast<uint8_t*>(bitmap->GetPixels()), |
| 2641 gfx::Rect(bitmap->GetSize()), | 2650 gfx::Rect(bitmap->GetSize()), |
| 2642 gfx::Rect(bitmap->GetSize()), | 2651 gfx::Rect(bitmap->GetSize()), |
| 2643 gfx::Vector2d(0, 0)); | 2652 gfx::Vector2d(0, 0)); |
| 2653 MarkUIResourceNotEvicted(uid); |
| 2644 } | 2654 } |
| 2645 | 2655 |
| 2646 void LayerTreeHostImpl::DeleteUIResource(UIResourceId uid) { | 2656 void LayerTreeHostImpl::DeleteUIResource(UIResourceId uid) { |
| 2647 ResourceProvider::ResourceId id = ResourceIdForUIResource(uid); | 2657 ResourceProvider::ResourceId id = ResourceIdForUIResource(uid); |
| 2648 if (id) { | 2658 if (id) { |
| 2649 resource_provider_->DeleteResource(id); | 2659 resource_provider_->DeleteResource(id); |
| 2650 ui_resource_map_.erase(uid); | 2660 ui_resource_map_.erase(uid); |
| 2651 } | 2661 } |
| 2662 MarkUIResourceNotEvicted(uid); |
| 2652 } | 2663 } |
| 2653 | 2664 |
| 2654 void LayerTreeHostImpl::DeleteAllUIResources() { | 2665 void LayerTreeHostImpl::EvictAllUIResources() { |
| 2666 if (ui_resource_map_.empty()) |
| 2667 return; |
| 2668 |
| 2655 for (UIResourceMap::const_iterator iter = ui_resource_map_.begin(); | 2669 for (UIResourceMap::const_iterator iter = ui_resource_map_.begin(); |
| 2656 iter != ui_resource_map_.end(); | 2670 iter != ui_resource_map_.end(); |
| 2657 ++iter) { | 2671 ++iter) { |
| 2672 evicted_ui_resources_.insert(iter->first); |
| 2658 resource_provider_->DeleteResource(iter->second); | 2673 resource_provider_->DeleteResource(iter->second); |
| 2659 } | 2674 } |
| 2660 ui_resource_map_.clear(); | 2675 ui_resource_map_.clear(); |
| 2676 |
| 2677 client_->SetNeedsCommitOnImplThread(); |
| 2678 client_->OnCanDrawStateChanged(CanDraw()); |
| 2679 client_->RenewTreePriority(); |
| 2661 } | 2680 } |
| 2662 | 2681 |
| 2663 ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource( | 2682 ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource( |
| 2664 UIResourceId uid) const { | 2683 UIResourceId uid) const { |
| 2665 UIResourceMap::const_iterator iter = ui_resource_map_.find(uid); | 2684 UIResourceMap::const_iterator iter = ui_resource_map_.find(uid); |
| 2666 if (iter != ui_resource_map_.end()) | 2685 if (iter != ui_resource_map_.end()) |
| 2667 return iter->second; | 2686 return iter->second; |
| 2668 return 0; | 2687 return 0; |
| 2669 } | 2688 } |
| 2670 | 2689 |
| 2690 bool LayerTreeHostImpl::EvictedUIResourcesExist() const { |
| 2691 return !evicted_ui_resources_.empty(); |
| 2692 } |
| 2693 |
| 2694 void LayerTreeHostImpl::MarkUIResourceNotEvicted(UIResourceId uid) { |
| 2695 std::set<UIResourceId>::iterator found_in_evicted = |
| 2696 evicted_ui_resources_.find(uid); |
| 2697 if (found_in_evicted == evicted_ui_resources_.end()) |
| 2698 return; |
| 2699 evicted_ui_resources_.erase(found_in_evicted); |
| 2700 if (evicted_ui_resources_.empty()) |
| 2701 client_->OnCanDrawStateChanged(CanDraw()); |
| 2702 } |
| 2703 |
| 2671 } // namespace cc | 2704 } // namespace cc |
| OLD | NEW |