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

Side by Side Diff: cc/trees/layer_tree_host.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 names 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.h" 5 #include "cc/trees/layer_tree_host.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <stack> 8 #include <stack>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 using_offscreen_context3d(false), 55 using_offscreen_context3d(false),
56 max_texture_size(0), 56 max_texture_size(0),
57 avoid_pow2_textures(false), 57 avoid_pow2_textures(false),
58 using_map_image(false), 58 using_map_image(false),
59 using_shared_memory_resources(false), 59 using_shared_memory_resources(false),
60 using_discard_framebuffer(false) {} 60 using_discard_framebuffer(false) {}
61 61
62 RendererCapabilities::~RendererCapabilities() {} 62 RendererCapabilities::~RendererCapabilities() {}
63 63
64 UIResourceRequest::UIResourceRequest() 64 UIResourceRequest::UIResourceRequest()
65 : type(UIResourceInvalidRequest), id(0), bitmap(NULL) {} 65 : type(UIResourceInvalidRequest),
66 id(0),
67 bitmap(NULL),
68 eviction_count_recreated(0) {}
66 69
67 UIResourceRequest::~UIResourceRequest() {} 70 UIResourceRequest::~UIResourceRequest() {}
68 71
69 bool LayerTreeHost::AnyLayerTreeHostInstanceExists() { 72 bool LayerTreeHost::AnyLayerTreeHostInstanceExists() {
70 return s_num_layer_tree_instances > 0; 73 return s_num_layer_tree_instances > 0;
71 } 74 }
72 75
73 scoped_ptr<LayerTreeHost> LayerTreeHost::Create( 76 scoped_ptr<LayerTreeHost> LayerTreeHost::Create(
74 LayerTreeHostClient* client, 77 LayerTreeHostClient* client,
75 const LayerTreeSettings& settings, 78 const LayerTreeSettings& settings,
76 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) { 79 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) {
77 scoped_ptr<LayerTreeHost> layer_tree_host(new LayerTreeHost(client, 80 scoped_ptr<LayerTreeHost> layer_tree_host(new LayerTreeHost(client,
78 settings)); 81 settings));
79 if (!layer_tree_host->Initialize(impl_task_runner)) 82 if (!layer_tree_host->Initialize(impl_task_runner))
80 return scoped_ptr<LayerTreeHost>(); 83 return scoped_ptr<LayerTreeHost>();
81 return layer_tree_host.Pass(); 84 return layer_tree_host.Pass();
82 } 85 }
83 86
84 static int s_next_tree_id = 1; 87 static int s_next_tree_id = 1;
85 88
86 LayerTreeHost::LayerTreeHost(LayerTreeHostClient* client, 89 LayerTreeHost::LayerTreeHost(LayerTreeHostClient* client,
87 const LayerTreeSettings& settings) 90 const LayerTreeSettings& settings)
88 : next_ui_resource_id_(1), 91 : next_ui_resource_id_(1),
92 ui_resource_eviction_count_recreated_(0),
89 animating_(false), 93 animating_(false),
90 needs_full_tree_sync_(true), 94 needs_full_tree_sync_(true),
91 needs_filter_context_(false), 95 needs_filter_context_(false),
92 client_(client), 96 client_(client),
93 source_frame_number_(0), 97 source_frame_number_(0),
94 rendering_stats_instrumentation_(RenderingStatsInstrumentation::Create()), 98 rendering_stats_instrumentation_(RenderingStatsInstrumentation::Create()),
95 output_surface_can_be_initialized_(true), 99 output_surface_can_be_initialized_(true),
96 output_surface_lost_(true), 100 output_surface_lost_(true),
97 num_failed_recreate_attempts_(0), 101 num_failed_recreate_attempts_(0),
98 settings_(settings), 102 settings_(settings),
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 // the queue is processed in LayerTreeHostImpl::ActivatePendingTree. 376 // the queue is processed in LayerTreeHostImpl::ActivatePendingTree.
373 if (!settings_.impl_side_painting) 377 if (!settings_.impl_side_painting)
374 sync_tree->ProcessUIResourceRequestQueue(); 378 sync_tree->ProcessUIResourceRequestQueue();
375 } 379 }
376 if (overhang_ui_resource_) { 380 if (overhang_ui_resource_) {
377 host_impl->SetOverhangUIResource( 381 host_impl->SetOverhangUIResource(
378 overhang_ui_resource_->id(), 382 overhang_ui_resource_->id(),
379 overhang_ui_resource_->GetSize()); 383 overhang_ui_resource_->GetSize());
380 } 384 }
381 385
386 // If all UI resource evictions will not be recreated by this commit, then
387 // another commit is required.
388 if (ui_resource_eviction_count_recreated_ !=
389 host_impl->ui_resource_eviction_count()) {
390 host_impl->SetNeedsCommit();
391 }
392
382 DCHECK(!sync_tree->ViewportSizeInvalid()); 393 DCHECK(!sync_tree->ViewportSizeInvalid());
383 394
384 if (new_impl_tree_has_no_evicted_resources) { 395 if (new_impl_tree_has_no_evicted_resources) {
385 if (sync_tree->ContentsTexturesPurged()) 396 if (sync_tree->ContentsTexturesPurged())
386 sync_tree->ResetContentsTexturesPurged(); 397 sync_tree->ResetContentsTexturesPurged();
387 } 398 }
388 399
389 if (!settings_.impl_side_painting) { 400 if (!settings_.impl_side_painting) {
390 // If we're not in impl-side painting, the tree is immediately 401 // If we're not in impl-side painting, the tree is immediately
391 // considered active. 402 // considered active.
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 return host_impl.Pass(); 448 return host_impl.Pass();
438 } 449 }
439 450
440 void LayerTreeHost::DidLoseOutputSurface() { 451 void LayerTreeHost::DidLoseOutputSurface() {
441 TRACE_EVENT0("cc", "LayerTreeHost::DidLoseOutputSurface"); 452 TRACE_EVENT0("cc", "LayerTreeHost::DidLoseOutputSurface");
442 DCHECK(proxy_->IsMainThread()); 453 DCHECK(proxy_->IsMainThread());
443 454
444 if (output_surface_lost_) 455 if (output_surface_lost_)
445 return; 456 return;
446 457
447 bool resource_lost = true;
448 RecreateUIResources(resource_lost);
449
450 num_failed_recreate_attempts_ = 0; 458 num_failed_recreate_attempts_ = 0;
451 output_surface_lost_ = true; 459 output_surface_lost_ = true;
452 SetNeedsCommit(); 460 SetNeedsCommit();
453 } 461 }
454 462
455 bool LayerTreeHost::CompositeAndReadback(void* pixels, 463 bool LayerTreeHost::CompositeAndReadback(void* pixels,
456 gfx::Rect rect_in_device_viewport) { 464 gfx::Rect rect_in_device_viewport) {
457 trigger_idle_updates_ = false; 465 trigger_idle_updates_ = false;
458 bool ret = proxy_->CompositeAndReadback(pixels, rect_in_device_viewport); 466 bool ret = proxy_->CompositeAndReadback(pixels, rect_in_device_viewport);
459 trigger_idle_updates_ = true; 467 trigger_idle_updates_ = true;
(...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after
1169 if (iter == ui_resource_client_map_.end()) 1177 if (iter == ui_resource_client_map_.end())
1170 return; 1178 return;
1171 1179
1172 UIResourceRequest request; 1180 UIResourceRequest request;
1173 request.type = UIResourceRequest::UIResourceDelete; 1181 request.type = UIResourceRequest::UIResourceDelete;
1174 request.id = uid; 1182 request.id = uid;
1175 ui_resource_request_queue_.push_back(request); 1183 ui_resource_request_queue_.push_back(request);
1176 ui_resource_client_map_.erase(uid); 1184 ui_resource_client_map_.erase(uid);
1177 } 1185 }
1178 1186
1179 void LayerTreeHost::RecreateUIResources(bool resource_lost) { 1187 bool LayerTreeHost::SetUIResourceEvictionCount(
1188 uint64 ui_resource_eviction_count) {
1189 if (ui_resource_eviction_count_recreated_ == ui_resource_eviction_count)
1190 return false;
1191
1180 for (UIResourceClientMap::iterator iter = ui_resource_client_map_.begin(); 1192 for (UIResourceClientMap::iterator iter = ui_resource_client_map_.begin();
1181 iter != ui_resource_client_map_.end(); 1193 iter != ui_resource_client_map_.end();
1182 ++iter) { 1194 ++iter) {
1183 UIResourceId uid = iter->first; 1195 UIResourceId uid = iter->first;
1184 UIResourceRequest request; 1196 UIResourceRequest request;
1185 request.type = UIResourceRequest::UIResourceCreate; 1197 request.type = UIResourceRequest::UIResourceCreate;
1186 request.id = uid; 1198 request.id = uid;
1199 bool resource_lost = true;
1187 request.bitmap = iter->second->GetBitmap(uid, resource_lost); 1200 request.bitmap = iter->second->GetBitmap(uid, resource_lost);
1188 DCHECK(request.bitmap.get()); 1201 DCHECK(request.bitmap.get());
1189 ui_resource_request_queue_.push_back(request); 1202 ui_resource_request_queue_.push_back(request);
1190 } 1203 }
1204 UIResourceRequest request;
1205 request.type = UIResourceRequest::UIResourceEvictionRecreated;
1206 request.eviction_count_recreated = ui_resource_eviction_count;
1207 ui_resource_request_queue_.push_back(request);
1208 ui_resource_eviction_count_recreated_ = ui_resource_eviction_count;
1209
1210 return true;
1191 } 1211 }
1192 1212
1193 } // namespace cc 1213 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698