Index: cc/layers/delegated_renderer_layer_impl.cc |
diff --git a/cc/layers/delegated_renderer_layer_impl.cc b/cc/layers/delegated_renderer_layer_impl.cc |
index 17a0c1c95ac25b8efe7c84a52749ac4af74bdaa7..a8e71c573f0f02471a2ef7ad56026c1ad9d05d6f 100644 |
--- a/cc/layers/delegated_renderer_layer_impl.cc |
+++ b/cc/layers/delegated_renderer_layer_impl.cc |
@@ -240,13 +240,21 @@ RenderPass::Id DelegatedRendererLayerImpl::NextContributingRenderPassId( |
return RenderPass::Id(previous.layer_id, previous.index + 1); |
} |
-RenderPass::Id DelegatedRendererLayerImpl::ConvertDelegatedRenderPassId( |
- RenderPass::Id delegated_render_pass_id) const { |
+// Returns |true| if the delegated_render_pass_id is part of the current |
+// 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.
|
+bool DelegatedRendererLayerImpl::ConvertDelegatedRenderPassId( |
+ RenderPass::Id delegated_render_pass_id, |
+ RenderPass::Id* output_render_pass_id) const { |
base::hash_map<RenderPass::Id, int>::const_iterator found = |
render_passes_index_by_id_.find(delegated_render_pass_id); |
- DCHECK(found != render_passes_index_by_id_.end()); |
+ if (found == render_passes_index_by_id_.end()) { |
+ // Be robust against a RenderPass id that isn't part of the frame. |
+ return false; |
+ } |
unsigned delegated_render_pass_index = found->second; |
- return RenderPass::Id(id(), IndexToId(delegated_render_pass_index)); |
+ *output_render_pass_id = |
+ RenderPass::Id(id(), IndexToId(delegated_render_pass_index)); |
+ return true; |
} |
void DelegatedRendererLayerImpl::AppendContributingRenderPasses( |
@@ -254,10 +262,14 @@ void DelegatedRendererLayerImpl::AppendContributingRenderPasses( |
DCHECK(HasContributingDelegatedRenderPasses()); |
for (size_t i = 0; i < render_passes_in_draw_order_.size() - 1; ++i) { |
- RenderPass::Id output_render_pass_id = |
- ConvertDelegatedRenderPassId(render_passes_in_draw_order_[i]->id); |
+ RenderPass::Id output_render_pass_id(-1, -1); |
+ bool present = |
+ ConvertDelegatedRenderPassId(render_passes_in_draw_order_[i]->id, |
+ &output_render_pass_id); |
// Don't clash with the RenderPass we generate if we own a RenderSurface. |
+ DCHECK(present) << render_passes_in_draw_order_[i]->id.layer_id << ", " |
+ << render_passes_in_draw_order_[i]->id.index; |
DCHECK_GT(output_render_pass_id.index, 0); |
render_pass_sink->AppendRenderPass( |
@@ -447,18 +459,26 @@ void DelegatedRendererLayerImpl::AppendRenderPassQuads( |
} else { |
RenderPass::Id delegated_contributing_render_pass_id = |
RenderPassDrawQuad::MaterialCast(delegated_quad)->render_pass_id; |
- RenderPass::Id output_contributing_render_pass_id = |
- ConvertDelegatedRenderPassId(delegated_contributing_render_pass_id); |
- DCHECK(output_contributing_render_pass_id != |
- append_quads_data->render_pass_id); |
- |
- output_quad = RenderPassDrawQuad::MaterialCast(delegated_quad)->Copy( |
- output_shared_quad_state, |
- output_contributing_render_pass_id).PassAs<DrawQuad>(); |
+ RenderPass::Id output_contributing_render_pass_id(-1, -1); |
+ |
+ bool present = |
+ ConvertDelegatedRenderPassId(delegated_contributing_render_pass_id, |
+ &output_contributing_render_pass_id); |
+ |
+ // The frame may have a RenderPassDrawQuad that points to a RenderPass not |
+ // part of the frame. Just ignore these quads. |
+ if (present) { |
+ DCHECK(output_contributing_render_pass_id != |
+ append_quads_data->render_pass_id); |
+ |
+ output_quad = RenderPassDrawQuad::MaterialCast(delegated_quad)->Copy( |
+ output_shared_quad_state, |
+ output_contributing_render_pass_id).PassAs<DrawQuad>(); |
+ } |
} |
- DCHECK(output_quad.get()); |
- quad_sink->Append(output_quad.Pass(), append_quads_data); |
+ if (output_quad) |
+ quad_sink->Append(output_quad.Pass(), append_quads_data); |
} |
} |