Index: cc/trees/layer_tree_host.cc |
=================================================================== |
--- cc/trees/layer_tree_host.cc (revision 213649) |
+++ 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" |
@@ -78,7 +79,8 @@ |
LayerTreeHost::LayerTreeHost(LayerTreeHostClient* client, |
const LayerTreeSettings& settings) |
- : animating_(false), |
+ : ui_resource_id_(1), |
+ animating_(false), |
needs_full_tree_sync_(true), |
needs_filter_context_(false), |
client_(client), |
@@ -354,6 +356,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 +430,8 @@ |
if (output_surface_lost_) |
return; |
+ DidLoseUIResources(); |
+ |
num_failed_recreate_attempts_ = 0; |
output_surface_lost_ = true; |
SetNeedsCommit(); |
@@ -1024,7 +1037,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; |
@@ -1080,4 +1093,67 @@ |
} |
} |
+UIResourceId LayerTreeHost::CreateUIResource(UIResourceClient* client) { |
+ DCHECK(client); |
+ |
+ UIResourceRequest request; |
+ bool resource_lost = false; |
+ request.type = UIResourceCreate; |
+ request.id = ui_resource_id_++; |
+ |
+ DCHECK(ui_resource_client_map_.find(request.id) == |
+ ui_resource_client_map_.end()); |
+ |
+ request.bitmap = client->Create(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()) { |
+ 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->Create(resource_lost); |
aelias_OOO_until_Jul13
2013/07/26 23:35:32
Please add DCHECK(request.bitmap.get()) as we don'
powei
2013/07/30 21:47:00
Done.
|
+ ui_resource_request_queue_.push_back(request); |
+ } |
+} |
+ |
+void LayerTreeHost::DidLoseUIResources() { |
+ typedef base::hash_set<UIResourceId> UIResourceIdSet; |
+ UIResourceIdSet request_set; |
+ |
+ for (UIResourceRequestQueue::iterator iter = |
+ ui_resource_request_queue_.begin(); |
+ iter != ui_resource_request_queue_.end(); |
+ iter++) { |
aelias_OOO_until_Jul13
2013/07/26 23:35:32
nit: ++iter (as least in the past this compiled to
powei
2013/07/30 21:47:00
Done.
|
+ 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++) { |
aelias_OOO_until_Jul13
2013/07/26 23:35:32
nit: ++iter
powei
2013/07/30 21:47:00
Done.
|
+ // 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 |