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

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: 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 // 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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698