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

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 23548022: [cc] Evict UIResources when the renderer is not visible (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix typos Created 7 years, 3 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
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698