Chromium Code Reviews| 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 "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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |