Index: cc/trees/single_thread_proxy.cc |
diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc |
index 484acb6486f6591c6b48225440b8d5f8cc15703b..ef266d1faa195eb64ea1c748493ae71fc6917b98 100644 |
--- a/cc/trees/single_thread_proxy.cc |
+++ b/cc/trees/single_thread_proxy.cc |
@@ -26,7 +26,8 @@ SingleThreadProxy::SingleThreadProxy(LayerTreeHost* layer_tree_host) |
layer_tree_host_(layer_tree_host), |
created_offscreen_context_provider_(false), |
next_frame_is_newly_committed_frame_(false), |
- inside_draw_(false) { |
+ inside_draw_(false), |
+ can_cancel_commit_(false) { |
TRACE_EVENT0("cc", "SingleThreadProxy::SingleThreadProxy"); |
DCHECK(Proxy::IsMainThread()); |
DCHECK(layer_tree_host); |
@@ -171,6 +172,11 @@ void SingleThreadProxy::SetNeedsAnimate() { |
NOTREACHED(); |
} |
+void SingleThreadProxy::SetNeedsUpdateLayers() { |
+ DCHECK(Proxy::IsMainThread()); |
+ layer_tree_host_->ScheduleComposite(); |
+} |
+ |
void SingleThreadProxy::DoCommit(scoped_ptr<ResourceUpdateQueue> queue) { |
DCHECK(Proxy::IsMainThread()); |
// Commit immediately. |
@@ -219,6 +225,7 @@ void SingleThreadProxy::DoCommit(scoped_ptr<ResourceUpdateQueue> queue) { |
void SingleThreadProxy::SetNeedsCommit() { |
DCHECK(Proxy::IsMainThread()); |
+ can_cancel_commit_ = false; |
layer_tree_host_->ScheduleComposite(); |
} |
@@ -262,6 +269,9 @@ void SingleThreadProxy::OnCanDrawStateChanged(bool can_draw) { |
} |
void SingleThreadProxy::SetNeedsRedrawOnImplThread() { |
+ // Since commit+draw happens in a single pass for this proxy, |
+ // this also prevents cancelling a commit. |
+ can_cancel_commit_ = false; |
layer_tree_host_->ScheduleComposite(); |
} |
@@ -400,11 +410,21 @@ bool SingleThreadProxy::CommitAndComposite( |
->UnlinkAndClearEvictedBackings(); |
} |
+ // Reset this flag for the next commit. It's possible that UpdateLayers |
+ // will force another commit, so record this flag. |
+ bool can_cancel_this_commit = can_cancel_commit_ && !for_readback; |
+ can_cancel_commit_ = true; |
+ |
scoped_ptr<ResourceUpdateQueue> queue = |
make_scoped_ptr(new ResourceUpdateQueue); |
- layer_tree_host_->UpdateLayers( |
+ bool updated = layer_tree_host_->UpdateLayers( |
queue.get(), layer_tree_host_impl_->memory_allocation_limit_bytes()); |
+ if (!updated && can_cancel_this_commit) { |
+ TRACE_EVENT0("cc", "EarlyOut_NoUpdates"); |
+ return false; |
+ } |
+ |
layer_tree_host_->WillCommit(); |
DoCommit(queue.Pass()); |
bool result = DoComposite(offscreen_context_provider, |
@@ -413,6 +433,7 @@ bool SingleThreadProxy::CommitAndComposite( |
for_readback, |
frame); |
layer_tree_host_->DidBeginFrame(); |
+ |
return result; |
} |