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/layers/delegated_renderer_layer_impl.h" | 5 #include "cc/layers/delegated_renderer_layer_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 26 have_render_passes_to_push_(false), | 26 have_render_passes_to_push_(false), |
| 27 child_id_(0), | 27 child_id_(0), |
| 28 own_child_id_(false) { | 28 own_child_id_(false) { |
| 29 } | 29 } |
| 30 | 30 |
| 31 DelegatedRendererLayerImpl::~DelegatedRendererLayerImpl() { | 31 DelegatedRendererLayerImpl::~DelegatedRendererLayerImpl() { |
| 32 ClearRenderPasses(); | 32 ClearRenderPasses(); |
| 33 ClearChildId(); | 33 ClearChildId(); |
| 34 } | 34 } |
| 35 | 35 |
| 36 bool DelegatedRendererLayerImpl::HasDelegatedContent() const { | 36 bool DelegatedRendererLayerImpl::HasDelegatedContent() const { return true; } |
| 37 return !render_passes_in_draw_order_.empty(); | |
| 38 } | |
| 39 | 37 |
| 40 bool DelegatedRendererLayerImpl::HasContributingDelegatedRenderPasses() const { | 38 bool DelegatedRendererLayerImpl::HasContributingDelegatedRenderPasses() const { |
| 41 // The root RenderPass for the layer is merged with its target | 39 // The root RenderPass for the layer is merged with its target |
| 42 // RenderPass in each frame. So we only have extra RenderPasses | 40 // RenderPass in each frame. So we only have extra RenderPasses |
| 43 // to merge when we have a non-root RenderPass present. | 41 // to merge when we have a non-root RenderPass present. |
| 44 return render_passes_in_draw_order_.size() > 1; | 42 return render_passes_in_draw_order_.size() > 1; |
| 45 } | 43 } |
| 46 | 44 |
| 47 static ResourceProvider::ResourceId ResourceRemapHelper( | 45 static ResourceProvider::ResourceId ResourceRemapHelper( |
| 48 bool* invalid_frame, | 46 bool* invalid_frame, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 94 const ReturnCallback& return_callback) { | 92 const ReturnCallback& return_callback) { |
| 95 if (child_id_) | 93 if (child_id_) |
| 96 return; | 94 return; |
| 97 | 95 |
| 98 ResourceProvider* resource_provider = layer_tree_impl()->resource_provider(); | 96 ResourceProvider* resource_provider = layer_tree_impl()->resource_provider(); |
| 99 child_id_ = resource_provider->CreateChild(return_callback); | 97 child_id_ = resource_provider->CreateChild(return_callback); |
| 100 own_child_id_ = true; | 98 own_child_id_ = true; |
| 101 } | 99 } |
| 102 | 100 |
| 103 void DelegatedRendererLayerImpl::SetFrameData( | 101 void DelegatedRendererLayerImpl::SetFrameData( |
| 104 scoped_ptr<DelegatedFrameData> frame_data, | 102 const DelegatedFrameData* frame_data, |
| 105 gfx::RectF damage_in_frame) { | 103 gfx::RectF damage_in_frame) { |
| 104 DCHECK(child_id_) << "CreateChildIdIfNeeded must be called first."; | |
| 106 DCHECK(frame_data); | 105 DCHECK(frame_data); |
| 107 DCHECK(child_id_) << "CreateChildIdIfNeeded must be called first."; | 106 DCHECK_NE(0u, frame_data->render_pass_list.size()); |
|
piman
2013/10/04 23:42:25
nit: DCHECK(!frame_data->render_pass_list.empty())
danakj
2013/10/07 21:57:39
Done.
| |
| 108 | |
| 109 // A frame with an empty root render pass is invalid. | 107 // A frame with an empty root render pass is invalid. |
| 110 DCHECK(frame_data->render_pass_list.empty() || | 108 DCHECK(!frame_data->render_pass_list.back()->output_rect.IsEmpty()); |
| 111 !frame_data->render_pass_list.back()->output_rect.IsEmpty()); | |
| 112 | 109 |
| 113 ResourceProvider* resource_provider = layer_tree_impl()->resource_provider(); | 110 ResourceProvider* resource_provider = layer_tree_impl()->resource_provider(); |
| 114 const ResourceProvider::ResourceIdMap& resource_map = | 111 const ResourceProvider::ResourceIdMap& resource_map = |
| 115 resource_provider->GetChildToParentMap(child_id_); | 112 resource_provider->GetChildToParentMap(child_id_); |
| 116 | 113 |
| 117 resource_provider->ReceiveFromChild(child_id_, frame_data->resource_list); | 114 resource_provider->ReceiveFromChild(child_id_, frame_data->resource_list); |
| 118 | 115 |
| 116 ScopedPtrVector<RenderPass> render_pass_list; | |
| 117 RenderPass::CopyAll(frame_data->render_pass_list, &render_pass_list); | |
| 118 | |
| 119 bool invalid_frame = false; | 119 bool invalid_frame = false; |
| 120 ResourceProvider::ResourceIdArray resources_in_frame; | 120 ResourceProvider::ResourceIdArray resources_in_frame; |
| 121 DrawQuad::ResourceIteratorCallback remap_resources_to_parent_callback = | 121 DrawQuad::ResourceIteratorCallback remap_resources_to_parent_callback = |
| 122 base::Bind(&ResourceRemapHelper, | 122 base::Bind(&ResourceRemapHelper, |
| 123 &invalid_frame, | 123 &invalid_frame, |
| 124 resource_map, | 124 resource_map, |
| 125 &resources_in_frame); | 125 &resources_in_frame); |
| 126 for (size_t i = 0; i < frame_data->render_pass_list.size(); ++i) { | 126 for (size_t i = 0; i < render_pass_list.size(); ++i) { |
| 127 RenderPass* pass = frame_data->render_pass_list[i]; | 127 RenderPass* pass = render_pass_list[i]; |
| 128 for (size_t j = 0; j < pass->quad_list.size(); ++j) { | 128 for (size_t j = 0; j < pass->quad_list.size(); ++j) { |
| 129 DrawQuad* quad = pass->quad_list[j]; | 129 DrawQuad* quad = pass->quad_list[j]; |
| 130 quad->IterateResources(remap_resources_to_parent_callback); | 130 quad->IterateResources(remap_resources_to_parent_callback); |
| 131 } | 131 } |
| 132 } | 132 } |
| 133 | 133 |
| 134 if (invalid_frame) { | 134 if (invalid_frame) { |
| 135 // Declare we are still using the last frame's resources. | 135 // Declare we are still using the last frame's resources. |
| 136 resource_provider->DeclareUsedResourcesFromChild(child_id_, resources_); | 136 resource_provider->DeclareUsedResourcesFromChild(child_id_, resources_); |
| 137 return; | 137 return; |
| 138 } | 138 } |
| 139 | 139 |
| 140 // Declare we are using the new frame's resources. | 140 // Declare we are using the new frame's resources. |
| 141 resources_.swap(resources_in_frame); | 141 resources_.swap(resources_in_frame); |
| 142 resource_provider->DeclareUsedResourcesFromChild(child_id_, resources_); | 142 resource_provider->DeclareUsedResourcesFromChild(child_id_, resources_); |
| 143 | 143 |
| 144 // Display size is already set so we can compute what the damage rect | 144 // Display size is already set so we can compute what the damage rect |
| 145 // will be in layer space. | 145 // will be in layer space. |
| 146 if (!frame_data->render_pass_list.empty()) { | 146 RenderPass* new_root_pass = render_pass_list.back(); |
| 147 RenderPass* new_root_pass = frame_data->render_pass_list.back(); | 147 gfx::Size frame_size = new_root_pass->output_rect.size(); |
| 148 gfx::RectF damage_in_layer = MathUtil::MapClippedRect( | 148 gfx::RectF damage_in_layer = MathUtil::MapClippedRect( |
| 149 DelegatedFrameToLayerSpaceTransform( | 149 DelegatedFrameToLayerSpaceTransform(frame_size), damage_in_frame); |
| 150 new_root_pass->output_rect.size()), | 150 set_update_rect(gfx::UnionRects(update_rect(), damage_in_layer)); |
| 151 damage_in_frame); | |
| 152 set_update_rect(gfx::UnionRects(update_rect(), damage_in_layer)); | |
| 153 } | |
| 154 | 151 |
| 155 // Save the remapped quads on the layer. This steals the quads and render | 152 SetRenderPasses(&render_pass_list); |
| 156 // passes from the frame_data. | |
| 157 SetRenderPasses(&frame_data->render_pass_list); | |
| 158 have_render_passes_to_push_ = true; | 153 have_render_passes_to_push_ = true; |
| 159 } | 154 } |
| 160 | 155 |
| 161 void DelegatedRendererLayerImpl::SetDisplaySize(gfx::Size size) { | 156 void DelegatedRendererLayerImpl::SetDisplaySize(gfx::Size size) { |
| 162 if (display_size_ == size) | 157 if (display_size_ == size) |
| 163 return; | 158 return; |
| 164 display_size_ = size; | 159 display_size_ = size; |
| 165 NoteLayerPropertyChanged(); | 160 NoteLayerPropertyChanged(); |
| 166 } | 161 } |
| 167 | 162 |
| 168 void DelegatedRendererLayerImpl::SetRenderPasses( | 163 void DelegatedRendererLayerImpl::SetRenderPasses( |
| 169 ScopedPtrVector<RenderPass>* render_passes_in_draw_order) { | 164 ScopedPtrVector<RenderPass>* render_passes_in_draw_order) { |
| 170 ClearRenderPasses(); | 165 ClearRenderPasses(); |
| 171 | 166 |
| 172 for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) { | 167 for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) { |
| 173 ScopedPtrVector<RenderPass>::iterator to_take = | 168 ScopedPtrVector<RenderPass>::iterator to_take = |
| 174 render_passes_in_draw_order->begin() + i; | 169 render_passes_in_draw_order->begin() + i; |
| 175 render_passes_index_by_id_.insert( | 170 render_passes_index_by_id_.insert( |
| 176 std::pair<RenderPass::Id, int>((*to_take)->id, i)); | 171 std::pair<RenderPass::Id, int>((*to_take)->id, i)); |
| 177 scoped_ptr<RenderPass> taken_render_pass = | 172 scoped_ptr<RenderPass> taken_render_pass = |
| 178 render_passes_in_draw_order->take(to_take); | 173 render_passes_in_draw_order->take(to_take); |
| 179 render_passes_in_draw_order_.push_back(taken_render_pass.Pass()); | 174 render_passes_in_draw_order_.push_back(taken_render_pass.Pass()); |
| 180 } | 175 } |
| 181 | 176 |
| 182 // Give back an empty array instead of nulls. | 177 // Give back an empty array instead of nulls. |
| 183 render_passes_in_draw_order->clear(); | 178 render_passes_in_draw_order->clear(); |
| 184 } | 179 } |
| 185 | 180 |
| 186 void DelegatedRendererLayerImpl::ClearRenderPasses() { | 181 void DelegatedRendererLayerImpl::ClearRenderPasses() { |
| 187 // TODO(danakj): Release the resources back to the nested compositor. | |
| 188 render_passes_index_by_id_.clear(); | 182 render_passes_index_by_id_.clear(); |
| 189 render_passes_in_draw_order_.clear(); | 183 render_passes_in_draw_order_.clear(); |
| 190 } | 184 } |
| 191 | 185 |
| 192 scoped_ptr<LayerImpl> DelegatedRendererLayerImpl::CreateLayerImpl( | 186 scoped_ptr<LayerImpl> DelegatedRendererLayerImpl::CreateLayerImpl( |
| 193 LayerTreeImpl* tree_impl) { | 187 LayerTreeImpl* tree_impl) { |
| 194 return DelegatedRendererLayerImpl::Create( | 188 return DelegatedRendererLayerImpl::Create( |
| 195 tree_impl, id()).PassAs<LayerImpl>(); | 189 tree_impl, id()).PassAs<LayerImpl>(); |
| 196 } | 190 } |
| 197 | 191 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 264 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) | 258 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) |
| 265 return false; | 259 return false; |
| 266 return LayerImpl::WillDraw(draw_mode, resource_provider); | 260 return LayerImpl::WillDraw(draw_mode, resource_provider); |
| 267 } | 261 } |
| 268 | 262 |
| 269 void DelegatedRendererLayerImpl::AppendQuads( | 263 void DelegatedRendererLayerImpl::AppendQuads( |
| 270 QuadSink* quad_sink, | 264 QuadSink* quad_sink, |
| 271 AppendQuadsData* append_quads_data) { | 265 AppendQuadsData* append_quads_data) { |
| 272 AppendRainbowDebugBorder(quad_sink, append_quads_data); | 266 AppendRainbowDebugBorder(quad_sink, append_quads_data); |
| 273 | 267 |
| 268 // This list will be empty after a lost context until a new frame arrives. | |
| 274 if (render_passes_in_draw_order_.empty()) | 269 if (render_passes_in_draw_order_.empty()) |
| 275 return; | 270 return; |
| 276 | 271 |
| 277 RenderPass::Id target_render_pass_id = append_quads_data->render_pass_id; | 272 RenderPass::Id target_render_pass_id = append_quads_data->render_pass_id; |
| 278 | 273 |
| 279 const RenderPass* root_delegated_render_pass = | 274 const RenderPass* root_delegated_render_pass = |
| 280 render_passes_in_draw_order_.back(); | 275 render_passes_in_draw_order_.back(); |
| 281 | 276 |
| 282 DCHECK(root_delegated_render_pass->output_rect.origin().IsOrigin()); | 277 DCHECK(root_delegated_render_pass->output_rect.origin().IsOrigin()); |
| 283 gfx::Size frame_size = root_delegated_render_pass->output_rect.size(); | 278 gfx::Size frame_size = root_delegated_render_pass->output_rect.size(); |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 474 | 469 |
| 475 if (own_child_id_) { | 470 if (own_child_id_) { |
| 476 ResourceProvider* provider = layer_tree_impl()->resource_provider(); | 471 ResourceProvider* provider = layer_tree_impl()->resource_provider(); |
| 477 provider->DestroyChild(child_id_); | 472 provider->DestroyChild(child_id_); |
| 478 } | 473 } |
| 479 | 474 |
| 480 child_id_ = 0; | 475 child_id_ = 0; |
| 481 } | 476 } |
| 482 | 477 |
| 483 } // namespace cc | 478 } // namespace cc |
| OLD | NEW |