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

Side by Side Diff: cc/delegated_renderer_layer_impl.cc

Issue 12340124: cc: Receive and remap resources to the parent. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 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
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/delegated_renderer_layer_impl.h" 5 #include "cc/delegated_renderer_layer_impl.h"
6 6
7 #include "base/bind.h"
7 #include "cc/append_quads_data.h" 8 #include "cc/append_quads_data.h"
8 #include "cc/delegated_frame_data.h" 9 #include "cc/delegated_frame_data.h"
9 #include "cc/layer_tree_impl.h" 10 #include "cc/layer_tree_impl.h"
10 #include "cc/math_util.h" 11 #include "cc/math_util.h"
11 #include "cc/quad_sink.h" 12 #include "cc/quad_sink.h"
12 #include "cc/render_pass_draw_quad.h" 13 #include "cc/render_pass_draw_quad.h"
13 #include "cc/render_pass_sink.h" 14 #include "cc/render_pass_sink.h"
14 15
15 namespace cc { 16 namespace cc {
16 17
(...skipping 12 matching lines...) Expand all
29 return !render_passes_in_draw_order_.empty(); 30 return !render_passes_in_draw_order_.empty();
30 } 31 }
31 32
32 bool DelegatedRendererLayerImpl::hasContributingDelegatedRenderPasses() const { 33 bool DelegatedRendererLayerImpl::hasContributingDelegatedRenderPasses() const {
33 // The root RenderPass for the layer is merged with its target 34 // The root RenderPass for the layer is merged with its target
34 // RenderPass in each frame. So we only have extra RenderPasses 35 // RenderPass in each frame. So we only have extra RenderPasses
35 // to merge when we have a non-root RenderPass present. 36 // to merge when we have a non-root RenderPass present.
36 return render_passes_in_draw_order_.size() > 1; 37 return render_passes_in_draw_order_.size() > 1;
37 } 38 }
38 39
40 static ResourceProvider::ResourceId ResourceRemapHelper(
41 const ResourceProvider::ResourceIdMap& child_to_parent_map,
42 ResourceProvider::ResourceIdSet *remapped_resources,
43 ResourceProvider::ResourceId id) {
44
45 ResourceProvider::ResourceIdMap::const_iterator it =
46 child_to_parent_map.find(id);
47 DCHECK(it != child_to_parent_map.end());
48 DCHECK(it->first == id);
49
50 ResourceProvider::ResourceId remapped_id = it->second;
51 remapped_resources->insert(remapped_id);
52 return remapped_id;
53 }
54
39 void DelegatedRendererLayerImpl::SetFrameData( 55 void DelegatedRendererLayerImpl::SetFrameData(
40 scoped_ptr<DelegatedFrameData> frame_data, 56 scoped_ptr<DelegatedFrameData> frame_data,
41 gfx::RectF damage_in_frame) { 57 gfx::RectF damage_in_frame,
58 TransferableResourceArray* resources_for_ack) {
59 // A frame with an empty root render pass is invalid.
60 DCHECK(frame_data->render_pass_list.empty() ||
61 !frame_data->render_pass_list.back()->output_rect.IsEmpty());
62 // If the render pass list is empty, the resource list better be empty too.
63 DCHECK(!frame_data->render_pass_list.empty() ||
64 frame_data->resource_list.empty());
piman 2013/02/27 23:09:39 What happens if that's not the case? It seems harm
danakj 2013/02/28 02:51:05 Right, with the merging you mentioned in DRLayer.c
65
42 CreateChildIdIfNeeded(); 66 CreateChildIdIfNeeded();
43 DCHECK(child_id_); 67 DCHECK(child_id_);
44 68
45 // Display size is already set so we can compute what the damage rect 69 // Display size is already set so we can compute what the damage rect
46 // will be in layer space. 70 // will be in layer space.
47 if (!frame_data->render_pass_list.empty()) { 71 if (!frame_data->render_pass_list.empty()) {
48 RenderPass* new_root_pass = frame_data->render_pass_list.back(); 72 RenderPass* new_root_pass = frame_data->render_pass_list.back();
49 DCHECK(!new_root_pass->output_rect.IsEmpty()); 73 DCHECK(!new_root_pass->output_rect.IsEmpty());
piman 2013/02/27 23:09:39 nit: this is tested above, so you can remove.
50 gfx::RectF damage_in_layer = MathUtil::mapClippedRect( 74 gfx::RectF damage_in_layer = MathUtil::mapClippedRect(
51 DelegatedFrameToLayerSpaceTransform(new_root_pass->output_rect.size()), 75 DelegatedFrameToLayerSpaceTransform(new_root_pass->output_rect.size()),
52 damage_in_frame); 76 damage_in_frame);
53 setUpdateRect(gfx::UnionRects(updateRect(), damage_in_layer)); 77 setUpdateRect(gfx::UnionRects(updateRect(), damage_in_layer));
54 } 78 }
55 79
56 // TODO(danakj): Convert the resource ids the render passes and return data 80 // Save the resources from the last frame.
57 // for a frame ack. 81 ResourceProvider::ResourceIdSet previous_frame_resources;
82 previous_frame_resources.swap(resources_);
83
84 // Receive the current frame's resources from the child compositor.
85 ResourceProvider* resource_provider = layerTreeImpl()->resource_provider();
86 resource_provider->receiveFromChild(child_id_, frame_data->resource_list);
87
88 // Remap resource ids in the current frame's quads to the parent's namespace.
89 DrawQuad::ResourceRemapCallback remap_callback = base::Bind(
90 &ResourceRemapHelper,
91 resource_provider->getChildToParentMap(child_id_),
92 &resources_);
93 for (size_t i = 0; i < frame_data->render_pass_list.size(); ++i) {
94 RenderPass* pass = frame_data->render_pass_list[i];
95 for (size_t j = 0; j < pass->quad_list.size(); ++j) {
96 DrawQuad* quad = pass->quad_list[i];
piman 2013/02/28 02:28:33 s/quad_list[i]/quad_list[j]/
97 quad->RemapResources(remap_callback);
98 }
99 }
100 // Save the remapped quads on the layer. This steals the quads and render
101 // passes from the frame_data.
58 SetRenderPasses(frame_data->render_pass_list); 102 SetRenderPasses(frame_data->render_pass_list);
103
104 // Release the resources from the previous frame to prepare them for transport
105 // back to the child compositor.
106 ResourceProvider::ResourceIdArray unused_resources;
107 for (ResourceProvider::ResourceIdSet::iterator it =
108 previous_frame_resources.begin();
109 it != previous_frame_resources.end();
110 ++it) {
111 bool resource_is_not_in_current_frame =
112 resources_.find(*it) == resources_.end();
113 if (resource_is_not_in_current_frame)
114 unused_resources.push_back(*it);
115 }
116 resource_provider->prepareSendToChild(
117 child_id_, unused_resources, resources_for_ack);
59 } 118 }
60 119
61 void DelegatedRendererLayerImpl::SetDisplaySize(gfx::Size size) { 120 void DelegatedRendererLayerImpl::SetDisplaySize(gfx::Size size) {
62 if (display_size_ == size) 121 if (display_size_ == size)
63 return; 122 return;
64 display_size_ = size; 123 display_size_ = size;
65 noteLayerPropertyChanged(); 124 noteLayerPropertyChanged();
66 } 125 }
67 126
68 void DelegatedRendererLayerImpl::SetRenderPasses( 127 void DelegatedRendererLayerImpl::SetRenderPasses(
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 void DelegatedRendererLayerImpl::ClearChildId() { 335 void DelegatedRendererLayerImpl::ClearChildId() {
277 if (!child_id_) 336 if (!child_id_)
278 return; 337 return;
279 338
280 ResourceProvider* resource_provider = layerTreeImpl()->resource_provider(); 339 ResourceProvider* resource_provider = layerTreeImpl()->resource_provider();
281 resource_provider->destroyChild(child_id_); 340 resource_provider->destroyChild(child_id_);
282 child_id_ = 0; 341 child_id_ = 0;
283 } 342 }
284 343
285 } // namespace cc 344 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698