Chromium Code Reviews| 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 ba45309f8d990cfe0539c320d0291f8b06491df1..a41b01c033a607cddeff48c2454b1ef42d3795de 100644 |
| --- a/content/browser/renderer_host/image_transport_factory.cc |
| +++ b/content/browser/renderer_host/image_transport_factory.cc |
| @@ -21,6 +21,7 @@ |
| #include "content/browser/gpu/gpu_surface_tracker.h" |
| #include "content/common/gpu/client/gl_helper.h" |
| #include "content/common/gpu/client/gpu_channel_host.h" |
| +#include "content/common/gpu/client/offscreen_context.h" |
| #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" |
| #include "content/common/gpu/gpu_messages.h" |
| #include "content/common/gpu/gpu_process_launch_causes.h" |
| @@ -224,11 +225,12 @@ class CompositorSwapClient |
| // instead. |
| // TODO(piman): Fix the underlying issues. |
| MessageLoop::current()->PostTask(FROM_HERE, |
| - base::Bind(&CompositorSwapClient::OnLostContext, this->AsWeakPtr())); |
| + base::Bind(&CompositorSwapClient::OnLostSwapContext, |
| + this->AsWeakPtr())); |
| } |
| private: |
| - void OnLostContext(); |
| + void OnLostSwapContext(); |
| ui::Compositor* compositor_; |
| GpuProcessTransportFactory* factory_; |
| @@ -368,11 +370,13 @@ void BrowserCompositorOutputSurfaceProxy::OnUpdateVSyncParameters( |
| class GpuProcessTransportFactory |
| : public ui::ContextFactory, |
| - public ImageTransportFactory, |
| - public WebKit::WebGraphicsContext3D::WebGraphicsContextLostCallback { |
| + public OffscreenContextClient, |
| + public ImageTransportFactory { |
| public: |
| GpuProcessTransportFactory() |
| - : ALLOW_THIS_IN_INITIALIZER_LIST(callback_factory_(this)) { |
| + : shared_context_main_thread_(this), |
| + shared_context_compositor_thread_(this), |
| + ALLOW_THIS_IN_INITIALIZER_LIST(callback_factory_(this)) { |
| output_surface_proxy_ = new BrowserCompositorOutputSurfaceProxy(); |
| } |
| @@ -400,6 +404,24 @@ class GpuProcessTransportFactory |
| output_surface_proxy_); |
| } |
| + virtual WebKit::WebGraphicsContext3D* OffscreenContextForMainThread() |
| + OVERRIDE { |
| + return shared_context_main_thread_.Context3d(); |
| + } |
| + |
| + virtual WebKit::WebGraphicsContext3D* |
| + OffscreenContextForCompositorThread() OVERRIDE { |
| + return shared_context_compositor_thread_.Context3d(); |
| + } |
| + |
| + virtual GrContext* OffscreenGrContextForMainThread() OVERRIDE { |
| + return shared_context_main_thread_.GrContext(); |
| + } |
| + |
| + virtual GrContext* OffscreenGrContextForCompositorThread() OVERRIDE { |
| + return shared_context_compositor_thread_.GrContext(); |
| + } |
| + |
| virtual void RemoveCompositor(ui::Compositor* compositor) OVERRIDE { |
| PerCompositorDataMap::iterator it = per_compositor_data_.find(compositor); |
| if (it == per_compositor_data_.end()) |
| @@ -420,12 +442,15 @@ class GpuProcessTransportFactory |
| } |
| virtual gfx::GLSurfaceHandle CreateSharedSurfaceHandle() OVERRIDE { |
| - CreateSharedContextLazy(); |
| + // This class always creates offscreen contests of this type. |
| + WebGraphicsContext3DCommandBufferImpl* context3d = |
| + static_cast<WebGraphicsContext3DCommandBufferImpl*>( |
| + shared_context_main_thread_.Context3d()); |
| + |
| gfx::GLSurfaceHandle handle = gfx::GLSurfaceHandle( |
| gfx::kNullPluginWindow, true); |
| - handle.parent_gpu_process_id = shared_context_->GetGPUProcessID(); |
| - handle.parent_client_id = shared_context_->GetChannelID(); |
| - |
| + handle.parent_gpu_process_id = context3d->GetGPUProcessID(); |
| + handle.parent_client_id = context3d->GetChannelID(); |
| return handle; |
| } |
| @@ -435,11 +460,12 @@ class GpuProcessTransportFactory |
| virtual scoped_refptr<ui::Texture> CreateTransportClient( |
| float device_scale_factor) { |
| - if (!shared_context_.get()) |
| + if (!shared_context_main_thread_.Context3d()) |
| return NULL; |
| scoped_refptr<ImageTransportClientTexture> image( |
| - new ImageTransportClientTexture(shared_context_.get(), |
| - device_scale_factor)); |
| + new ImageTransportClientTexture( |
| + shared_context_main_thread_.Context3d(), |
| + device_scale_factor)); |
| return image; |
| } |
| @@ -447,31 +473,37 @@ class GpuProcessTransportFactory |
| const gfx::Size& size, |
| float device_scale_factor, |
| unsigned int texture_id) OVERRIDE { |
| - if (!shared_context_.get()) |
| - return NULL; |
| - scoped_refptr<OwnedTexture> image( |
| - new OwnedTexture(shared_context_.get(), size, device_scale_factor, |
| - texture_id)); |
| + if (!shared_context_main_thread_.Context3d()) |
| + return NULL; |
| + scoped_refptr<OwnedTexture> image(new OwnedTexture( |
| + shared_context_main_thread_.Context3d(), |
| + size, |
| + device_scale_factor, |
| + texture_id)); |
| return image; |
| } |
| virtual GLHelper* GetGLHelper() { |
| if (!gl_helper_.get()) { |
| - CreateSharedContextLazy(); |
| - WebKit::WebGraphicsContext3D* context_for_thread = |
| + WebKit::WebGraphicsContext3D* main_thread_context = |
| + shared_context_main_thread_.Context3d(); |
| + if (!main_thread_context) |
| + return NULL; |
| + WebGraphicsContext3DCommandBufferImpl* helper_thread_context = |
| CreateOffscreenContext(); |
| - if (!context_for_thread) |
| + if (!helper_thread_context) |
| return NULL; |
| - gl_helper_.reset(new GLHelper(shared_context_.get(), |
| - context_for_thread)); |
| + gl_helper_.reset(new GLHelper(main_thread_context, |
| + helper_thread_context)); |
| } |
| return gl_helper_.get(); |
| } |
| virtual uint32 InsertSyncPoint() OVERRIDE { |
| - if (!shared_context_.get()) |
| + if (!shared_context_main_thread_.Context3d()) |
| return 0; |
| - return shared_context_->insertSyncPoint(); |
| + return shared_context_main_thread_.Context3d()-> |
| + insertSyncPoint(); |
| } |
| virtual void AddObserver(ImageTransportFactoryObserver* observer) { |
| @@ -482,16 +514,30 @@ 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())); |
| + // OffscreenContextClient implementation. |
| + virtual void DidCreateContext(OffscreenContext* offscreen_context, |
| + bool success) OVERRIDE { |
| + if (success) |
| + return; |
| + if (offscreen_context == &shared_context_main_thread_) { |
| + // 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 main thread context."; |
| + } |
| + } |
| + |
| + // OffscreenContextClient implementation. |
| + virtual void DidLoseContext(OffscreenContext* offscreen_context) |
| + OVERRIDE { |
| + if (offscreen_context == &shared_context_main_thread_) { |
| + MessageLoop::current()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&GpuProcessTransportFactory::OnLostMainThreadSharedContext, |
| + callback_factory_.GetWeakPtr())); |
| + } |
| } |
| - void OnLostContext(ui::Compositor* compositor) { |
| + void OnLostSwapContext(ui::Compositor* compositor) { |
| LOG(ERROR) << "Lost UI compositor context."; |
| PerCompositorData* data = per_compositor_data_[compositor]; |
| DCHECK(data); |
| @@ -514,8 +560,6 @@ class GpuProcessTransportFactory |
| PerCompositorData* CreatePerCompositorData(ui::Compositor* compositor) { |
| DCHECK(!per_compositor_data_[compositor]); |
| - CreateSharedContextLazy(); |
| - |
| gfx::AcceleratedWidget widget = compositor->widget(); |
| GpuSurfaceTracker* tracker = GpuSurfaceTracker::Get(); |
| @@ -560,31 +604,7 @@ class GpuProcessTransportFactory |
| return context.release(); |
| } |
| - void CreateSharedContextLazy() { |
| - if (shared_context_.get()) |
| - return; |
| - |
| - 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. |
| - 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. |
| - LOG(FATAL) << "Failed to make UI shared context current."; |
| - } |
| - shared_context_->setContextLostCallback(this); |
| - } |
| - |
| - void OnLostSharedContext() { |
| - // 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_ptr<GLHelper> old_helper(gl_helper_.release()); |
| - |
| + void OnLostMainThreadSharedContext() { |
|
piman
2013/02/11 18:45:33
Mmh, there was code here to keep alive the context
danakj
2013/02/11 18:58:13
Hm, ya I lost the GLHelper thing. I kept the resou
|
| FOR_EACH_OBSERVER(ImageTransportFactoryObserver, |
| observer_list_, |
| OnLostResources()); |
| @@ -592,7 +612,8 @@ class GpuProcessTransportFactory |
| typedef std::map<ui::Compositor*, PerCompositorData*> PerCompositorDataMap; |
| PerCompositorDataMap per_compositor_data_; |
| - scoped_ptr<WebGraphicsContext3DCommandBufferImpl> shared_context_; |
| + OffscreenContext shared_context_main_thread_; |
| + OffscreenContext shared_context_compositor_thread_; |
| scoped_ptr<GLHelper> gl_helper_; |
| ObserverList<ImageTransportFactoryObserver> observer_list_; |
| base::WeakPtrFactory<GpuProcessTransportFactory> callback_factory_; |
| @@ -601,8 +622,8 @@ class GpuProcessTransportFactory |
| DISALLOW_COPY_AND_ASSIGN(GpuProcessTransportFactory); |
| }; |
| -void CompositorSwapClient::OnLostContext() { |
| - factory_->OnLostContext(compositor_); |
| +void CompositorSwapClient::OnLostSwapContext() { |
| + factory_->OnLostSwapContext(compositor_); |
| // Note: previous line destroyed this. Don't access members from now on. |
| } |