Index: cc/trees/layer_tree_host_impl.cc |
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc |
index eddea9a356101a67202fa156711a361f370d806b..d05f610810e3dffb3c0437c53b9d9ecf8ce363f9 100644 |
--- a/cc/trees/layer_tree_host_impl.cc |
+++ b/cc/trees/layer_tree_host_impl.cc |
@@ -577,6 +577,9 @@ bool LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) { |
// due to an impl-animation, we drop the frame to avoid flashing due to the |
// texture suddenly appearing in the future. |
bool draw_frame = true; |
+ // When we have a copy request for a layer, we need to draw no matter |
+ // what, as the layer may disappear after this frame. |
+ bool have_copy_request = false; |
int layers_drawn = 0; |
@@ -595,7 +598,12 @@ bool LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) { |
AppendQuadsData append_quads_data(target_render_pass->id); |
- if (it.represents_contributing_render_surface()) { |
+ if (it.represents_target_render_surface()) { |
+ if (it->HasRequestCopyCallback()) { |
+ have_copy_request = true; |
+ it->TakeRequestCopyCallbacks(&target_render_pass->copy_callbacks); |
+ } |
+ } else if (it.represents_contributing_render_surface()) { |
RenderPass::Id contributing_render_pass_id = |
it->render_surface()->RenderPassId(); |
RenderPass* contributing_render_pass = |
@@ -671,6 +679,9 @@ bool LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) { |
occlusion_tracker.LeaveLayer(it); |
} |
+ if (have_copy_request) |
+ draw_frame = true; |
+ |
rendering_stats_instrumentation_->AddLayersDrawn(layers_drawn); |
#ifndef NDEBUG |
@@ -693,6 +704,8 @@ bool LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) { |
if (draw_frame) |
occlusion_tracker.overdraw_metrics()->RecordMetrics(this); |
+ else |
+ DCHECK(!have_copy_request); |
RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame); |
renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes); |