| Index: cc/trees/layer_tree_host_impl.cc
|
| diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
|
| index 1131050dc695a131dfee529af78852843b05ae7e..2763d33fbde49550b1dcc0cdb60f78e165ccbd13 100644
|
| --- a/cc/trees/layer_tree_host_impl.cc
|
| +++ b/cc/trees/layer_tree_host_impl.cc
|
| @@ -200,7 +200,8 @@ LayerTreeHostImpl::LayerTreeHostImpl(
|
| external_stencil_test_enabled_(false),
|
| animation_registrar_(AnimationRegistrar::Create()),
|
| rendering_stats_instrumentation_(rendering_stats_instrumentation),
|
| - need_to_update_visible_tiles_before_draw_(false) {
|
| + need_to_update_visible_tiles_before_draw_(false),
|
| + ui_resources_evicted_(false) {
|
| DCHECK(proxy_->IsImplThread());
|
| DidVisibilityChange(this, visible_);
|
|
|
| @@ -305,6 +306,14 @@ bool LayerTreeHostImpl::CanDraw() const {
|
| TRACE_EVENT_SCOPE_THREAD);
|
| return false;
|
| }
|
| +
|
| + if (ui_resources_evicted_) {
|
| + TRACE_EVENT_INSTANT0(
|
| + "cc", "LayerTreeHostImpl::CanDraw ui resources evicted",
|
| + TRACE_EVENT_SCOPE_THREAD);
|
| + return false;
|
| + }
|
| +
|
| return true;
|
| }
|
|
|
| @@ -1536,11 +1545,16 @@ void LayerTreeHostImpl::SetVisible(bool visible) {
|
| DidVisibilityChange(this, visible_);
|
| EnforceManagedMemoryPolicy(ActualManagedMemoryPolicy());
|
|
|
| - // Evict tiles immediately if invisible since this tab may never get another
|
| - // draw or timer tick.
|
| - if (!visible_)
|
| + if (!visible_) {
|
| + // Evict tiles immediately if invisible since this tab may never get another
|
| + // draw or timer tick.
|
| ManageTiles();
|
|
|
| + // Evict UI resources
|
| + ui_resources_evicted_ = ui_resource_map_.size() > 0;
|
| + ReleaseUIResources();
|
| + }
|
| +
|
| if (!renderer_)
|
| return;
|
|
|
| @@ -1576,8 +1590,7 @@ void LayerTreeHostImpl::ReleaseTreeResources() {
|
| if (recycle_tree_ && recycle_tree_->root_layer())
|
| SendReleaseResourcesRecursive(recycle_tree_->root_layer());
|
|
|
| - // Remove all existing maps from UIResourceId to ResourceId.
|
| - ui_resource_map_.clear();
|
| + ReleaseUIResources();
|
| }
|
|
|
| void LayerTreeHostImpl::CreateAndSetRenderer(
|
| @@ -2530,6 +2543,11 @@ void LayerTreeHostImpl::CreateUIResource(
|
| gfx::Rect(bitmap->GetSize()),
|
| gfx::Rect(bitmap->GetSize()),
|
| gfx::Vector2d(0, 0));
|
| +
|
| + // Once any UI resource creation has been completed, we can assume that the
|
| + // evicted UI resources will have been recovered by the time CanDraw is
|
| + // checked.
|
| + ui_resources_evicted_ = false;
|
| }
|
|
|
| void LayerTreeHostImpl::DeleteUIResource(UIResourceId uid) {
|
| @@ -2548,4 +2566,13 @@ ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource(
|
| return 0;
|
| }
|
|
|
| +void LayerTreeHostImpl::ReleaseUIResources() {
|
| + for (UIResourceMap::const_iterator iter = ui_resource_map_.begin();
|
| + iter != ui_resource_map_.end();
|
| + ++iter) {
|
| + resource_provider_->DeleteResource(iter->second);
|
| + }
|
| + ui_resource_map_.clear();
|
| +}
|
| +
|
| } // namespace cc
|
|
|