| Index: cc/trees/layer_tree_host.cc
|
| ===================================================================
|
| --- cc/trees/layer_tree_host.cc (revision 214824)
|
| +++ 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();
|
| @@ -1050,7 +1068,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;
|
|
|
| @@ -1106,4 +1124,57 @@
|
| }
|
| }
|
|
|
| +UIResourceId LayerTreeHost::CreateUIResource(UIResourceClient* client) {
|
| + DCHECK(client);
|
| +
|
| + UIResourceRequest request;
|
| + bool resource_lost = false;
|
| + request.type = UIResourceRequest::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())
|
| + return;
|
| +
|
| + UIResourceRequest request;
|
| + request.type = UIResourceRequest::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())
|
| + return;
|
| +
|
| + UIResourceRequest request;
|
| + bool resource_lost = true;
|
| + request.type = UIResourceRequest::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() {
|
| + // 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) {
|
| + UIResourceLost(iter->first);
|
| + }
|
| +}
|
| +
|
| } // namespace cc
|
|
|