Chromium Code Reviews| Index: cc/trees/layer_tree_host.cc |
| =================================================================== |
| --- cc/trees/layer_tree_host.cc (revision 213649) |
| +++ cc/trees/layer_tree_host.cc (working copy) |
| @@ -78,7 +78,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 +355,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 +429,8 @@ |
| if (output_surface_lost_) |
| return; |
| + DidLoseUIResources(); |
| + |
| num_failed_recreate_attempts_ = 0; |
| output_surface_lost_ = true; |
| SetNeedsCommit(); |
| @@ -1024,7 +1036,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 +1092,77 @@ |
| } |
| } |
| +UIResourceId LayerTreeHost::CreateUIResource( |
| + const UIResourceCallback& bitmap_cb) { |
| + 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 = bitmap_cb.Run(resource_lost); |
| + ui_resource_request_queue_.push_back(request); |
| + ui_resource_client_map_[request.id] = bitmap_cb; |
| + 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.Run(resource_lost); |
| + ui_resource_request_queue_.push_back(request); |
| + } |
| +} |
| + |
| +void LayerTreeHost::DidLoseUIResources() { |
| + typedef base::hash_set<UIResourceId> UIResourceIdSet; |
| + UIResourceIdSet create_resource_set; |
| + UIResourceRequestQueue request_recovery_queue; |
| + |
| + for (UIResourceRequestQueue::iterator iter = |
| + ui_resource_request_queue_.begin(); |
| + iter != ui_resource_request_queue_.end(); |
| + iter++) { |
| + // Only add the create request if a delete has not been issued for the same |
| + // resource. If a delete has been issued, then this resource would not have |
| + // an entry in the map. |
| + if (iter->type == UIResourceCreate && |
|
aelias_OOO_until_Jul13
2013/07/25 23:59:45
I suggest removing this if() and just creating a "
powei
2013/07/26 23:07:27
Done.
|
| + ui_resource_client_map_.find(iter->id) != |
| + ui_resource_client_map_.end()) { |
| + create_resource_set.insert(iter->id); |
| + request_recovery_queue.push_back(*iter); |
| + } |
| + } |
| + |
| + ui_resource_request_queue_ = request_recovery_queue; |
|
aelias_OOO_until_Jul13
2013/07/25 23:59:45
I don't see the need for this assignment. It seem
powei
2013/07/26 23:07:27
Done.
|
| + |
| + // 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, then the original request will be |
| + // honored instead of treating it as resource lost. |
| + if (create_resource_set.find(iter->first) == create_resource_set.end()) |
| + UIResourceLost(iter->first); |
| + } |
| +} |
| + |
| } // namespace cc |