diff options
author | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-27 00:44:28 +0000 |
---|---|---|
committer | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-27 00:44:28 +0000 |
commit | 6b16679e5700658051a581bb61b37e5b542ef818 (patch) | |
tree | 9e9ed110b8a2685391959a77614f9fc18b4afe5f /cc/thread_proxy.cc | |
parent | ed6635eb5d07d0ad27a2a02ffeacf87c135090fe (diff) | |
download | chromium_src-6b16679e5700658051a581bb61b37e5b542ef818.zip chromium_src-6b16679e5700658051a581bb61b37e5b542ef818.tar.gz chromium_src-6b16679e5700658051a581bb61b37e5b542ef818.tar.bz2 |
Aura: Resize locks with --ui-enable-threaded-compositing
We temporarily defer commits while resizing so that the renderer has a chance to catch up with the UI window size.
Noteable changes from master:
- RWHVs can fast ACK the GPU process (not flip in the browser or TextureImageTransportSurface); useful for allowing the renderer to catch up when it gets too far behind.
- RWHVA will insist kicking a renderer frame after the lock times out on resize (wasn't necessary before)
- ui::Compositor vends draw locks (which largely just wraps to cc::Proxy) of ui::aura::RootWindow
BUG=136366
TEST=None
Review URL: https://chromiumcodereview.appspot.com/10690168
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@164460 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/thread_proxy.cc')
-rw-r--r-- | cc/thread_proxy.cc | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/cc/thread_proxy.cc b/cc/thread_proxy.cc index 666c03f..e8229ca 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; |