Index: cc/thread_proxy.cc |
diff --git a/cc/thread_proxy.cc b/cc/thread_proxy.cc |
index 666c03f7ca5072eb76d75d7eb41d71e46a91a612..e8229ca20bf6ee0bbd18fa754bdc7e200a1b4885 100644 |
--- a/cc/thread_proxy.cc |
+++ b/cc/thread_proxy.cc |
@@ -53,6 +53,8 @@ ThreadProxy::ThreadProxy(LayerTreeHost* layerTreeHost) |
, m_nextFrameIsNewlyCommittedFrameOnImplThread(false) |
, m_renderVSyncEnabled(layerTreeHost->settings().renderVSyncEnabled) |
, m_totalCommitCount(0) |
+ , m_deferCommits(false) |
+ , m_deferredCommitPending(false) |
{ |
TRACE_EVENT0("cc", "ThreadProxy::ThreadProxy"); |
DCHECK(isMainThread()); |
@@ -70,6 +72,7 @@ bool ThreadProxy::compositeAndReadback(void *pixels, const IntRect& rect) |
TRACE_EVENT0("cc", "ThreadPRoxy::compositeAndReadback"); |
DCHECK(isMainThread()); |
DCHECK(m_layerTreeHost); |
+ DCHECK(!m_deferCommits); |
if (!m_layerTreeHost->initializeRendererIfNeeded()) { |
TRACE_EVENT0("cc", "compositeAndReadback_EarlyOut_LR_Uninitialized"); |
@@ -131,6 +134,7 @@ void ThreadProxy::requestStartPageScaleAnimationOnImplThread(IntSize targetPosit |
void ThreadProxy::finishAllRendering() |
{ |
DCHECK(Proxy::isMainThread()); |
+ DCHECK(!m_deferCommits); |
// Make sure all GL drawing is finished on the impl thread. |
DebugScopedSetMainThreadBlocked mainThreadBlocked; |
@@ -386,6 +390,23 @@ void ThreadProxy::setNeedsRedraw() |
Proxy::implThread()->postTask(createThreadTask(this, &ThreadProxy::setNeedsRedrawOnImplThread)); |
} |
+void ThreadProxy::setDeferCommits(bool deferCommits) |
+{ |
+ DCHECK(isMainThread()); |
+ DCHECK_NE(m_deferCommits, deferCommits); |
+ m_deferCommits = deferCommits; |
+ |
+ if (m_deferCommits) |
+ TRACE_EVENT_ASYNC_BEGIN0("cc", "ThreadProxy::setDeferCommits", this); |
+ else |
+ TRACE_EVENT_ASYNC_END0("cc", "ThreadProxy::setDeferCommits", this); |
+ |
+ if (!m_deferCommits && m_deferredCommitPending) { |
+ m_deferredCommitPending = false; |
+ m_mainThreadProxy->postTask(createThreadTask(this, &ThreadProxy::beginFrame)); |
+ } |
+} |
+ |
bool ThreadProxy::commitRequested() const |
{ |
DCHECK(isMainThread()); |
@@ -500,6 +521,13 @@ void ThreadProxy::beginFrame() |
if (!m_layerTreeHost) |
return; |
+ if (m_deferCommits) { |
+ m_deferredCommitPending = true; |
+ m_layerTreeHost->didDeferCommit(); |
+ TRACE_EVENT0("cc", "EarlyOut_DeferCommits"); |
+ return; |
+ } |
+ |
if (!m_pendingBeginFrameRequest) { |
TRACE_EVENT0("cc", "EarlyOut_StaleBeginFrameMessage"); |
return; |