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

Unified Diff: cc/single_thread_proxy.cc

Issue 12212007: cc: Route offscreen context creation for compositor to the browser. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix typo Created 7 years, 10 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: cc/single_thread_proxy.cc
diff --git a/cc/single_thread_proxy.cc b/cc/single_thread_proxy.cc
index 1301355238382193e31001ec65177f698221ca64..9c51d4ca36ca6fb89b427eb6c7e4d111aae0d922 100644
--- a/cc/single_thread_proxy.cc
+++ b/cc/single_thread_proxy.cc
@@ -6,6 +6,7 @@
#include "base/auto_reset.h"
#include "base/debug/trace_event.h"
+#include "cc/context_provider.h"
#include "cc/draw_quad.h"
#include "cc/layer_tree_host.h"
#include "cc/layer_tree_impl.h"
@@ -25,6 +26,7 @@ SingleThreadProxy::SingleThreadProxy(LayerTreeHost* layerTreeHost)
: Proxy(scoped_ptr<Thread>(NULL))
, m_layerTreeHost(layerTreeHost)
, m_outputSurfaceLost(false)
+ , m_createdOffscreenContextProvider(false)
, m_rendererInitialized(false)
, m_nextFrameIsNewlyCommittedFrame(false)
, m_insideDraw(false)
@@ -139,6 +141,12 @@ bool SingleThreadProxy::recreateOutputSurface()
scoped_ptr<OutputSurface> outputSurface = m_layerTreeHost->createOutputSurface();
if (!outputSurface.get())
return false;
+ scoped_refptr<cc::ContextProvider> offscreenContextProvider;
+ if (m_createdOffscreenContextProvider) {
+ offscreenContextProvider = m_layerTreeHost->client()->OffscreenContextProviderForMainThread();
+ if (!offscreenContextProvider->InitializeOnMainThread())
+ return false;
+ }
bool initialized;
{
@@ -148,6 +156,9 @@ bool SingleThreadProxy::recreateOutputSurface()
initialized = m_layerTreeHostImpl->initializeRenderer(outputSurface.Pass());
if (initialized) {
m_RendererCapabilitiesForMainThread = m_layerTreeHostImpl->rendererCapabilities();
+ m_layerTreeHostImpl->resourceProvider()->setOffscreenContextProvider(offscreenContextProvider);
+ } else if (offscreenContextProvider) {
+ offscreenContextProvider->VerifyContexts();
}
}
@@ -196,8 +207,7 @@ void SingleThreadProxy::doCommit(scoped_ptr<ResourceUpdateQueue> queue)
NULL,
Proxy::mainThread(),
queue.Pass(),
- m_layerTreeHostImpl->resourceProvider(),
- hasImplThread());
+ m_layerTreeHostImpl->resourceProvider());
updateController->finalize();
m_layerTreeHost->finishCommitOnImplThread(m_layerTreeHostImpl.get());
@@ -382,6 +392,15 @@ bool SingleThreadProxy::commitAndComposite()
if (!m_layerTreeHost->initializeRendererIfNeeded())
return false;
+ scoped_refptr<cc::ContextProvider> offscreenContextProvider;
+ if (m_RendererCapabilitiesForMainThread.usingOffscreenContext3d && m_layerTreeHost->needsOffscreenContext()) {
+ offscreenContextProvider = m_layerTreeHost->client()->OffscreenContextProviderForMainThread();
+ if (offscreenContextProvider->InitializeOnMainThread())
+ m_createdOffscreenContextProvider = true;
+ else
+ offscreenContextProvider = NULL;
+ }
+
m_layerTreeHost->contentsTextureManager()->unlinkAndClearEvictedBackings();
scoped_ptr<ResourceUpdateQueue> queue = make_scoped_ptr(new ResourceUpdateQueue);
@@ -389,18 +408,20 @@ bool SingleThreadProxy::commitAndComposite()
m_layerTreeHost->willCommit();
doCommit(queue.Pass());
- bool result = doComposite();
+ bool result = doComposite(offscreenContextProvider);
m_layerTreeHost->didBeginFrame();
return result;
}
-bool SingleThreadProxy::doComposite()
+bool SingleThreadProxy::doComposite(scoped_refptr<cc::ContextProvider> offscreenContextProvider)
{
DCHECK(!m_outputSurfaceLost);
{
DebugScopedSetImplThread impl(this);
base::AutoReset<bool> markInside(&m_insideDraw, true);
+ m_layerTreeHostImpl->resourceProvider()->setOffscreenContextProvider(offscreenContextProvider);
+
if (!m_layerTreeHostImpl->visible())
return false;
@@ -422,6 +443,8 @@ bool SingleThreadProxy::doComposite()
}
if (m_outputSurfaceLost) {
+ if (cc::ContextProvider* offscreenContexts = m_layerTreeHostImpl->resourceProvider()->offscreenContextProvider())
+ offscreenContexts->VerifyContexts();
m_layerTreeHost->didLoseOutputSurface();
return false;
}

Powered by Google App Engine
This is Rietveld 408576698