| 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 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 RenderPass::Id DelegatedRendererLayerImpl::FirstContributingRenderPassId() | 233 RenderPass::Id DelegatedRendererLayerImpl::FirstContributingRenderPassId() |
| 234 const { | 234 const { |
| 235 return RenderPass::Id(id(), IndexToId(0)); | 235 return RenderPass::Id(id(), IndexToId(0)); |
| 236 } | 236 } |
| 237 | 237 |
| 238 RenderPass::Id DelegatedRendererLayerImpl::NextContributingRenderPassId( | 238 RenderPass::Id DelegatedRendererLayerImpl::NextContributingRenderPassId( |
| 239 RenderPass::Id previous) const { | 239 RenderPass::Id previous) const { |
| 240 return RenderPass::Id(previous.layer_id, previous.index + 1); | 240 return RenderPass::Id(previous.layer_id, previous.index + 1); |
| 241 } | 241 } |
| 242 | 242 |
| 243 RenderPass::Id DelegatedRendererLayerImpl::ConvertDelegatedRenderPassId( | 243 bool DelegatedRendererLayerImpl::ConvertDelegatedRenderPassId( |
| 244 RenderPass::Id delegated_render_pass_id) const { | 244 RenderPass::Id delegated_render_pass_id, |
| 245 RenderPass::Id* output_render_pass_id) const { |
| 245 base::hash_map<RenderPass::Id, int>::const_iterator found = | 246 base::hash_map<RenderPass::Id, int>::const_iterator found = |
| 246 render_passes_index_by_id_.find(delegated_render_pass_id); | 247 render_passes_index_by_id_.find(delegated_render_pass_id); |
| 247 DCHECK(found != render_passes_index_by_id_.end()); | 248 if (found == render_passes_index_by_id_.end()) { |
| 249 // Be robust against a RenderPass id that isn't part of the frame. |
| 250 return false; |
| 251 } |
| 248 unsigned delegated_render_pass_index = found->second; | 252 unsigned delegated_render_pass_index = found->second; |
| 249 return RenderPass::Id(id(), IndexToId(delegated_render_pass_index)); | 253 *output_render_pass_id = |
| 254 RenderPass::Id(id(), IndexToId(delegated_render_pass_index)); |
| 255 return true; |
| 250 } | 256 } |
| 251 | 257 |
| 252 void DelegatedRendererLayerImpl::AppendContributingRenderPasses( | 258 void DelegatedRendererLayerImpl::AppendContributingRenderPasses( |
| 253 RenderPassSink* render_pass_sink) { | 259 RenderPassSink* render_pass_sink) { |
| 254 DCHECK(HasContributingDelegatedRenderPasses()); | 260 DCHECK(HasContributingDelegatedRenderPasses()); |
| 255 | 261 |
| 256 for (size_t i = 0; i < render_passes_in_draw_order_.size() - 1; ++i) { | 262 for (size_t i = 0; i < render_passes_in_draw_order_.size() - 1; ++i) { |
| 257 RenderPass::Id output_render_pass_id = | 263 RenderPass::Id output_render_pass_id(-1, -1); |
| 258 ConvertDelegatedRenderPassId(render_passes_in_draw_order_[i]->id); | 264 bool present = |
| 265 ConvertDelegatedRenderPassId(render_passes_in_draw_order_[i]->id, |
| 266 &output_render_pass_id); |
| 259 | 267 |
| 260 // Don't clash with the RenderPass we generate if we own a RenderSurface. | 268 // Don't clash with the RenderPass we generate if we own a RenderSurface. |
| 269 DCHECK(present) << render_passes_in_draw_order_[i]->id.layer_id << ", " |
| 270 << render_passes_in_draw_order_[i]->id.index; |
| 261 DCHECK_GT(output_render_pass_id.index, 0); | 271 DCHECK_GT(output_render_pass_id.index, 0); |
| 262 | 272 |
| 263 render_pass_sink->AppendRenderPass( | 273 render_pass_sink->AppendRenderPass( |
| 264 render_passes_in_draw_order_[i]->Copy(output_render_pass_id)); | 274 render_passes_in_draw_order_[i]->Copy(output_render_pass_id)); |
| 265 } | 275 } |
| 266 } | 276 } |
| 267 | 277 |
| 268 bool DelegatedRendererLayerImpl::WillDraw(DrawMode draw_mode, | 278 bool DelegatedRendererLayerImpl::WillDraw(DrawMode draw_mode, |
| 269 ResourceProvider* resource_provider) { | 279 ResourceProvider* resource_provider) { |
| 270 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) | 280 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 440 } | 450 } |
| 441 } | 451 } |
| 442 DCHECK(output_shared_quad_state); | 452 DCHECK(output_shared_quad_state); |
| 443 | 453 |
| 444 scoped_ptr<DrawQuad> output_quad; | 454 scoped_ptr<DrawQuad> output_quad; |
| 445 if (delegated_quad->material != DrawQuad::RENDER_PASS) { | 455 if (delegated_quad->material != DrawQuad::RENDER_PASS) { |
| 446 output_quad = delegated_quad->Copy(output_shared_quad_state); | 456 output_quad = delegated_quad->Copy(output_shared_quad_state); |
| 447 } else { | 457 } else { |
| 448 RenderPass::Id delegated_contributing_render_pass_id = | 458 RenderPass::Id delegated_contributing_render_pass_id = |
| 449 RenderPassDrawQuad::MaterialCast(delegated_quad)->render_pass_id; | 459 RenderPassDrawQuad::MaterialCast(delegated_quad)->render_pass_id; |
| 450 RenderPass::Id output_contributing_render_pass_id = | 460 RenderPass::Id output_contributing_render_pass_id(-1, -1); |
| 451 ConvertDelegatedRenderPassId(delegated_contributing_render_pass_id); | |
| 452 DCHECK(output_contributing_render_pass_id != | |
| 453 append_quads_data->render_pass_id); | |
| 454 | 461 |
| 455 output_quad = RenderPassDrawQuad::MaterialCast(delegated_quad)->Copy( | 462 bool present = |
| 456 output_shared_quad_state, | 463 ConvertDelegatedRenderPassId(delegated_contributing_render_pass_id, |
| 457 output_contributing_render_pass_id).PassAs<DrawQuad>(); | 464 &output_contributing_render_pass_id); |
| 465 |
| 466 // The frame may have a RenderPassDrawQuad that points to a RenderPass not |
| 467 // part of the frame. Just ignore these quads. |
| 468 if (present) { |
| 469 DCHECK(output_contributing_render_pass_id != |
| 470 append_quads_data->render_pass_id); |
| 471 |
| 472 output_quad = RenderPassDrawQuad::MaterialCast(delegated_quad)->Copy( |
| 473 output_shared_quad_state, |
| 474 output_contributing_render_pass_id).PassAs<DrawQuad>(); |
| 475 } |
| 458 } | 476 } |
| 459 DCHECK(output_quad.get()); | |
| 460 | 477 |
| 461 quad_sink->Append(output_quad.Pass(), append_quads_data); | 478 if (output_quad) |
| 479 quad_sink->Append(output_quad.Pass(), append_quads_data); |
| 462 } | 480 } |
| 463 } | 481 } |
| 464 | 482 |
| 465 const char* DelegatedRendererLayerImpl::LayerTypeAsString() const { | 483 const char* DelegatedRendererLayerImpl::LayerTypeAsString() const { |
| 466 return "cc::DelegatedRendererLayerImpl"; | 484 return "cc::DelegatedRendererLayerImpl"; |
| 467 } | 485 } |
| 468 | 486 |
| 469 void DelegatedRendererLayerImpl::CreateChildIdIfNeeded() { | 487 void DelegatedRendererLayerImpl::CreateChildIdIfNeeded() { |
| 470 if (child_id_) | 488 if (child_id_) |
| 471 return; | 489 return; |
| 472 | 490 |
| 473 ResourceProvider* resource_provider = layer_tree_impl()->resource_provider(); | 491 ResourceProvider* resource_provider = layer_tree_impl()->resource_provider(); |
| 474 child_id_ = resource_provider->CreateChild(); | 492 child_id_ = resource_provider->CreateChild(); |
| 475 own_child_id_ = true; | 493 own_child_id_ = true; |
| 476 } | 494 } |
| 477 | 495 |
| 478 void DelegatedRendererLayerImpl::ClearChildId() { | 496 void DelegatedRendererLayerImpl::ClearChildId() { |
| 479 if (!child_id_) | 497 if (!child_id_) |
| 480 return; | 498 return; |
| 481 | 499 |
| 482 if (own_child_id_) { | 500 if (own_child_id_) { |
| 483 ResourceProvider* provider = layer_tree_impl()->resource_provider(); | 501 ResourceProvider* provider = layer_tree_impl()->resource_provider(); |
| 484 provider->DestroyChild(child_id_); | 502 provider->DestroyChild(child_id_); |
| 485 } | 503 } |
| 486 | 504 |
| 487 child_id_ = 0; | 505 child_id_ = 0; |
| 488 } | 506 } |
| 489 | 507 |
| 490 } // namespace cc | 508 } // namespace cc |
| OLD | NEW |