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

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.cc ('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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 DCHECK(it->first == id); 53 DCHECK(it->first == id);
54 ResourceProvider::ResourceId remapped_id = it->second; 54 ResourceProvider::ResourceId remapped_id = it->second;
55 remapped_resources->insert(remapped_id); 55 remapped_resources->insert(remapped_id);
56 return remapped_id; 56 return remapped_id;
57 } 57 }
58 58
59 void DelegatedRendererLayerImpl::SetFrameData( 59 void DelegatedRendererLayerImpl::SetFrameData(
60 scoped_ptr<DelegatedFrameData> frame_data, 60 scoped_ptr<DelegatedFrameData> frame_data,
61 gfx::RectF damage_in_frame, 61 gfx::RectF damage_in_frame,
62 TransferableResourceArray* resources_for_ack) { 62 TransferableResourceArray* resources_for_ack) {
63 // A frame with an empty root render pass is invalid.
64 DCHECK(frame_data->render_pass_list.empty() ||
65 !frame_data->render_pass_list.back()->output_rect.IsEmpty());
66
67 CreateChildIdIfNeeded(); 63 CreateChildIdIfNeeded();
68 DCHECK(child_id_); 64 DCHECK(child_id_);
69 65
70 // Display size is already set so we can compute what the damage rect 66 ResourceProvider* resource_provider = layerTreeImpl()->resource_provider();
71 // will be in layer space. 67 const ResourceProvider::ResourceIdMap& resource_map =
72 if (!frame_data->render_pass_list.empty()) { 68 resource_provider->getChildToParentMap(child_id_);
73 RenderPass* new_root_pass = frame_data->render_pass_list.back();
74 gfx::RectF damage_in_layer = MathUtil::mapClippedRect(
75 DelegatedFrameToLayerSpaceTransform(new_root_pass->output_rect.size()),
76 damage_in_frame);
77 setUpdateRect(gfx::UnionRects(updateRect(), damage_in_layer));
78 }
79 69
80 // Save the resources from the last frame. 70 if (frame_data) {
81 ResourceProvider::ResourceIdSet new_resources; 71 // A frame with an empty root render pass is invalid.
72 DCHECK(frame_data->render_pass_list.empty() ||
73 !frame_data->render_pass_list.back()->output_rect.IsEmpty());
82 74
83 // Receive the current frame's resources from the child compositor. 75 // Display size is already set so we can compute what the damage rect
84 ResourceProvider* resource_provider = layerTreeImpl()->resource_provider(); 76 // will be in layer space.
85 resource_provider->receiveFromChild(child_id_, frame_data->resource_list); 77 if (!frame_data->render_pass_list.empty()) {
78 RenderPass* new_root_pass = frame_data->render_pass_list.back();
79 gfx::RectF damage_in_layer = MathUtil::mapClippedRect(
80 DelegatedFrameToLayerSpaceTransform(
81 new_root_pass->output_rect.size()),
82 damage_in_frame);
83 setUpdateRect(gfx::UnionRects(updateRect(), damage_in_layer));
84 }
86 85
87 // Remap resource ids in the current frame's quads to the parent's namespace. 86 resource_provider->receiveFromChild(child_id_, frame_data->resource_list);
88 bool invalid_frame = false; 87
89 DrawQuad::ResourceIteratorCallback remap_callback = base::Bind( 88 bool invalid_frame = false;
90 &ResourceRemapHelper, 89 ResourceProvider::ResourceIdSet used_resources;
91 &invalid_frame, 90 DrawQuad::ResourceIteratorCallback remap_resources_to_parent_callback =
92 resource_provider->getChildToParentMap(child_id_), 91 base::Bind(&ResourceRemapHelper,
93 &new_resources); 92 &invalid_frame,
94 for (size_t i = 0; i < frame_data->render_pass_list.size(); ++i) { 93 resource_map,
95 RenderPass* pass = frame_data->render_pass_list[i]; 94 &used_resources);
96 for (size_t j = 0; j < pass->quad_list.size(); ++j) { 95 for (size_t i = 0; i < frame_data->render_pass_list.size(); ++i) {
97 DrawQuad* quad = pass->quad_list[j]; 96 RenderPass* pass = frame_data->render_pass_list[i];
98 quad->IterateResources(remap_callback); 97 for (size_t j = 0; j < pass->quad_list.size(); ++j) {
98 DrawQuad* quad = pass->quad_list[j];
99 quad->IterateResources(remap_resources_to_parent_callback);
100 }
101 }
102
103 if (!invalid_frame) {
104 // Save the remapped quads on the layer. This steals the quads and render
105 // passes from the frame_data.
106 SetRenderPasses(&frame_data->render_pass_list);
107 resources_.swap(used_resources);
99 } 108 }
100 } 109 }
101 110
102 // If the frame has invalid data in it, don't display it.
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;
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
117 // Save the remapped quads on the layer. This steals the quads and render
118 // passes from the frame_data.
119 SetRenderPasses(&frame_data->render_pass_list);
120
121 // Release the resources from the previous frame to prepare them for transport
122 // back to the child compositor.
123 ResourceProvider::ResourceIdArray unused_resources; 111 ResourceProvider::ResourceIdArray unused_resources;
124 for (ResourceProvider::ResourceIdSet::iterator it = 112 for (ResourceProvider::ResourceIdMap::const_iterator it =
125 previous_frame_resources.begin(); 113 resource_map.begin();
126 it != previous_frame_resources.end(); 114 it != resource_map.end();
127 ++it) { 115 ++it) {
128 bool resource_is_not_in_current_frame = 116 bool resource_is_in_current_frame = resources_.count(it->second);
129 resources_.find(*it) == resources_.end(); 117 bool resource_is_in_use = resource_provider->inUseByConsumer(it->second);
130 if (resource_is_not_in_current_frame) 118 if (!resource_is_in_current_frame && !resource_is_in_use)
131 unused_resources.push_back(*it); 119 unused_resources.push_back(it->second);
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.cc ('k') | cc/layer_tree_host_unittest_delegated.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698