Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1333)

Side by Side Diff: cc/layers/delegated_renderer_layer_impl.cc

Issue 23891003: cc: Be robust against invalid RenderPassDrawQuads. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: missing-render-pass: nits Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « cc/layers/delegated_renderer_layer_impl.h ('k') | cc/layers/delegated_renderer_layer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698