| 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 34a1cd86755949fbe946dba7057a7fc647aba072..a40246ec196bbe642064f6c84a6f7ec7500c7deb 100644 | 
| --- a/cc/layers/delegated_renderer_layer_impl.cc | 
| +++ b/cc/layers/delegated_renderer_layer_impl.cc | 
| @@ -33,9 +33,7 @@ DelegatedRendererLayerImpl::~DelegatedRendererLayerImpl() { | 
| ClearChildId(); | 
| } | 
|  | 
| -bool DelegatedRendererLayerImpl::HasDelegatedContent() const { | 
| -  return !render_passes_in_draw_order_.empty(); | 
| -} | 
| +bool DelegatedRendererLayerImpl::HasDelegatedContent() const { return true; } | 
|  | 
| bool DelegatedRendererLayerImpl::HasContributingDelegatedRenderPasses() const { | 
| // The root RenderPass for the layer is merged with its target | 
| @@ -101,14 +99,13 @@ void DelegatedRendererLayerImpl::CreateChildIdIfNeeded( | 
| } | 
|  | 
| void DelegatedRendererLayerImpl::SetFrameData( | 
| -    scoped_ptr<DelegatedFrameData> frame_data, | 
| +    const DelegatedFrameData* frame_data, | 
| gfx::RectF damage_in_frame) { | 
| -  DCHECK(frame_data); | 
| DCHECK(child_id_) << "CreateChildIdIfNeeded must be called first."; | 
| - | 
| +  DCHECK(frame_data); | 
| +  DCHECK_NE(0u, frame_data->render_pass_list.size()); | 
| // A frame with an empty root render pass is invalid. | 
| -  DCHECK(frame_data->render_pass_list.empty() || | 
| -         !frame_data->render_pass_list.back()->output_rect.IsEmpty()); | 
| +  DCHECK(!frame_data->render_pass_list.back()->output_rect.IsEmpty()); | 
|  | 
| ResourceProvider* resource_provider = layer_tree_impl()->resource_provider(); | 
| const ResourceProvider::ResourceIdMap& resource_map = | 
| @@ -116,6 +113,9 @@ void DelegatedRendererLayerImpl::SetFrameData( | 
|  | 
| resource_provider->ReceiveFromChild(child_id_, frame_data->resource_list); | 
|  | 
| +  ScopedPtrVector<RenderPass> render_pass_list; | 
| +  RenderPass::CopyAll(frame_data->render_pass_list, &render_pass_list); | 
| + | 
| bool invalid_frame = false; | 
| ResourceProvider::ResourceIdArray resources_in_frame; | 
| DrawQuad::ResourceIteratorCallback remap_resources_to_parent_callback = | 
| @@ -123,8 +123,8 @@ void DelegatedRendererLayerImpl::SetFrameData( | 
| &invalid_frame, | 
| resource_map, | 
| &resources_in_frame); | 
| -  for (size_t i = 0; i < frame_data->render_pass_list.size(); ++i) { | 
| -    RenderPass* pass = frame_data->render_pass_list[i]; | 
| +  for (size_t i = 0; i < render_pass_list.size(); ++i) { | 
| +    RenderPass* pass = render_pass_list[i]; | 
| for (size_t j = 0; j < pass->quad_list.size(); ++j) { | 
| DrawQuad* quad = pass->quad_list[j]; | 
| quad->IterateResources(remap_resources_to_parent_callback); | 
| @@ -143,18 +143,13 @@ void DelegatedRendererLayerImpl::SetFrameData( | 
|  | 
| // Display size is already set so we can compute what the damage rect | 
| // will be in layer space. | 
| -  if (!frame_data->render_pass_list.empty()) { | 
| -    RenderPass* new_root_pass = frame_data->render_pass_list.back(); | 
| -    gfx::RectF damage_in_layer = MathUtil::MapClippedRect( | 
| -        DelegatedFrameToLayerSpaceTransform( | 
| -            new_root_pass->output_rect.size()), | 
| -        damage_in_frame); | 
| -    set_update_rect(gfx::UnionRects(update_rect(), damage_in_layer)); | 
| -  } | 
| +  RenderPass* new_root_pass = render_pass_list.back(); | 
| +  gfx::Size frame_size = new_root_pass->output_rect.size(); | 
| +  gfx::RectF damage_in_layer = MathUtil::MapClippedRect( | 
| +      DelegatedFrameToLayerSpaceTransform(frame_size), damage_in_frame); | 
| +  set_update_rect(gfx::UnionRects(update_rect(), damage_in_layer)); | 
|  | 
| -  // Save the remapped quads on the layer. This steals the quads and render | 
| -  // passes from the frame_data. | 
| -  SetRenderPasses(&frame_data->render_pass_list); | 
| +  SetRenderPasses(&render_pass_list); | 
| have_render_passes_to_push_ = true; | 
| } | 
|  | 
| @@ -184,7 +179,6 @@ void DelegatedRendererLayerImpl::SetRenderPasses( | 
| } | 
|  | 
| void DelegatedRendererLayerImpl::ClearRenderPasses() { | 
| -  // TODO(danakj): Release the resources back to the nested compositor. | 
| render_passes_index_by_id_.clear(); | 
| render_passes_in_draw_order_.clear(); | 
| } | 
| @@ -271,6 +265,7 @@ void DelegatedRendererLayerImpl::AppendQuads( | 
| AppendQuadsData* append_quads_data) { | 
| AppendRainbowDebugBorder(quad_sink, append_quads_data); | 
|  | 
| +  // This list will be empty after a lost context until a new frame arrives. | 
| if (render_passes_in_draw_order_.empty()) | 
| return; | 
|  | 
|  |