| Index: content/browser/renderer_host/image_transport_factory.cc
|
| diff --git a/content/browser/renderer_host/image_transport_factory.cc b/content/browser/renderer_host/image_transport_factory.cc
|
| index 5b81dbf0c971740d107f5de9ef0ba3f031faa91f..f66c2b2875e2c5c248a321a2cf0d8fc84ca8de2e 100644
|
| --- a/content/browser/renderer_host/image_transport_factory.cc
|
| +++ b/content/browser/renderer_host/image_transport_factory.cc
|
| @@ -19,6 +19,7 @@
|
| #include "content/browser/gpu/gpu_data_manager_impl.h"
|
| #include "content/browser/gpu/gpu_process_host.h"
|
| #include "content/browser/gpu/gpu_surface_tracker.h"
|
| +#include "content/common/gpu/client/context_provider_command_buffer.h"
|
| #include "content/common/gpu/client/gl_helper.h"
|
| #include "content/common/gpu/client/gpu_channel_host.h"
|
| #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
|
| @@ -28,7 +29,6 @@
|
| #include "content/public/common/content_switches.h"
|
| #include "gpu/GLES2/gl2extchromium.h"
|
| #include "gpu/ipc/command_buffer_proxy.h"
|
| -#include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3D.h"
|
| #include "third_party/khronos/GLES2/gl2.h"
|
| #include "third_party/khronos/GLES2/gl2ext.h"
|
| #include "ui/compositor/compositor.h"
|
| @@ -351,8 +351,7 @@ void BrowserCompositorOutputSurfaceProxy::OnUpdateVSyncParameters(
|
|
|
| class GpuProcessTransportFactory
|
| : public ui::ContextFactory,
|
| - public ImageTransportFactory,
|
| - public WebKit::WebGraphicsContext3D::WebGraphicsContextLostCallback {
|
| + public ImageTransportFactory {
|
| public:
|
| GpuProcessTransportFactory()
|
| : ALLOW_THIS_IN_INITIALIZER_LIST(callback_factory_(this)) {
|
| @@ -408,9 +407,10 @@ class GpuProcessTransportFactory
|
| CreateSharedContextLazy();
|
| gfx::GLSurfaceHandle handle = gfx::GLSurfaceHandle(
|
| gfx::kNullPluginWindow, gfx::TEXTURE_TRANSPORT);
|
| - handle.parent_gpu_process_id = shared_context_->GetGPUProcessID();
|
| - handle.parent_client_id = shared_context_->GetChannelID();
|
| -
|
| + handle.parent_gpu_process_id =
|
| + shared_contexts_main_thread_->Context3d()->GetGPUProcessID();
|
| + handle.parent_client_id =
|
| + shared_contexts_main_thread_->Context3d()->GetChannelID();
|
| return handle;
|
| }
|
|
|
| @@ -420,11 +420,12 @@ class GpuProcessTransportFactory
|
|
|
| virtual scoped_refptr<ui::Texture> CreateTransportClient(
|
| float device_scale_factor) OVERRIDE {
|
| - if (!shared_context_.get())
|
| + if (!shared_contexts_main_thread_)
|
| return NULL;
|
| scoped_refptr<ImageTransportClientTexture> image(
|
| - new ImageTransportClientTexture(shared_context_.get(),
|
| - device_scale_factor));
|
| + new ImageTransportClientTexture(
|
| + shared_contexts_main_thread_->Context3d(),
|
| + device_scale_factor));
|
| return image;
|
| }
|
|
|
| @@ -432,31 +433,36 @@ class GpuProcessTransportFactory
|
| const gfx::Size& size,
|
| float device_scale_factor,
|
| unsigned int texture_id) OVERRIDE {
|
| - if (!shared_context_.get())
|
| + if (!shared_contexts_main_thread_)
|
| return NULL;
|
| - scoped_refptr<OwnedTexture> image(
|
| - new OwnedTexture(shared_context_.get(), size, device_scale_factor,
|
| - texture_id));
|
| + scoped_refptr<OwnedTexture> image(new OwnedTexture(
|
| + shared_contexts_main_thread_->Context3d(),
|
| + size,
|
| + device_scale_factor,
|
| + texture_id));
|
| return image;
|
| }
|
|
|
| virtual GLHelper* GetGLHelper() OVERRIDE {
|
| if (!gl_helper_.get()) {
|
| CreateSharedContextLazy();
|
| + WebKit::WebGraphicsContext3D* context_for_main_thread =
|
| + shared_contexts_main_thread_->Context3d();
|
| WebKit::WebGraphicsContext3D* context_for_thread =
|
| CreateOffscreenContext();
|
| if (!context_for_thread)
|
| return NULL;
|
| - gl_helper_.reset(new GLHelper(shared_context_.get(),
|
| +
|
| + gl_helper_.reset(new GLHelper(context_for_main_thread,
|
| context_for_thread));
|
| }
|
| return gl_helper_.get();
|
| }
|
|
|
| virtual uint32 InsertSyncPoint() OVERRIDE {
|
| - if (!shared_context_.get())
|
| + if (!shared_contexts_main_thread_)
|
| return 0;
|
| - return shared_context_->insertSyncPoint();
|
| + return shared_contexts_main_thread_->Context3d()->insertSyncPoint();
|
| }
|
|
|
| virtual void AddObserver(ImageTransportFactoryObserver* observer) OVERRIDE {
|
| @@ -468,15 +474,6 @@ class GpuProcessTransportFactory
|
| observer_list_.RemoveObserver(observer);
|
| }
|
|
|
| - // WebGraphicsContextLostCallback implementation, called for the shared
|
| - // context.
|
| - virtual void onContextLost() {
|
| - MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&GpuProcessTransportFactory::OnLostSharedContext,
|
| - callback_factory_.GetWeakPtr()));
|
| - }
|
| -
|
| void OnLostContext(ui::Compositor* compositor) {
|
| LOG(ERROR) << "Lost UI compositor context.";
|
| PerCompositorData* data = per_compositor_data_[compositor];
|
| @@ -546,29 +543,91 @@ class GpuProcessTransportFactory
|
| return context.release();
|
| }
|
|
|
| - void CreateSharedContextLazy() {
|
| - if (shared_context_.get())
|
| - return;
|
| + class MainThreadContextProvider : public ContextProviderCommandBuffer {
|
| + public:
|
| + explicit MainThreadContextProvider(GpuProcessTransportFactory* factory)
|
| + : factory_(factory) {}
|
| +
|
| + protected:
|
| + virtual ~MainThreadContextProvider() {}
|
| +
|
| + virtual scoped_ptr<WebGraphicsContext3DCommandBufferImpl>
|
| + CreateOffscreenContext3d() {
|
| + return make_scoped_ptr(factory_->CreateOffscreenContext());
|
| + }
|
| +
|
| + virtual void OnLostContext() OVERRIDE {
|
| + ContextProviderCommandBuffer::OnLostContext();
|
| +
|
| + MessageLoop::current()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&GpuProcessTransportFactory::OnLostMainThreadSharedContext,
|
| + factory_->callback_factory_.GetWeakPtr()));
|
| + }
|
| +
|
| + private:
|
| + GpuProcessTransportFactory* factory_;
|
| + };
|
|
|
| - shared_context_.reset(CreateOffscreenContext());
|
| - if (!shared_context_.get()) {
|
| - // If we can't recreate contexts, we won't be able to show the UI. Better
|
| - // crash at this point.
|
| + virtual scoped_refptr<ui::ContextProvider>
|
| + OffscreenContextProviderForMainThread() OVERRIDE {
|
| + if (!shared_contexts_main_thread_ ||
|
| + shared_contexts_main_thread_->destroyed()) {
|
| + shared_contexts_main_thread_ = new MainThreadContextProvider(this);
|
| + }
|
| + return shared_contexts_main_thread_;
|
| + }
|
| +
|
| + class CompositorThreadContextProvider : public ContextProviderCommandBuffer {
|
| + public:
|
| + explicit CompositorThreadContextProvider(
|
| + GpuProcessTransportFactory* factory) : factory_(factory) {}
|
| +
|
| + protected:
|
| + virtual ~CompositorThreadContextProvider() {}
|
| +
|
| + virtual scoped_ptr<WebGraphicsContext3DCommandBufferImpl>
|
| + CreateOffscreenContext3d() {
|
| + return make_scoped_ptr(factory_->CreateOffscreenContext());
|
| + }
|
| +
|
| + private:
|
| + GpuProcessTransportFactory* factory_;
|
| + };
|
| +
|
| + virtual scoped_refptr<ui::ContextProvider>
|
| + OffscreenContextProviderForCompositorThread() OVERRIDE {
|
| + if (!shared_contexts_compositor_thread_ ||
|
| + shared_contexts_compositor_thread_->destroyed()) {
|
| + shared_contexts_compositor_thread_ =
|
| + new CompositorThreadContextProvider(this);
|
| + }
|
| + return shared_contexts_compositor_thread_;
|
| + }
|
| +
|
| + void CreateSharedContextLazy() {
|
| + scoped_refptr<ui::ContextProvider> provider =
|
| + OffscreenContextProviderForMainThread();
|
| + if (!provider->InitializeOnMainThread()) {
|
| + // If we can't recreate contexts, we won't be able to show the UI.
|
| + // Better crash at this point.
|
| LOG(FATAL) << "Failed to initialize UI shared context.";
|
| }
|
| - if (!shared_context_->makeContextCurrent()) {
|
| - // If we can't recreate contexts, we won't be able to show the UI. Better
|
| - // crash at this point.
|
| + if (!provider->BindToCurrentThread()) {
|
| + // If we can't recreate contexts, we won't be able to show the UI.
|
| + // Better crash at this point.
|
| LOG(FATAL) << "Failed to make UI shared context current.";
|
| }
|
| - shared_context_->setContextLostCallback(this);
|
| }
|
|
|
| - void OnLostSharedContext() {
|
| + void OnLostMainThreadSharedContext() {
|
| // Keep old resources around while we call the observers, but ensure that
|
| // new resources are created if needed.
|
| - scoped_ptr<WebGraphicsContext3DCommandBufferImpl> old_shared_context(
|
| - shared_context_.release());
|
| +
|
| + scoped_refptr<MainThreadContextProvider> old_contexts_main_thread =
|
| + shared_contexts_main_thread_;
|
| + shared_contexts_main_thread_ = NULL;
|
| +
|
| scoped_ptr<GLHelper> old_helper(gl_helper_.release());
|
|
|
| FOR_EACH_OBSERVER(ImageTransportFactoryObserver,
|
| @@ -578,7 +637,9 @@ class GpuProcessTransportFactory
|
|
|
| typedef std::map<ui::Compositor*, PerCompositorData*> PerCompositorDataMap;
|
| PerCompositorDataMap per_compositor_data_;
|
| - scoped_ptr<WebGraphicsContext3DCommandBufferImpl> shared_context_;
|
| + scoped_refptr<MainThreadContextProvider> shared_contexts_main_thread_;
|
| + scoped_refptr<CompositorThreadContextProvider>
|
| + shared_contexts_compositor_thread_;
|
| scoped_ptr<GLHelper> gl_helper_;
|
| ObserverList<ImageTransportFactoryObserver> observer_list_;
|
| base::WeakPtrFactory<GpuProcessTransportFactory> callback_factory_;
|
|
|