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 |