Index: cc/trees/single_thread_proxy.cc |
diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc |
index 8e7d46671e2a0f1cc7c9ae2dd40388959e6c8fc0..6e3aff1fd21fbe2bddd826fd22ab1b4f77e782b8 100644 |
--- a/cc/trees/single_thread_proxy.cc |
+++ b/cc/trees/single_thread_proxy.cc |
@@ -60,6 +60,7 @@ bool SingleThreadProxy::CompositeAndReadback(void* pixels, gfx::Rect rect) { |
LayerTreeHostImpl::FrameData frame; |
if (!CommitAndComposite(base::TimeTicks::Now(), |
device_viewport_damage_rect, |
+ true, // for_readback |
&frame)) |
return false; |
@@ -337,6 +338,7 @@ void SingleThreadProxy::CompositeImmediately(base::TimeTicks frame_begin_time) { |
LayerTreeHostImpl::FrameData frame; |
if (CommitAndComposite(frame_begin_time, |
device_viewport_damage_rect, |
+ false, // for_readback |
&frame)) { |
layer_tree_host_impl_->SwapBuffers(frame); |
DidSwapFrame(); |
@@ -370,6 +372,7 @@ void SingleThreadProxy::ForceSerializeOnSwapBuffers() { |
bool SingleThreadProxy::CommitAndComposite( |
base::TimeTicks frame_begin_time, |
gfx::Rect device_viewport_damage_rect, |
+ bool for_readback, |
LayerTreeHostImpl::FrameData* frame) { |
DCHECK(Proxy::IsMainThread()); |
@@ -397,6 +400,7 @@ bool SingleThreadProxy::CommitAndComposite( |
bool result = DoComposite(offscreen_context_provider, |
frame_begin_time, |
device_viewport_damage_rect, |
+ for_readback, |
frame); |
layer_tree_host_->DidBeginFrame(); |
return result; |
@@ -412,6 +416,7 @@ bool SingleThreadProxy::DoComposite( |
scoped_refptr<cc::ContextProvider> offscreen_context_provider, |
base::TimeTicks frame_begin_time, |
gfx::Rect device_viewport_damage_rect, |
+ bool for_readback, |
LayerTreeHostImpl::FrameData* frame) { |
DCHECK(!layer_tree_host_->output_surface_lost()); |
@@ -423,11 +428,13 @@ bool SingleThreadProxy::DoComposite( |
layer_tree_host_impl_->resource_provider()-> |
set_offscreen_context_provider(offscreen_context_provider); |
+ bool can_do_readback = layer_tree_host_impl_->renderer()->CanReadPixels(); |
+ |
// We guard PrepareToDraw() with CanDraw() because it always returns a valid |
// frame, so can only be used when such a frame is possible. Since |
// DrawLayers() depends on the result of PrepareToDraw(), it is guarded on |
// CanDraw() as well. |
- if (!ShouldComposite()) { |
+ if (!ShouldComposite() || (for_readback && !can_do_readback)) { |
layer_tree_host_impl_->UpdateBackgroundAnimateTicking(true); |
return false; |
} |