Index: cc/single_thread_proxy.cc |
diff --git a/cc/single_thread_proxy.cc b/cc/single_thread_proxy.cc |
index 1301355238382193e31001ec65177f698221ca64..fa3f299bbbf8659452160dde46b994817ef41b62 100644 |
--- a/cc/single_thread_proxy.cc |
+++ b/cc/single_thread_proxy.cc |
@@ -13,6 +13,7 @@ |
#include "cc/prioritized_resource_manager.h" |
#include "cc/resource_update_controller.h" |
#include "cc/thread.h" |
+#include "ui/gl/context_provider.h" |
namespace cc { |
@@ -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<ui::ContextProvider> offscreenContextProvider; |
+ if (m_createdOffscreenContextProvider) { |
+ offscreenContextProvider = m_layerTreeHost->client()->OffscreenContextProviderForMainThread(); |
+ if (!offscreenContextProvider->InitializeOnMainThread()) |
+ return false; |
+ } |
bool initialized; |
{ |
@@ -148,6 +156,7 @@ bool SingleThreadProxy::recreateOutputSurface() |
initialized = m_layerTreeHostImpl->initializeRenderer(outputSurface.Pass()); |
if (initialized) { |
m_RendererCapabilitiesForMainThread = m_layerTreeHostImpl->rendererCapabilities(); |
+ m_layerTreeHostImpl->resourceProvider()->setOffscreenContextProvider(offscreenContextProvider); |
} |
} |
@@ -196,8 +205,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 +390,15 @@ bool SingleThreadProxy::commitAndComposite() |
if (!m_layerTreeHost->initializeRendererIfNeeded()) |
return false; |
+ scoped_refptr<ui::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 +406,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<ui::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 +441,8 @@ bool SingleThreadProxy::doComposite() |
} |
if (m_outputSurfaceLost) { |
+ if (ui::ContextProvider* offscreenContexts = m_layerTreeHostImpl->resourceProvider()->offscreenContextProvider()) |
+ offscreenContexts->VerifyContexts(); |
m_layerTreeHost->didLoseOutputSurface(); |
return false; |
} |