| 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 |
| 42 CreateChildIdIfNeeded(); | 63 CreateChildIdIfNeeded(); |
| 43 DCHECK(child_id_); | 64 DCHECK(child_id_); |
| 44 | 65 |
| 45 // Display size is already set so we can compute what the damage rect | 66 // Display size is already set so we can compute what the damage rect |
| 46 // will be in layer space. | 67 // will be in layer space. |
| 47 if (!frame_data->render_pass_list.empty()) { | 68 if (!frame_data->render_pass_list.empty()) { |
| 48 RenderPass* new_root_pass = frame_data->render_pass_list.back(); | 69 RenderPass* new_root_pass = frame_data->render_pass_list.back(); |
| 49 DCHECK(!new_root_pass->output_rect.IsEmpty()); | |
| 50 gfx::RectF damage_in_layer = MathUtil::mapClippedRect( | 70 gfx::RectF damage_in_layer = MathUtil::mapClippedRect( |
| 51 DelegatedFrameToLayerSpaceTransform(new_root_pass->output_rect.size()), | 71 DelegatedFrameToLayerSpaceTransform(new_root_pass->output_rect.size()), |
| 52 damage_in_frame); | 72 damage_in_frame); |
| 53 setUpdateRect(gfx::UnionRects(updateRect(), damage_in_layer)); | 73 setUpdateRect(gfx::UnionRects(updateRect(), damage_in_layer)); |
| 54 } | 74 } |
| 55 | 75 |
| 56 // TODO(danakj): Convert the resource ids the render passes and return data | 76 // Save the resources from the last frame. |
| 57 // for a frame ack. | 77 ResourceProvider::ResourceIdSet previous_frame_resources; |
| 78 previous_frame_resources.swap(resources_); |
| 79 |
| 80 // Receive the current frame's resources from the child compositor. |
| 81 ResourceProvider* resource_provider = layerTreeImpl()->resource_provider(); |
| 82 resource_provider->receiveFromChild(child_id_, frame_data->resource_list); |
| 83 |
| 84 // Remap resource ids in the current frame's quads to the parent's namespace. |
| 85 DrawQuad::ResourceIteratorCallback remap_callback = base::Bind( |
| 86 &ResourceRemapHelper, |
| 87 resource_provider->getChildToParentMap(child_id_), |
| 88 &resources_); |
| 89 for (size_t i = 0; i < frame_data->render_pass_list.size(); ++i) { |
| 90 RenderPass* pass = frame_data->render_pass_list[i]; |
| 91 for (size_t j = 0; j < pass->quad_list.size(); ++j) { |
| 92 DrawQuad* quad = pass->quad_list[j]; |
| 93 quad->IterateResources(remap_callback); |
| 94 } |
| 95 } |
| 96 // Save the remapped quads on the layer. This steals the quads and render |
| 97 // passes from the frame_data. |
| 58 SetRenderPasses(frame_data->render_pass_list); | 98 SetRenderPasses(frame_data->render_pass_list); |
| 99 |
| 100 // Release the resources from the previous frame to prepare them for transport |
| 101 // back to the child compositor. |
| 102 ResourceProvider::ResourceIdArray unused_resources; |
| 103 for (ResourceProvider::ResourceIdSet::iterator it = |
| 104 previous_frame_resources.begin(); |
| 105 it != previous_frame_resources.end(); |
| 106 ++it) { |
| 107 bool resource_is_not_in_current_frame = |
| 108 resources_.find(*it) == resources_.end(); |
| 109 if (resource_is_not_in_current_frame) |
| 110 unused_resources.push_back(*it); |
| 111 } |
| 112 resource_provider->prepareSendToChild( |
| 113 child_id_, unused_resources, resources_for_ack); |
| 59 } | 114 } |
| 60 | 115 |
| 61 void DelegatedRendererLayerImpl::SetDisplaySize(gfx::Size size) { | 116 void DelegatedRendererLayerImpl::SetDisplaySize(gfx::Size size) { |
| 62 if (display_size_ == size) | 117 if (display_size_ == size) |
| 63 return; | 118 return; |
| 64 display_size_ = size; | 119 display_size_ = size; |
| 65 noteLayerPropertyChanged(); | 120 noteLayerPropertyChanged(); |
| 66 } | 121 } |
| 67 | 122 |
| 68 void DelegatedRendererLayerImpl::SetRenderPasses( | 123 void DelegatedRendererLayerImpl::SetRenderPasses( |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 void DelegatedRendererLayerImpl::ClearChildId() { | 331 void DelegatedRendererLayerImpl::ClearChildId() { |
| 277 if (!child_id_) | 332 if (!child_id_) |
| 278 return; | 333 return; |
| 279 | 334 |
| 280 ResourceProvider* resource_provider = layerTreeImpl()->resource_provider(); | 335 ResourceProvider* resource_provider = layerTreeImpl()->resource_provider(); |
| 281 resource_provider->destroyChild(child_id_); | 336 resource_provider->destroyChild(child_id_); |
| 282 child_id_ = 0; | 337 child_id_ = 0; |
| 283 } | 338 } |
| 284 | 339 |
| 285 } // namespace cc | 340 } // namespace cc |
| OLD | NEW |