OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |