| Index: cc/thread_proxy.cc
|
| diff --git a/cc/thread_proxy.cc b/cc/thread_proxy.cc
|
| index ddc61c07dad0ff2748ad506c0eb6b91a5012acb7..51f073d37d6ab9264fc7ccbce7a33633ee22793a 100644
|
| --- a/cc/thread_proxy.cc
|
| +++ b/cc/thread_proxy.cc
|
| @@ -7,6 +7,7 @@
|
| #include "base/auto_reset.h"
|
| #include "base/bind.h"
|
| #include "base/debug/trace_event.h"
|
| +#include "cc/context_provider.h"
|
| #include "cc/delay_based_time_source.h"
|
| #include "cc/draw_quad.h"
|
| #include "cc/frame_rate_controller.h"
|
| @@ -17,9 +18,6 @@
|
| #include "cc/prioritized_resource_manager.h"
|
| #include "cc/scheduler.h"
|
| #include "cc/thread.h"
|
| -#include "third_party/WebKit/Source/Platform/chromium/public/WebSharedGraphicsContext3D.h"
|
| -
|
| -using WebKit::WebSharedGraphicsContext3D;
|
|
|
| namespace {
|
|
|
| @@ -43,6 +41,7 @@ ThreadProxy::ThreadProxy(LayerTreeHost* layerTreeHost, scoped_ptr<Thread> implTh
|
| , m_animateRequested(false)
|
| , m_commitRequested(false)
|
| , m_commitRequestSentToImplThread(false)
|
| + , m_createdOffscreenContextProvider(false)
|
| , m_layerTreeHost(layerTreeHost)
|
| , m_rendererInitialized(false)
|
| , m_started(false)
|
| @@ -228,9 +227,12 @@ bool ThreadProxy::recreateOutputSurface()
|
| scoped_ptr<OutputSurface> outputSurface = m_layerTreeHost->createOutputSurface();
|
| if (!outputSurface.get())
|
| return false;
|
| - if (m_layerTreeHost->needsSharedContext())
|
| - if (!WebSharedGraphicsContext3D::createCompositorThreadContext())
|
| + scoped_refptr<cc::ContextProvider> offscreenContextProvider;
|
| + if (m_createdOffscreenContextProvider) {
|
| + offscreenContextProvider = m_layerTreeHost->client()->OffscreenContextProviderForCompositorThread();
|
| + if (!offscreenContextProvider->InitializeOnMainThread())
|
| return false;
|
| + }
|
|
|
| // Make a blocking call to recreateOutputSurfaceOnImplThread. The results of that
|
| // call are pushed into the recreateSucceeded and capabilities local
|
| @@ -243,6 +245,7 @@ bool ThreadProxy::recreateOutputSurface()
|
| m_implThreadWeakPtr,
|
| &completion,
|
| base::Passed(&outputSurface),
|
| + offscreenContextProvider,
|
| &recreateSucceeded,
|
| &capabilities));
|
| completion.wait();
|
| @@ -314,6 +317,8 @@ void ThreadProxy::checkOutputSurfaceStatusOnImplThread()
|
| TRACE_EVENT0("cc", "ThreadProxy::checkOutputSurfaceStatusOnImplThread");
|
| if (!m_layerTreeHostImpl->isContextLost())
|
| return;
|
| + if (cc::ContextProvider* offscreenContexts = m_layerTreeHostImpl->resourceProvider()->offscreenContextProvider())
|
| + offscreenContexts->VerifyContexts();
|
| m_schedulerOnImplThread->didLoseOutputSurface();
|
| }
|
|
|
| @@ -599,9 +604,6 @@ void ThreadProxy::beginFrame(scoped_ptr<BeginFrameAndCommitState> beginFrameStat
|
| return;
|
| }
|
|
|
| - if (m_layerTreeHost->needsSharedContext() && !WebSharedGraphicsContext3D::haveCompositorThreadContext())
|
| - WebSharedGraphicsContext3D::createCompositorThreadContext();
|
| -
|
| // Do not notify the impl thread of commit requests that occur during
|
| // the apply/animate/layout part of the beginFrameAndCommit process since
|
| // those commit requests will get painted immediately. Once we have done
|
| @@ -671,6 +673,15 @@ void ThreadProxy::beginFrame(scoped_ptr<BeginFrameAndCommitState> beginFrameStat
|
| setNeedsAnimate();
|
| }
|
|
|
| + scoped_refptr<cc::ContextProvider> offscreenContextProvider;
|
| + if (m_RendererCapabilitiesMainThreadCopy.usingOffscreenContext3d && m_layerTreeHost->needsOffscreenContext()) {
|
| + offscreenContextProvider = m_layerTreeHost->client()->OffscreenContextProviderForCompositorThread();
|
| + if (offscreenContextProvider->InitializeOnMainThread())
|
| + m_createdOffscreenContextProvider = true;
|
| + else
|
| + offscreenContextProvider = NULL;
|
| + }
|
| +
|
| // Notify the impl thread that the beginFrame has completed. This will
|
| // begin the commit process, which is blocking from the main thread's
|
| // point of view, but asynchronously performed on the impl thread,
|
| @@ -682,7 +693,7 @@ void ThreadProxy::beginFrame(scoped_ptr<BeginFrameAndCommitState> beginFrameStat
|
|
|
| base::TimeTicks startTime = base::TimeTicks::HighResNow();
|
| CompletionEvent completion;
|
| - Proxy::implThread()->postTask(base::Bind(&ThreadProxy::beginFrameCompleteOnImplThread, m_implThreadWeakPtr, &completion, queue.release()));
|
| + Proxy::implThread()->postTask(base::Bind(&ThreadProxy::beginFrameCompleteOnImplThread, m_implThreadWeakPtr, &completion, queue.release(), offscreenContextProvider));
|
| completion.wait();
|
| base::TimeTicks endTime = base::TimeTicks::HighResNow();
|
|
|
| @@ -694,7 +705,7 @@ void ThreadProxy::beginFrame(scoped_ptr<BeginFrameAndCommitState> beginFrameStat
|
| m_layerTreeHost->didBeginFrame();
|
| }
|
|
|
| -void ThreadProxy::beginFrameCompleteOnImplThread(CompletionEvent* completion, ResourceUpdateQueue* rawQueue)
|
| +void ThreadProxy::beginFrameCompleteOnImplThread(CompletionEvent* completion, ResourceUpdateQueue* rawQueue, scoped_refptr<cc::ContextProvider> offscreenContextProvider)
|
| {
|
| scoped_ptr<ResourceUpdateQueue> queue(rawQueue);
|
|
|
| @@ -710,6 +721,8 @@ void ThreadProxy::beginFrameCompleteOnImplThread(CompletionEvent* completion, Re
|
| return;
|
| }
|
|
|
| + m_layerTreeHostImpl->resourceProvider()->setOffscreenContextProvider(offscreenContextProvider);
|
| +
|
| if (m_layerTreeHost->contentsTextureManager()->linkedEvictedBackingsExist()) {
|
| // Clear any uploads we were making to textures linked to evicted
|
| // resources
|
| @@ -721,7 +734,7 @@ void ThreadProxy::beginFrameCompleteOnImplThread(CompletionEvent* completion, Re
|
|
|
| m_layerTreeHost->contentsTextureManager()->pushTexturePrioritiesToBackings();
|
|
|
| - m_currentResourceUpdateControllerOnImplThread = ResourceUpdateController::create(this, Proxy::implThread(), queue.Pass(), m_layerTreeHostImpl->resourceProvider(), hasImplThread());
|
| + m_currentResourceUpdateControllerOnImplThread = ResourceUpdateController::create(this, Proxy::implThread(), queue.Pass(), m_layerTreeHostImpl->resourceProvider());
|
| m_currentResourceUpdateControllerOnImplThread->performMoreUpdates(
|
| m_schedulerOnImplThread->anticipatedDrawTime());
|
|
|
| @@ -1059,7 +1072,7 @@ size_t ThreadProxy::maxPartialTextureUpdates() const
|
| return ResourceUpdateController::maxPartialTextureUpdates();
|
| }
|
|
|
| -void ThreadProxy::recreateOutputSurfaceOnImplThread(CompletionEvent* completion, scoped_ptr<OutputSurface> outputSurface, bool* recreateSucceeded, RendererCapabilities* capabilities)
|
| +void ThreadProxy::recreateOutputSurfaceOnImplThread(CompletionEvent* completion, scoped_ptr<OutputSurface> outputSurface, scoped_refptr<cc::ContextProvider> offscreenContextProvider, bool* recreateSucceeded, RendererCapabilities* capabilities)
|
| {
|
| TRACE_EVENT0("cc", "ThreadProxy::recreateOutputSurfaceOnImplThread");
|
| DCHECK(isImplThread());
|
| @@ -1067,7 +1080,10 @@ void ThreadProxy::recreateOutputSurfaceOnImplThread(CompletionEvent* completion,
|
| *recreateSucceeded = m_layerTreeHostImpl->initializeRenderer(outputSurface.Pass());
|
| if (*recreateSucceeded) {
|
| *capabilities = m_layerTreeHostImpl->rendererCapabilities();
|
| + m_layerTreeHostImpl->resourceProvider()->setOffscreenContextProvider(offscreenContextProvider);
|
| m_schedulerOnImplThread->didRecreateOutputSurface();
|
| + } else if (offscreenContextProvider) {
|
| + offscreenContextProvider->VerifyContexts();
|
| }
|
| completion->signal();
|
| }
|
|
|