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