Index: content/browser/android/in_process/synchronous_compositor_factory_impl.cc |
diff --git a/content/browser/android/in_process/synchronous_compositor_factory_impl.cc b/content/browser/android/in_process/synchronous_compositor_factory_impl.cc |
index b7a2cc2ed9aab0f77526c2045d4f0d626283015a..8834bd416b98a413d26b2f9dbe2b83c26a29591a 100644 |
--- a/content/browser/android/in_process/synchronous_compositor_factory_impl.cc |
+++ b/content/browser/android/in_process/synchronous_compositor_factory_impl.cc |
@@ -4,6 +4,7 @@ |
#include "content/browser/android/in_process/synchronous_compositor_factory_impl.h" |
+#include "base/observer_list.h" |
#include "content/browser/android/in_process/synchronous_compositor_output_surface.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/renderer/gpu/frame_swap_message_queue.h" |
@@ -104,7 +105,9 @@ WrapContextWithAttributes( |
context.Pass(), attributes)); |
} |
-class VideoContextProvider |
+} // namespace |
+ |
+class SynchronousCompositorFactoryImpl::VideoContextProvider |
: public StreamTextureFactorySynchronousImpl::ContextProvider { |
public: |
VideoContextProvider( |
@@ -126,18 +129,37 @@ class VideoContextProvider |
return context_provider_->ContextGL(); |
} |
+ virtual void AddObserver(StreamTextureFactoryContextObserver* obs) OVERRIDE { |
+ observer_list_.AddObserver(obs); |
+ } |
+ |
+ virtual void RemoveObserver( |
+ StreamTextureFactoryContextObserver* obs) OVERRIDE { |
+ observer_list_.RemoveObserver(obs); |
+ } |
+ |
+ void LoseContext() { |
+ FOR_EACH_OBSERVER( |
+ StreamTextureFactoryContextObserver, observer_list_, OnContextLost()); |
+ } |
+ |
+ void RestoreContext() { |
+ FOR_EACH_OBSERVER(StreamTextureFactoryContextObserver, |
+ observer_list_, |
+ OnContextRestored()); |
+ } |
+ |
private: |
friend class base::RefCountedThreadSafe<VideoContextProvider>; |
virtual ~VideoContextProvider() {} |
scoped_refptr<cc::ContextProvider> context_provider_; |
gpu::GLInProcessContext* gl_in_process_context_; |
+ ObserverList<StreamTextureFactoryContextObserver> observer_list_; |
DISALLOW_COPY_AND_ASSIGN(VideoContextProvider); |
}; |
-} // namespace |
- |
using webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl; |
SynchronousCompositorFactoryImpl::SynchronousCompositorFactoryImpl() |
@@ -226,12 +248,35 @@ SynchronousCompositorFactoryImpl::CreateOffscreenGraphicsContext3D( |
void SynchronousCompositorFactoryImpl::CompositorInitializedHardwareDraw() { |
base::AutoLock lock(num_hardware_compositor_lock_); |
num_hardware_compositors_++; |
+ if (num_hardware_compositors_ == 1 && main_thread_proxy_) { |
+ main_thread_proxy_->PostTask( |
+ FROM_HERE, |
+ base::Bind( |
+ &SynchronousCompositorFactoryImpl::RestoreContextOnMainThread, |
+ base::Unretained(this))); |
+ } |
} |
void SynchronousCompositorFactoryImpl::CompositorReleasedHardwareDraw() { |
base::AutoLock lock(num_hardware_compositor_lock_); |
DCHECK_GT(num_hardware_compositors_, 0u); |
num_hardware_compositors_--; |
+ if (!num_hardware_compositors_ && main_thread_proxy_) { |
+ main_thread_proxy_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&SynchronousCompositorFactoryImpl::LoseContextOnMainThread, |
+ base::Unretained(this))); |
+ } |
+} |
+ |
+void SynchronousCompositorFactoryImpl::LoseContextOnMainThread() { |
+ if (video_context_provider_) |
+ video_context_provider_->LoseContext(); |
+} |
+ |
+void SynchronousCompositorFactoryImpl::RestoreContextOnMainThread() { |
+ if (video_context_provider_) |
+ video_context_provider_->RestoreContext(); |
} |
bool SynchronousCompositorFactoryImpl::CanCreateMainThreadContext() { |
@@ -241,6 +286,11 @@ bool SynchronousCompositorFactoryImpl::CanCreateMainThreadContext() { |
scoped_refptr<StreamTextureFactorySynchronousImpl::ContextProvider> |
SynchronousCompositorFactoryImpl::TryCreateStreamTextureFactory() { |
+ { |
+ base::AutoLock lock(num_hardware_compositor_lock_); |
+ main_thread_proxy_ = base::MessageLoopProxy::current(); |
+ } |
+ |
// Always fail creation even if |video_context_provider_| is not NULL. |
// This is to avoid synchronous calls that may deadlock. Setting |
// |video_context_provider_| to null is also not safe since it makes |