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

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

Issue 26023004: aura: Allow delegated frames to be used by more than one impl layer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: frameprovider: are_layers_attached checks Created 7 years, 2 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 15 matching lines...) Expand all
26 have_render_passes_to_push_(false), 26 have_render_passes_to_push_(false),
27 child_id_(0), 27 child_id_(0),
28 own_child_id_(false) { 28 own_child_id_(false) {
29 } 29 }
30 30
31 DelegatedRendererLayerImpl::~DelegatedRendererLayerImpl() { 31 DelegatedRendererLayerImpl::~DelegatedRendererLayerImpl() {
32 ClearRenderPasses(); 32 ClearRenderPasses();
33 ClearChildId(); 33 ClearChildId();
34 } 34 }
35 35
36 bool DelegatedRendererLayerImpl::HasDelegatedContent() const { 36 bool DelegatedRendererLayerImpl::HasDelegatedContent() const { return true; }
37 return !render_passes_in_draw_order_.empty();
38 }
39 37
40 bool DelegatedRendererLayerImpl::HasContributingDelegatedRenderPasses() const { 38 bool DelegatedRendererLayerImpl::HasContributingDelegatedRenderPasses() const {
41 // The root RenderPass for the layer is merged with its target 39 // The root RenderPass for the layer is merged with its target
42 // RenderPass in each frame. So we only have extra RenderPasses 40 // RenderPass in each frame. So we only have extra RenderPasses
43 // to merge when we have a non-root RenderPass present. 41 // to merge when we have a non-root RenderPass present.
44 return render_passes_in_draw_order_.size() > 1; 42 return render_passes_in_draw_order_.size() > 1;
45 } 43 }
46 44
47 static ResourceProvider::ResourceId ResourceRemapHelper( 45 static ResourceProvider::ResourceId ResourceRemapHelper(
48 bool* invalid_frame, 46 bool* invalid_frame,
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 const ReturnCallback& return_callback) { 92 const ReturnCallback& return_callback) {
95 if (child_id_) 93 if (child_id_)
96 return; 94 return;
97 95
98 ResourceProvider* resource_provider = layer_tree_impl()->resource_provider(); 96 ResourceProvider* resource_provider = layer_tree_impl()->resource_provider();
99 child_id_ = resource_provider->CreateChild(return_callback); 97 child_id_ = resource_provider->CreateChild(return_callback);
100 own_child_id_ = true; 98 own_child_id_ = true;
101 } 99 }
102 100
103 void DelegatedRendererLayerImpl::SetFrameData( 101 void DelegatedRendererLayerImpl::SetFrameData(
104 scoped_ptr<DelegatedFrameData> frame_data, 102 const DelegatedFrameData* frame_data,
105 gfx::RectF damage_in_frame) { 103 gfx::RectF damage_in_frame) {
104 DCHECK(child_id_) << "CreateChildIdIfNeeded must be called first.";
106 DCHECK(frame_data); 105 DCHECK(frame_data);
107 DCHECK(child_id_) << "CreateChildIdIfNeeded must be called first."; 106 DCHECK(!frame_data->render_pass_list.empty());
108
109 // A frame with an empty root render pass is invalid. 107 // A frame with an empty root render pass is invalid.
110 DCHECK(frame_data->render_pass_list.empty() || 108 DCHECK(!frame_data->render_pass_list.back()->output_rect.IsEmpty());
111 !frame_data->render_pass_list.back()->output_rect.IsEmpty());
112 109
113 ResourceProvider* resource_provider = layer_tree_impl()->resource_provider(); 110 ResourceProvider* resource_provider = layer_tree_impl()->resource_provider();
114 const ResourceProvider::ResourceIdMap& resource_map = 111 const ResourceProvider::ResourceIdMap& resource_map =
115 resource_provider->GetChildToParentMap(child_id_); 112 resource_provider->GetChildToParentMap(child_id_);
116 113
117 resource_provider->ReceiveFromChild(child_id_, frame_data->resource_list); 114 resource_provider->ReceiveFromChild(child_id_, frame_data->resource_list);
118 115
116 ScopedPtrVector<RenderPass> render_pass_list;
117 RenderPass::CopyAll(frame_data->render_pass_list, &render_pass_list);
118
119 bool invalid_frame = false; 119 bool invalid_frame = false;
120 ResourceProvider::ResourceIdArray resources_in_frame; 120 ResourceProvider::ResourceIdArray resources_in_frame;
121 DrawQuad::ResourceIteratorCallback remap_resources_to_parent_callback = 121 DrawQuad::ResourceIteratorCallback remap_resources_to_parent_callback =
122 base::Bind(&ResourceRemapHelper, 122 base::Bind(&ResourceRemapHelper,
123 &invalid_frame, 123 &invalid_frame,
124 resource_map, 124 resource_map,
125 &resources_in_frame); 125 &resources_in_frame);
126 for (size_t i = 0; i < frame_data->render_pass_list.size(); ++i) { 126 for (size_t i = 0; i < render_pass_list.size(); ++i) {
127 RenderPass* pass = frame_data->render_pass_list[i]; 127 RenderPass* pass = render_pass_list[i];
128 for (size_t j = 0; j < pass->quad_list.size(); ++j) { 128 for (size_t j = 0; j < pass->quad_list.size(); ++j) {
129 DrawQuad* quad = pass->quad_list[j]; 129 DrawQuad* quad = pass->quad_list[j];
130 quad->IterateResources(remap_resources_to_parent_callback); 130 quad->IterateResources(remap_resources_to_parent_callback);
131 } 131 }
132 } 132 }
133 133
134 if (invalid_frame) { 134 if (invalid_frame) {
135 // Declare we are still using the last frame's resources. 135 // Declare we are still using the last frame's resources.
136 resource_provider->DeclareUsedResourcesFromChild(child_id_, resources_); 136 resource_provider->DeclareUsedResourcesFromChild(child_id_, resources_);
137 return; 137 return;
138 } 138 }
139 139
140 // Declare we are using the new frame's resources. 140 // Declare we are using the new frame's resources.
141 resources_.swap(resources_in_frame); 141 resources_.swap(resources_in_frame);
142 resource_provider->DeclareUsedResourcesFromChild(child_id_, resources_); 142 resource_provider->DeclareUsedResourcesFromChild(child_id_, resources_);
143 143
144 // 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
145 // will be in layer space. 145 // will be in layer space.
146 if (!frame_data->render_pass_list.empty()) { 146 RenderPass* new_root_pass = render_pass_list.back();
147 RenderPass* new_root_pass = frame_data->render_pass_list.back(); 147 gfx::Size frame_size = new_root_pass->output_rect.size();
148 gfx::RectF damage_in_layer = MathUtil::MapClippedRect( 148 gfx::RectF damage_in_layer = MathUtil::MapClippedRect(
149 DelegatedFrameToLayerSpaceTransform( 149 DelegatedFrameToLayerSpaceTransform(frame_size), damage_in_frame);
150 new_root_pass->output_rect.size()), 150 set_update_rect(gfx::UnionRects(update_rect(), damage_in_layer));
151 damage_in_frame);
152 set_update_rect(gfx::UnionRects(update_rect(), damage_in_layer));
153 }
154 151
155 // Save the remapped quads on the layer. This steals the quads and render 152 SetRenderPasses(&render_pass_list);
156 // passes from the frame_data.
157 SetRenderPasses(&frame_data->render_pass_list);
158 have_render_passes_to_push_ = true; 153 have_render_passes_to_push_ = true;
159 } 154 }
160 155
161 void DelegatedRendererLayerImpl::SetDisplaySize(gfx::Size size) { 156 void DelegatedRendererLayerImpl::SetDisplaySize(gfx::Size size) {
162 if (display_size_ == size) 157 if (display_size_ == size)
163 return; 158 return;
164 display_size_ = size; 159 display_size_ = size;
165 NoteLayerPropertyChanged(); 160 NoteLayerPropertyChanged();
166 } 161 }
167 162
168 void DelegatedRendererLayerImpl::SetRenderPasses( 163 void DelegatedRendererLayerImpl::SetRenderPasses(
169 ScopedPtrVector<RenderPass>* render_passes_in_draw_order) { 164 ScopedPtrVector<RenderPass>* render_passes_in_draw_order) {
170 ClearRenderPasses(); 165 ClearRenderPasses();
171 166
172 for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) { 167 for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) {
173 ScopedPtrVector<RenderPass>::iterator to_take = 168 ScopedPtrVector<RenderPass>::iterator to_take =
174 render_passes_in_draw_order->begin() + i; 169 render_passes_in_draw_order->begin() + i;
175 render_passes_index_by_id_.insert( 170 render_passes_index_by_id_.insert(
176 std::pair<RenderPass::Id, int>((*to_take)->id, i)); 171 std::pair<RenderPass::Id, int>((*to_take)->id, i));
177 scoped_ptr<RenderPass> taken_render_pass = 172 scoped_ptr<RenderPass> taken_render_pass =
178 render_passes_in_draw_order->take(to_take); 173 render_passes_in_draw_order->take(to_take);
179 render_passes_in_draw_order_.push_back(taken_render_pass.Pass()); 174 render_passes_in_draw_order_.push_back(taken_render_pass.Pass());
180 } 175 }
181 176
182 // Give back an empty array instead of nulls. 177 // Give back an empty array instead of nulls.
183 render_passes_in_draw_order->clear(); 178 render_passes_in_draw_order->clear();
184 } 179 }
185 180
186 void DelegatedRendererLayerImpl::ClearRenderPasses() { 181 void DelegatedRendererLayerImpl::ClearRenderPasses() {
187 // TODO(danakj): Release the resources back to the nested compositor.
188 render_passes_index_by_id_.clear(); 182 render_passes_index_by_id_.clear();
189 render_passes_in_draw_order_.clear(); 183 render_passes_in_draw_order_.clear();
190 } 184 }
191 185
192 scoped_ptr<LayerImpl> DelegatedRendererLayerImpl::CreateLayerImpl( 186 scoped_ptr<LayerImpl> DelegatedRendererLayerImpl::CreateLayerImpl(
193 LayerTreeImpl* tree_impl) { 187 LayerTreeImpl* tree_impl) {
194 return DelegatedRendererLayerImpl::Create( 188 return DelegatedRendererLayerImpl::Create(
195 tree_impl, id()).PassAs<LayerImpl>(); 189 tree_impl, id()).PassAs<LayerImpl>();
196 } 190 }
197 191
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
264 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) 258 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE)
265 return false; 259 return false;
266 return LayerImpl::WillDraw(draw_mode, resource_provider); 260 return LayerImpl::WillDraw(draw_mode, resource_provider);
267 } 261 }
268 262
269 void DelegatedRendererLayerImpl::AppendQuads( 263 void DelegatedRendererLayerImpl::AppendQuads(
270 QuadSink* quad_sink, 264 QuadSink* quad_sink,
271 AppendQuadsData* append_quads_data) { 265 AppendQuadsData* append_quads_data) {
272 AppendRainbowDebugBorder(quad_sink, append_quads_data); 266 AppendRainbowDebugBorder(quad_sink, append_quads_data);
273 267
268 // This list will be empty after a lost context until a new frame arrives.
274 if (render_passes_in_draw_order_.empty()) 269 if (render_passes_in_draw_order_.empty())
275 return; 270 return;
276 271
277 RenderPass::Id target_render_pass_id = append_quads_data->render_pass_id; 272 RenderPass::Id target_render_pass_id = append_quads_data->render_pass_id;
278 273
279 const RenderPass* root_delegated_render_pass = 274 const RenderPass* root_delegated_render_pass =
280 render_passes_in_draw_order_.back(); 275 render_passes_in_draw_order_.back();
281 276
282 DCHECK(root_delegated_render_pass->output_rect.origin().IsOrigin()); 277 DCHECK(root_delegated_render_pass->output_rect.origin().IsOrigin());
283 gfx::Size frame_size = root_delegated_render_pass->output_rect.size(); 278 gfx::Size frame_size = root_delegated_render_pass->output_rect.size();
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 469
475 if (own_child_id_) { 470 if (own_child_id_) {
476 ResourceProvider* provider = layer_tree_impl()->resource_provider(); 471 ResourceProvider* provider = layer_tree_impl()->resource_provider();
477 provider->DestroyChild(child_id_); 472 provider->DestroyChild(child_id_);
478 } 473 }
479 474
480 child_id_ = 0; 475 child_id_ = 0;
481 } 476 }
482 477
483 } // namespace cc 478 } // 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