| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/layers/delegated_renderer_layer_impl.h" | 5 #include "cc/layers/delegated_renderer_layer_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 bool DelegatedRendererLayerImpl::HasContributingDelegatedRenderPasses() const { | 40 bool DelegatedRendererLayerImpl::HasContributingDelegatedRenderPasses() const { |
| 41 // The root RenderPass for the layer is merged with its target | 41 // The root RenderPass for the layer is merged with its target |
| 42 // RenderPass in each frame. So we only have extra RenderPasses | 42 // RenderPass in each frame. So we only have extra RenderPasses |
| 43 // to merge when we have a non-root RenderPass present. | 43 // to merge when we have a non-root RenderPass present. |
| 44 return render_passes_in_draw_order_.size() > 1; | 44 return render_passes_in_draw_order_.size() > 1; |
| 45 } | 45 } |
| 46 | 46 |
| 47 static ResourceProvider::ResourceId ResourceRemapHelper( | 47 static ResourceProvider::ResourceId ResourceRemapHelper( |
| 48 bool* invalid_frame, | 48 bool* invalid_frame, |
| 49 const ResourceProvider::ResourceIdMap& child_to_parent_map, | 49 const ResourceProvider::ResourceIdMap& child_to_parent_map, |
| 50 ResourceProvider::ResourceIdSet *remapped_resources, | 50 ResourceProvider::ResourceIdArray* resources_in_frame, |
| 51 ResourceProvider::ResourceId id) { | 51 ResourceProvider::ResourceId id) { |
| 52 | 52 |
| 53 ResourceProvider::ResourceIdMap::const_iterator it = | 53 ResourceProvider::ResourceIdMap::const_iterator it = |
| 54 child_to_parent_map.find(id); | 54 child_to_parent_map.find(id); |
| 55 if (it == child_to_parent_map.end()) { | 55 if (it == child_to_parent_map.end()) { |
| 56 *invalid_frame = true; | 56 *invalid_frame = true; |
| 57 return 0; | 57 return 0; |
| 58 } | 58 } |
| 59 | 59 |
| 60 DCHECK_EQ(it->first, id); | 60 DCHECK_EQ(it->first, id); |
| 61 ResourceProvider::ResourceId remapped_id = it->second; | 61 ResourceProvider::ResourceId remapped_id = it->second; |
| 62 remapped_resources->insert(remapped_id); | 62 resources_in_frame->push_back(id); |
| 63 return remapped_id; | 63 return remapped_id; |
| 64 } | 64 } |
| 65 | 65 |
| 66 void DelegatedRendererLayerImpl::PushPropertiesTo(LayerImpl* layer) { | 66 void DelegatedRendererLayerImpl::PushPropertiesTo(LayerImpl* layer) { |
| 67 LayerImpl::PushPropertiesTo(layer); | 67 LayerImpl::PushPropertiesTo(layer); |
| 68 | 68 |
| 69 DelegatedRendererLayerImpl* delegated_layer = | 69 DelegatedRendererLayerImpl* delegated_layer = |
| 70 static_cast<DelegatedRendererLayerImpl*>(layer); | 70 static_cast<DelegatedRendererLayerImpl*>(layer); |
| 71 | 71 |
| 72 // If we have a new child_id to give to the active layer, it should | 72 // If we have a new child_id to give to the active layer, it should |
| 73 // have already deleted its old child_id. | 73 // have already deleted its old child_id. |
| 74 DCHECK(delegated_layer->child_id_ == 0 || | 74 DCHECK(delegated_layer->child_id_ == 0 || |
| 75 delegated_layer->child_id_ == child_id_); | 75 delegated_layer->child_id_ == child_id_); |
| 76 delegated_layer->child_id_ = child_id_; | 76 delegated_layer->child_id_ = child_id_; |
| 77 delegated_layer->own_child_id_ = true; | 77 delegated_layer->own_child_id_ = true; |
| 78 own_child_id_ = false; | 78 own_child_id_ = false; |
| 79 | 79 |
| 80 delegated_layer->SetDisplaySize(display_size_); | 80 delegated_layer->SetDisplaySize(display_size_); |
| 81 if (have_render_passes_to_push_) { | 81 if (have_render_passes_to_push_) { |
| 82 // This passes ownership of the render passes to the active tree. | 82 // This passes ownership of the render passes to the active tree. |
| 83 delegated_layer->SetRenderPasses(&render_passes_in_draw_order_); | 83 delegated_layer->SetRenderPasses(&render_passes_in_draw_order_); |
| 84 DCHECK(render_passes_in_draw_order_.empty()); | 84 DCHECK(render_passes_in_draw_order_.empty()); |
| 85 have_render_passes_to_push_ = false; | 85 have_render_passes_to_push_ = false; |
| 86 } | 86 } |
| 87 | 87 |
| 88 // This is just a copy for testing since we keep the data on the pending layer | 88 // This is just a copy for testing, since resources are added to the |
| 89 // for returning resources to the child for now. | 89 // ResourceProvider in the pending tree. |
| 90 delegated_layer->resources_ = resources_; | 90 delegated_layer->resources_ = resources_; |
| 91 } | 91 } |
| 92 | 92 |
| 93 void DelegatedRendererLayerImpl::CreateChildIdIfNeeded( |
| 94 const ReturnCallback& return_callback) { |
| 95 if (child_id_) |
| 96 return; |
| 97 |
| 98 ResourceProvider* resource_provider = layer_tree_impl()->resource_provider(); |
| 99 child_id_ = resource_provider->CreateChild(return_callback); |
| 100 own_child_id_ = true; |
| 101 } |
| 102 |
| 93 void DelegatedRendererLayerImpl::SetFrameData( | 103 void DelegatedRendererLayerImpl::SetFrameData( |
| 94 scoped_ptr<DelegatedFrameData> frame_data, | 104 scoped_ptr<DelegatedFrameData> frame_data, |
| 95 gfx::RectF damage_in_frame) { | 105 gfx::RectF damage_in_frame) { |
| 96 DCHECK(frame_data); | 106 DCHECK(frame_data); |
| 107 DCHECK(child_id_) << "CreateChildIdIfNeeded must be called first."; |
| 97 | 108 |
| 98 // A frame with an empty root render pass is invalid. | 109 // A frame with an empty root render pass is invalid. |
| 99 DCHECK(frame_data->render_pass_list.empty() || | 110 DCHECK(frame_data->render_pass_list.empty() || |
| 100 !frame_data->render_pass_list.back()->output_rect.IsEmpty()); | 111 !frame_data->render_pass_list.back()->output_rect.IsEmpty()); |
| 101 | 112 |
| 102 CreateChildIdIfNeeded(); | |
| 103 DCHECK(child_id_); | |
| 104 | |
| 105 ResourceProvider* resource_provider = layer_tree_impl()->resource_provider(); | 113 ResourceProvider* resource_provider = layer_tree_impl()->resource_provider(); |
| 106 const ResourceProvider::ResourceIdMap& resource_map = | 114 const ResourceProvider::ResourceIdMap& resource_map = |
| 107 resource_provider->GetChildToParentMap(child_id_); | 115 resource_provider->GetChildToParentMap(child_id_); |
| 108 | 116 |
| 109 resource_provider->ReceiveFromChild(child_id_, frame_data->resource_list); | 117 resource_provider->ReceiveFromChild(child_id_, frame_data->resource_list); |
| 110 | 118 |
| 111 bool invalid_frame = false; | 119 bool invalid_frame = false; |
| 112 ResourceProvider::ResourceIdSet used_resources; | 120 ResourceProvider::ResourceIdArray resources_in_frame; |
| 113 DrawQuad::ResourceIteratorCallback remap_resources_to_parent_callback = | 121 DrawQuad::ResourceIteratorCallback remap_resources_to_parent_callback = |
| 114 base::Bind(&ResourceRemapHelper, | 122 base::Bind(&ResourceRemapHelper, |
| 115 &invalid_frame, | 123 &invalid_frame, |
| 116 resource_map, | 124 resource_map, |
| 117 &used_resources); | 125 &resources_in_frame); |
| 118 for (size_t i = 0; i < frame_data->render_pass_list.size(); ++i) { | 126 for (size_t i = 0; i < frame_data->render_pass_list.size(); ++i) { |
| 119 RenderPass* pass = frame_data->render_pass_list[i]; | 127 RenderPass* pass = frame_data->render_pass_list[i]; |
| 120 for (size_t j = 0; j < pass->quad_list.size(); ++j) { | 128 for (size_t j = 0; j < pass->quad_list.size(); ++j) { |
| 121 DrawQuad* quad = pass->quad_list[j]; | 129 DrawQuad* quad = pass->quad_list[j]; |
| 122 quad->IterateResources(remap_resources_to_parent_callback); | 130 quad->IterateResources(remap_resources_to_parent_callback); |
| 123 } | 131 } |
| 124 } | 132 } |
| 125 | 133 |
| 126 if (invalid_frame) | 134 if (invalid_frame) { |
| 135 // Declare we are still using the last frame's resources. |
| 136 resource_provider->DeclareUsedResourcesFromChild(child_id_, resources_); |
| 127 return; | 137 return; |
| 138 } |
| 139 |
| 140 // Declare we are using the new frame's resources. |
| 141 resources_.swap(resources_in_frame); |
| 142 resource_provider->DeclareUsedResourcesFromChild(child_id_, resources_); |
| 128 | 143 |
| 129 // Display size is already set so we can compute what the damage rect | 144 // Display size is already set so we can compute what the damage rect |
| 130 // will be in layer space. | 145 // will be in layer space. |
| 131 if (!frame_data->render_pass_list.empty()) { | 146 if (!frame_data->render_pass_list.empty()) { |
| 132 RenderPass* new_root_pass = frame_data->render_pass_list.back(); | 147 RenderPass* new_root_pass = frame_data->render_pass_list.back(); |
| 133 gfx::RectF damage_in_layer = MathUtil::MapClippedRect( | 148 gfx::RectF damage_in_layer = MathUtil::MapClippedRect( |
| 134 DelegatedFrameToLayerSpaceTransform( | 149 DelegatedFrameToLayerSpaceTransform( |
| 135 new_root_pass->output_rect.size()), | 150 new_root_pass->output_rect.size()), |
| 136 damage_in_frame); | 151 damage_in_frame); |
| 137 set_update_rect(gfx::UnionRects(update_rect(), damage_in_layer)); | 152 set_update_rect(gfx::UnionRects(update_rect(), damage_in_layer)); |
| 138 } | 153 } |
| 139 | 154 |
| 140 // Save the remapped quads on the layer. This steals the quads and render | 155 // Save the remapped quads on the layer. This steals the quads and render |
| 141 // passes from the frame_data. | 156 // passes from the frame_data. |
| 142 SetRenderPasses(&frame_data->render_pass_list); | 157 SetRenderPasses(&frame_data->render_pass_list); |
| 143 resources_.swap(used_resources); | |
| 144 have_render_passes_to_push_ = true; | 158 have_render_passes_to_push_ = true; |
| 145 } | 159 } |
| 146 | 160 |
| 147 void DelegatedRendererLayerImpl::CollectUnusedResources( | |
| 148 ReturnedResourceArray* resources_for_ack) { | |
| 149 CreateChildIdIfNeeded(); | |
| 150 DCHECK(child_id_); | |
| 151 | |
| 152 ResourceProvider* resource_provider = layer_tree_impl()->resource_provider(); | |
| 153 const ResourceProvider::ResourceIdMap& resource_map = | |
| 154 resource_provider->GetChildToParentMap(child_id_); | |
| 155 | |
| 156 ResourceProvider::ResourceIdArray unused_resources; | |
| 157 for (ResourceProvider::ResourceIdMap::const_iterator it = | |
| 158 resource_map.begin(); | |
| 159 it != resource_map.end(); | |
| 160 ++it) { | |
| 161 bool resource_is_in_current_frame = resources_.count(it->second) > 0; | |
| 162 bool resource_is_in_use = resource_provider->InUseByConsumer(it->second); | |
| 163 if (!resource_is_in_current_frame && !resource_is_in_use) | |
| 164 unused_resources.push_back(it->second); | |
| 165 } | |
| 166 resource_provider->PrepareSendReturnsToChild( | |
| 167 child_id_, unused_resources, resources_for_ack); | |
| 168 } | |
| 169 | |
| 170 void DelegatedRendererLayerImpl::SetDisplaySize(gfx::Size size) { | 161 void DelegatedRendererLayerImpl::SetDisplaySize(gfx::Size size) { |
| 171 if (display_size_ == size) | 162 if (display_size_ == size) |
| 172 return; | 163 return; |
| 173 display_size_ = size; | 164 display_size_ = size; |
| 174 NoteLayerPropertyChanged(); | 165 NoteLayerPropertyChanged(); |
| 175 } | 166 } |
| 176 | 167 |
| 177 void DelegatedRendererLayerImpl::SetRenderPasses( | 168 void DelegatedRendererLayerImpl::SetRenderPasses( |
| 178 ScopedPtrVector<RenderPass>* render_passes_in_draw_order) { | 169 ScopedPtrVector<RenderPass>* render_passes_in_draw_order) { |
| 179 ClearRenderPasses(); | 170 ClearRenderPasses(); |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 | 461 |
| 471 if (output_quad) | 462 if (output_quad) |
| 472 quad_sink->Append(output_quad.Pass(), append_quads_data); | 463 quad_sink->Append(output_quad.Pass(), append_quads_data); |
| 473 } | 464 } |
| 474 } | 465 } |
| 475 | 466 |
| 476 const char* DelegatedRendererLayerImpl::LayerTypeAsString() const { | 467 const char* DelegatedRendererLayerImpl::LayerTypeAsString() const { |
| 477 return "cc::DelegatedRendererLayerImpl"; | 468 return "cc::DelegatedRendererLayerImpl"; |
| 478 } | 469 } |
| 479 | 470 |
| 480 void DelegatedRendererLayerImpl::CreateChildIdIfNeeded() { | |
| 481 if (child_id_) | |
| 482 return; | |
| 483 | |
| 484 ResourceProvider* resource_provider = layer_tree_impl()->resource_provider(); | |
| 485 child_id_ = resource_provider->CreateChild(); | |
| 486 own_child_id_ = true; | |
| 487 } | |
| 488 | |
| 489 void DelegatedRendererLayerImpl::ClearChildId() { | 471 void DelegatedRendererLayerImpl::ClearChildId() { |
| 490 if (!child_id_) | 472 if (!child_id_) |
| 491 return; | 473 return; |
| 492 | 474 |
| 493 if (own_child_id_) { | 475 if (own_child_id_) { |
| 494 ResourceProvider* provider = layer_tree_impl()->resource_provider(); | 476 ResourceProvider* provider = layer_tree_impl()->resource_provider(); |
| 495 provider->DestroyChild(child_id_); | 477 provider->DestroyChild(child_id_); |
| 496 } | 478 } |
| 497 | 479 |
| 498 child_id_ = 0; | 480 child_id_ = 0; |
| 499 } | 481 } |
| 500 | 482 |
| 501 } // namespace cc | 483 } // namespace cc |
| OLD | NEW |