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

Unified Diff: cc/trees/layer_tree_host.cc

Issue 18191020: UI Resource Manager (Closed) Base URL: https://src.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: cc/trees/layer_tree_host.cc
===================================================================
--- cc/trees/layer_tree_host.cc (revision 214760)
+++ cc/trees/layer_tree_host.cc (working copy)
@@ -29,6 +29,7 @@
#include "cc/layers/render_surface.h"
#include "cc/layers/scrollbar_layer.h"
#include "cc/resources/prioritized_resource_manager.h"
+#include "cc/resources/ui_resource_client.h"
#include "cc/trees/layer_tree_host_client.h"
#include "cc/trees/layer_tree_host_common.h"
#include "cc/trees/layer_tree_host_impl.h"
@@ -59,6 +60,11 @@
RendererCapabilities::~RendererCapabilities() {}
+UIResourceRequest::UIResourceRequest()
+ : type(UIResourceInvalidRequest), id(0), bitmap(NULL) {}
+
+UIResourceRequest::~UIResourceRequest() {}
+
bool LayerTreeHost::AnyLayerTreeHostInstanceExists() {
return s_num_layer_tree_instances > 0;
}
@@ -78,7 +84,8 @@
LayerTreeHost::LayerTreeHost(LayerTreeHostClient* client,
const LayerTreeSettings& settings)
- : animating_(false),
+ : next_ui_resource_id_(1),
+ animating_(false),
needs_full_tree_sync_(true),
needs_filter_context_(false),
client_(client),
@@ -354,6 +361,15 @@
pending_page_scale_animation_.reset();
}
+ if (!ui_resource_request_queue_.empty()) {
+ sync_tree->set_ui_resource_request_queue(ui_resource_request_queue_);
+ ui_resource_request_queue_.clear();
+ // Process any ui resource requests in the queue. For impl-side-painting,
+ // the queue is processed in LayerTreeHostImpl::ActivatePendingTree.
+ if (!settings_.impl_side_painting)
+ sync_tree->ProcessUIResourceRequestQueue();
+ }
+
DCHECK(!sync_tree->ViewportSizeInvalid());
if (new_impl_tree_has_no_evicted_resources) {
@@ -419,6 +435,8 @@
if (output_surface_lost_)
return;
+ DidLoseUIResources();
+
num_failed_recreate_attempts_ = 0;
output_surface_lost_ = true;
SetNeedsCommit();
@@ -1046,7 +1064,7 @@
}
void LayerTreeHost::SetDeviceScaleFactor(float device_scale_factor) {
- if (device_scale_factor == device_scale_factor_)
+ if (device_scale_factor == device_scale_factor_)
return;
device_scale_factor_ = device_scale_factor;
@@ -1102,4 +1120,68 @@
}
}
+UIResourceId LayerTreeHost::CreateUIResource(UIResourceClient* client) {
+ DCHECK(client);
+
+ UIResourceRequest request;
+ bool resource_lost = false;
+ request.type = UIResourceCreate;
+ request.id = next_ui_resource_id_++;
+
+ DCHECK(ui_resource_client_map_.find(request.id) ==
+ ui_resource_client_map_.end());
+
+ request.bitmap = client->GetBitmap(request.id, resource_lost);
+ ui_resource_request_queue_.push_back(request);
+ ui_resource_client_map_[request.id] = client;
+ return request.id;
+}
+
+// Deletes a UI resource. May safely be called more than once.
+void LayerTreeHost::DeleteUIResource(UIResourceId uid) {
+ UIResourceClientMap::iterator iter = ui_resource_client_map_.find(uid);
+ if (iter != ui_resource_client_map_.end()) {
enne (OOO) 2013/07/31 22:02:40 style nit: make this an early return rather than a
powei 2013/08/01 00:05:10 Done.
+ UIResourceRequest request;
+ request.type = UIResourceDelete;
+ request.id = uid;
+ ui_resource_request_queue_.push_back(request);
+ ui_resource_client_map_.erase(uid);
+ }
+}
+
+void LayerTreeHost::UIResourceLost(UIResourceId uid) {
+ UIResourceClientMap::iterator iter = ui_resource_client_map_.find(uid);
+ if (iter != ui_resource_client_map_.end()) {
+ UIResourceRequest request;
+ bool resource_lost = true;
+ request.type = UIResourceCreate;
+ request.id = uid;
+ request.bitmap = iter->second->GetBitmap(uid, resource_lost);
+ DCHECK(request.bitmap.get());
+ ui_resource_request_queue_.push_back(request);
+ }
+}
+
+void LayerTreeHost::DidLoseUIResources() {
+ typedef base::hash_set<UIResourceId> UIResourceIdSet;
+ UIResourceIdSet request_set;
aelias_OOO_until_Jul13 2013/07/31 21:00:30 Is this needed anymore? For simplicity, can we ju
powei 2013/07/31 21:29:39 If a user has created a resource, but the context
aelias_OOO_until_Jul13 2013/07/31 21:56:51 It doesn't matter much as long as we don't crash,
powei 2013/08/01 00:05:10 Done.
+
+ for (UIResourceRequestQueue::iterator iter =
+ ui_resource_request_queue_.begin();
+ iter != ui_resource_request_queue_.end();
+ ++iter) {
+ request_set.insert(iter->id);
+ }
+
+ // When output surface is lost, we need to recreate the resource.
+ for (UIResourceClientMap::iterator iter = ui_resource_client_map_.begin();
+ iter != ui_resource_client_map_.end();
+ ++iter) {
+ // If the resource was to be created/deleted, then the original request will
+ // be honored instead of treating it as resource lost.
+ if (request_set.find(iter->first) == request_set.end())
+ UIResourceLost(iter->first);
+ }
+}
+
} // namespace cc

Powered by Google App Engine
This is Rietveld 408576698