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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 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 |