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 |