Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(291)

Unified Diff: Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp

Issue 10690121: Merge 121076 - [chromium] LayerRendererChromium is not getting visibility messages in single thread… (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1180/
Patch Set: Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp
===================================================================
--- Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp (revision 122257)
+++ Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp (working copy)
@@ -79,6 +79,7 @@
, m_layerRendererInitialized(false)
, m_started(false)
, m_texturesAcquired(true)
+ , m_inCompositeAndReadback(false)
, m_mainThreadProxy(CCScopedThreadProxy::create(CCProxy::mainThread()))
, m_beginFrameCompletionEventOnImplThread(0)
, m_readbackRequestOnImplThread(0)
@@ -113,7 +114,9 @@
CCCompletionEvent beginFrameCompletion;
CCProxy::implThread()->postTask(createCCThreadTask(this, &CCThreadProxy::forceBeginFrameOnImplThread, AllowCrossThreadAccess(&beginFrameCompletion)));
beginFrameCompletion.wait();
+ m_inCompositeAndReadback = true;
beginFrame();
+ m_inCompositeAndReadback = false;
// Perform a synchronous readback.
ReadbackRequest request;
@@ -202,6 +205,22 @@
m_schedulerOnImplThread->setCanBeginFrame(true);
}
+void CCThreadProxy::setVisible(bool visible)
+{
+ TRACE_EVENT0("cc", "CCThreadProxy::setVisible");
+ CCCompletionEvent completion;
+ CCProxy::implThread()->postTask(createCCThreadTask(this, &CCThreadProxy::setVisibleOnImplThread, AllowCrossThreadAccess(&completion), visible));
+ completion.wait();
+}
+
+void CCThreadProxy::setVisibleOnImplThread(CCCompletionEvent* completion, bool visible)
+{
+ TRACE_EVENT0("cc", "CCThreadProxy::setVisibleOnImplThread");
+ m_layerTreeHostImpl->setVisible(visible);
+ m_schedulerOnImplThread->setVisible(visible);
+ completion->signal();
+}
+
bool CCThreadProxy::initializeLayerRenderer()
{
TRACE_EVENT("CCThreadProxy::initializeLayerRenderer", this, 0);
@@ -299,18 +318,6 @@
CCProxy::implThread()->postTask(createCCThreadTask(this, &CCThreadProxy::setNeedsCommitOnImplThread));
}
-void CCThreadProxy::setNeedsForcedCommit()
-{
- ASSERT(isMainThread());
- if (m_forcedCommitRequested)
- return;
-
- TRACE_EVENT("CCThreadProxy::setNeedsForcedCommit", this, 0);
- m_commitRequested = true;
- m_forcedCommitRequested = true;
- CCProxy::implThread()->postTask(createCCThreadTask(this, &CCThreadProxy::setNeedsForcedCommitOnImplThread));
-}
-
void CCThreadProxy::didLoseContextOnImplThread()
{
ASSERT(isImplThread());
@@ -348,12 +355,6 @@
m_mainThreadProxy->postTask(createCCThreadTask(this, &CCThreadProxy::setAnimationEvents, events, wallClockTime));
}
-void CCThreadProxy::postSetContentsMemoryAllocationLimitBytesToMainThreadOnImplThread(size_t bytes)
-{
- ASSERT(isImplThread());
- m_mainThreadProxy->postTask(createCCThreadTask(this, &CCThreadProxy::setContentsMemoryAllocationLimitBytes, bytes));
-}
-
void CCThreadProxy::setNeedsRedraw()
{
ASSERT(isMainThread());
@@ -455,6 +456,8 @@
m_pendingBeginFrameRequest->scrollInfo = m_layerTreeHostImpl->processScrollDeltas();
m_currentTextureUpdaterOnImplThread = adoptPtr(new CCTextureUpdater);
m_pendingBeginFrameRequest->updater = m_currentTextureUpdaterOnImplThread.get();
+ m_pendingBeginFrameRequest->contentsTexturesWereDeleted = m_layerTreeHostImpl->contentsTexturesWerePurgedSinceLastCommit();
+ m_pendingBeginFrameRequest->memoryAllocationLimitBytes = m_layerTreeHostImpl->memoryAllocationLimitBytes();
m_mainThreadProxy->postTask(createCCThreadTask(this, &CCThreadProxy::beginFrame));
@@ -497,9 +500,17 @@
// Re-do the commit flow so that we don't send the scrollInfo on the BFAC message.
m_layerTreeHost->applyScrollAndScale(*request->scrollInfo);
+ if (!m_inCompositeAndReadback && !m_layerTreeHost->visible()) {
+ m_commitRequested = false;
+ m_forcedCommitRequested = false;
+
+ TRACE_EVENT0("cc", "EarlyOut_NotVisible");
+ CCProxy::implThread()->postTask(createCCThreadTask(this, &CCThreadProxy::beginFrameAbortedOnImplThread));
+ return;
+ }
+
m_layerTreeHost->willBeginFrame();
- // FIXME: recreate the context if it was requested by the impl thread.
m_layerTreeHost->updateAnimations(request->monotonicFrameBeginTime);
m_layerTreeHost->layout();
@@ -512,8 +523,11 @@
if (!m_layerTreeHost->initializeLayerRendererIfNeeded())
return;
- m_layerTreeHost->updateLayers(*request->updater);
+ if (request->contentsTexturesWereDeleted)
+ m_layerTreeHost->evictAllContentTextures();
+ m_layerTreeHost->updateLayers(*request->updater, request->memoryAllocationLimitBytes);
+
// Once single buffered layers are committed, they cannot be modified until
// they are drawn by the impl thread.
m_texturesAcquired = false;
@@ -560,6 +574,16 @@
m_schedulerOnImplThread->beginFrameComplete();
}
+void CCThreadProxy::beginFrameAbortedOnImplThread()
+{
+ TRACE_EVENT0("cc", "CCThreadProxy::beginFrameAbortedOnImplThread");
+ ASSERT(isImplThread());
+ ASSERT(m_schedulerOnImplThread);
+ ASSERT(m_schedulerOnImplThread->commitPending());
+
+ m_schedulerOnImplThread->beginFrameAborted();
+}
+
bool CCThreadProxy::hasMoreResourceUpdates() const
{
if (!m_currentTextureUpdaterOnImplThread)
@@ -660,9 +684,7 @@
}
m_readbackRequestOnImplThread->completion.signal();
m_readbackRequestOnImplThread = 0;
- }
-
- if (drawFrame)
+ } else if (drawFrame)
result.didSwap = m_layerTreeHostImpl->swapBuffers();
// Tell the main thread that the the newly-commited frame was drawn.
@@ -745,14 +767,6 @@
m_layerTreeHost->setAnimationEvents(events, wallClockTime);
}
-void CCThreadProxy::setContentsMemoryAllocationLimitBytes(size_t bytes)
-{
- ASSERT(isMainThread());
- if (!m_layerTreeHost)
- return;
- m_layerTreeHost->setContentsMemoryAllocationLimitBytes(bytes);
-}
-
class CCThreadProxyContextRecreationTimer : public CCTimer, CCTimerClient {
public:
static PassOwnPtr<CCThreadProxyContextRecreationTimer> create(CCThreadProxy* proxy) { return adoptPtr(new CCThreadProxyContextRecreationTimer(proxy)); }
@@ -835,7 +849,8 @@
{
TRACE_EVENT("CCThreadProxy::layerTreeHostClosedOnImplThread", this, 0);
ASSERT(isImplThread());
- m_layerTreeHost->deleteContentsTexturesOnImplThread(m_layerTreeHostImpl->contentsTextureAllocator());
+ if (!m_layerTreeHostImpl->contentsTexturesWerePurgedSinceLastCommit())
+ m_layerTreeHost->deleteContentsTexturesOnImplThread(m_layerTreeHostImpl->contentsTextureAllocator());
m_inputHandlerOnImplThread.clear();
m_layerTreeHostImpl.clear();
m_schedulerOnImplThread.clear();

Powered by Google App Engine
This is Rietveld 408576698