Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(200)

Side by Side Diff: cc/layers/delegated_renderer_layer_impl.cc

Issue 24078024: cc: Return resources to child compositor via a Callback. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: deletechild: No AndReceiveAck needed, change STP Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/layers/delegated_renderer_layer_impl.h ('k') | cc/resources/resource_provider.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « cc/layers/delegated_renderer_layer_impl.h ('k') | cc/resources/resource_provider.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698