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

Side by Side Diff: cc/delegated_renderer_layer_impl.cc

Issue 12385085: cc: Unused resources should be given back to the child compositor (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
« no previous file with comments | « cc/delegated_renderer_layer_impl.h ('k') | cc/layer_tree_host_unittest_delegated.cc » ('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/delegated_renderer_layer_impl.h" 5 #include "cc/delegated_renderer_layer_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "cc/append_quads_data.h" 8 #include "cc/append_quads_data.h"
9 #include "cc/delegated_frame_data.h" 9 #include "cc/delegated_frame_data.h"
10 #include "cc/layer_tree_impl.h" 10 #include "cc/layer_tree_impl.h"
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 // Display size is already set so we can compute what the damage rect 70 // Display size is already set so we can compute what the damage rect
71 // will be in layer space. 71 // will be in layer space.
72 if (!frame_data->render_pass_list.empty()) { 72 if (!frame_data->render_pass_list.empty()) {
73 RenderPass* new_root_pass = frame_data->render_pass_list.back(); 73 RenderPass* new_root_pass = frame_data->render_pass_list.back();
74 gfx::RectF damage_in_layer = MathUtil::mapClippedRect( 74 gfx::RectF damage_in_layer = MathUtil::mapClippedRect(
75 DelegatedFrameToLayerSpaceTransform(new_root_pass->output_rect.size()), 75 DelegatedFrameToLayerSpaceTransform(new_root_pass->output_rect.size()),
76 damage_in_frame); 76 damage_in_frame);
77 setUpdateRect(gfx::UnionRects(updateRect(), damage_in_layer)); 77 setUpdateRect(gfx::UnionRects(updateRect(), damage_in_layer));
78 } 78 }
79 79
80 // Save the resources from the last frame.
81 ResourceProvider::ResourceIdSet new_resources;
82
83 // Receive the current frame's resources from the child compositor. 80 // Receive the current frame's resources from the child compositor.
84 ResourceProvider* resource_provider = layerTreeImpl()->resource_provider(); 81 ResourceProvider* resource_provider = layerTreeImpl()->resource_provider();
85 resource_provider->receiveFromChild(child_id_, frame_data->resource_list); 82 resource_provider->receiveFromChild(child_id_, frame_data->resource_list);
83 const ResourceProvider::ResourceIdMap& resource_map =
84 resource_provider->getChildToParentMap(child_id_);
86 85
87 // Remap resource ids in the current frame's quads to the parent's namespace. 86 // Remap resource ids in the current frame's quads to the parent's namespace.
88 bool invalid_frame = false; 87 bool invalid_frame = false;
88 ResourceProvider::ResourceIdSet used_resources;
89 DrawQuad::ResourceIteratorCallback remap_callback = base::Bind( 89 DrawQuad::ResourceIteratorCallback remap_callback = base::Bind(
90 &ResourceRemapHelper, 90 &ResourceRemapHelper,
91 &invalid_frame, 91 &invalid_frame,
92 resource_provider->getChildToParentMap(child_id_), 92 resource_map,
93 &new_resources); 93 &used_resources);
94 for (size_t i = 0; i < frame_data->render_pass_list.size(); ++i) { 94 for (size_t i = 0; i < frame_data->render_pass_list.size(); ++i) {
95 RenderPass* pass = frame_data->render_pass_list[i]; 95 RenderPass* pass = frame_data->render_pass_list[i];
96 for (size_t j = 0; j < pass->quad_list.size(); ++j) { 96 for (size_t j = 0; j < pass->quad_list.size(); ++j) {
97 DrawQuad* quad = pass->quad_list[j]; 97 DrawQuad* quad = pass->quad_list[j];
98 quad->IterateResources(remap_callback); 98 quad->IterateResources(remap_callback);
99 } 99 }
100 } 100 }
101 101
102 // If the frame has invalid data in it, don't display it. 102 // If the frame has invalid data in it, don't display it.
103 if (invalid_frame) { 103 if (invalid_frame)
104 // Keep the resources given to us this frame.
105 for (ResourceProvider::ResourceIdSet::iterator it = new_resources.begin();
106 it != new_resources.end();
107 ++it)
108 resources_.insert(*it);
109 return; 104 return;
110 }
111
112 // Save the resources that this layer owns now.
113 ResourceProvider::ResourceIdSet previous_frame_resources;
114 previous_frame_resources.swap(resources_);
115 resources_.swap(new_resources);
116 105
117 // Save the remapped quads on the layer. This steals the quads and render 106 // Save the remapped quads on the layer. This steals the quads and render
118 // passes from the frame_data. 107 // passes from the frame_data.
119 SetRenderPasses(frame_data->render_pass_list); 108 SetRenderPasses(frame_data->render_pass_list);
120 109
121 // Release the resources from the previous frame to prepare them for transport 110 // Release unused resources to prepare them for transport back to the child
122 // back to the child compositor. 111 // compositor.
123 ResourceProvider::ResourceIdArray unused_resources; 112 ResourceProvider::ResourceIdArray unused_resources;
124 for (ResourceProvider::ResourceIdSet::iterator it = 113 for (ResourceProvider::ResourceIdMap::const_iterator it =
125 previous_frame_resources.begin(); 114 resource_map.begin();
126 it != previous_frame_resources.end(); 115 it != resource_map.end();
127 ++it) { 116 ++it) {
128 bool resource_is_not_in_current_frame = 117 bool resource_is_not_in_current_frame = !used_resources.count(it->second);
129 resources_.find(*it) == resources_.end();
130 if (resource_is_not_in_current_frame) 118 if (resource_is_not_in_current_frame)
131 unused_resources.push_back(*it); 119 unused_resources.push_back(it->second);
piman 2013/03/04 17:20:45 How do these get fed back into the next frame if i
danakj 2013/03/04 17:39:27 If the next frame needs them, I would expect it to
132 } 120 }
133 resource_provider->prepareSendToChild( 121 resource_provider->prepareSendToChild(
134 child_id_, unused_resources, resources_for_ack); 122 child_id_, unused_resources, resources_for_ack);
135 } 123 }
136 124
137 void DelegatedRendererLayerImpl::SetDisplaySize(gfx::Size size) { 125 void DelegatedRendererLayerImpl::SetDisplaySize(gfx::Size size) {
138 if (display_size_ == size) 126 if (display_size_ == size)
139 return; 127 return;
140 display_size_ = size; 128 display_size_ = size;
141 noteLayerPropertyChanged(); 129 noteLayerPropertyChanged();
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 void DelegatedRendererLayerImpl::ClearChildId() { 340 void DelegatedRendererLayerImpl::ClearChildId() {
353 if (!child_id_) 341 if (!child_id_)
354 return; 342 return;
355 343
356 ResourceProvider* resource_provider = layerTreeImpl()->resource_provider(); 344 ResourceProvider* resource_provider = layerTreeImpl()->resource_provider();
357 resource_provider->destroyChild(child_id_); 345 resource_provider->destroyChild(child_id_);
358 child_id_ = 0; 346 child_id_ = 0;
359 } 347 }
360 348
361 } // namespace cc 349 } // namespace cc
OLDNEW
« no previous file with comments | « cc/delegated_renderer_layer_impl.h ('k') | cc/layer_tree_host_unittest_delegated.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698