Chromium Code Reviews| Index: content/browser/aura/gpu_process_transport_factory.cc |
| diff --git a/content/browser/aura/gpu_process_transport_factory.cc b/content/browser/aura/gpu_process_transport_factory.cc |
| index 06057138de699d92d887327d23330346e59fec6a..b740c5c5cea85c4f43fd9f08675fd94eb673d686 100644 |
| --- a/content/browser/aura/gpu_process_transport_factory.cc |
| +++ b/content/browser/aura/gpu_process_transport_factory.cc |
| @@ -74,6 +74,7 @@ class OwnedTexture : public ui::Texture, ImageTransportFactoryObserver { |
| // ImageTransportFactory overrides: |
| virtual void OnLostResources() OVERRIDE { |
| DeleteTexture(); |
| + host_context_ = NULL; |
| } |
| protected: |
| @@ -90,9 +91,8 @@ class OwnedTexture : public ui::Texture, ImageTransportFactoryObserver { |
| } |
| } |
| - // A raw pointer. This |ImageTransportClientTexture| will be destroyed |
| - // before the |host_context_| via |
| - // |ImageTransportFactoryObserver::OnLostContext()| handlers. |
| + // The OnLostResources() callback will happen before this context |
| + // pointer is destroyed. |
| WebKit::WebGraphicsContext3D* host_context_; |
| unsigned texture_id_; |
| @@ -387,8 +387,11 @@ void GpuProcessTransportFactory::RemoveObserver( |
| scoped_refptr<cc::ContextProvider> |
| GpuProcessTransportFactory::OffscreenContextProviderForMainThread() { |
| - if (!shared_contexts_main_thread_.get() || |
| - shared_contexts_main_thread_->DestroyedOnMainThread()) { |
| + // Don't check for DestroyedOnMainThread() here. We hear about context |
| + // loss for this context through the lost context callback. If the context |
| + // is lost, we want to leave this ContextProvider available until the lost |
| + // context notification is sent to the ImageTransportFactoryObserver clients. |
| + if (!shared_contexts_main_thread_.get()) { |
| shared_contexts_main_thread_ = ContextProviderCommandBuffer::Create( |
| GpuProcessTransportFactory::CreateOffscreenCommandBufferContext()); |
| if (shared_contexts_main_thread_) { |
| @@ -406,8 +409,10 @@ GpuProcessTransportFactory::OffscreenContextProviderForMainThread() { |
| scoped_refptr<cc::ContextProvider> |
| GpuProcessTransportFactory::OffscreenContextProviderForCompositorThread() { |
| - if (!shared_contexts_compositor_thread_.get() || |
| - shared_contexts_compositor_thread_->DestroyedOnMainThread()) { |
| + // The lifetime of this context is tied to the main thread context so that |
| + // they are always in the same share group. So do not check for |
| + // DestroyedOnMainThread(). |
| + if (!shared_contexts_compositor_thread_.get()) { |
| shared_contexts_compositor_thread_ = ContextProviderCommandBuffer::Create( |
| GpuProcessTransportFactory::CreateOffscreenCommandBufferContext()); |
| } |
| @@ -493,18 +498,29 @@ void GpuProcessTransportFactory::OnLostMainThreadSharedContextInsideCallback() { |
| void GpuProcessTransportFactory::OnLostMainThreadSharedContext() { |
| LOG(ERROR) << "Lost UI shared context."; |
| + |
| // Keep old resources around while we call the observers, but ensure that |
| // new resources are created if needed. |
| + // Kill shared contexts for both threads in tandom so they are always in |
|
piman
2013/08/22 01:14:48
nit: s/tandom/tandem/
danakj
2013/08/22 01:18:04
Done.
|
| + // the same share group. |
| - scoped_refptr<ContextProviderCommandBuffer> old_contexts_main_thread = |
| + scoped_refptr<cc::ContextProvider> lost_shared_contexts_main_thread = |
| shared_contexts_main_thread_; |
| + scoped_refptr<cc::ContextProvider> lost_shared_contexts_compositor_thread = |
| + shared_contexts_compositor_thread_; |
| shared_contexts_main_thread_ = NULL; |
| + shared_contexts_compositor_thread_ = NULL; |
| - scoped_ptr<GLHelper> old_helper(gl_helper_.release()); |
| + scoped_ptr<GLHelper> lost_gl_helper = gl_helper_.Pass(); |
| FOR_EACH_OBSERVER(ImageTransportFactoryObserver, |
| observer_list_, |
| OnLostResources()); |
| + |
| + // Kill things that use the shared context before killing the shared context. |
| + lost_gl_helper.reset(); |
| + lost_shared_contexts_main_thread = NULL; |
| + lost_shared_contexts_compositor_thread = NULL; |
| } |
| } // namespace content |