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 |