| 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..cba6dde7da614da630c08f7c749e962e8c4a6a2e 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,32 @@ 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 RestoreContext() {
|
| + FOR_EACH_OBSERVER(StreamTextureFactoryContextObserver,
|
| + observer_list_,
|
| + ResetStreamTextureProxy());
|
| + }
|
| +
|
| 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,6 +243,13 @@ 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() {
|
| @@ -234,6 +258,11 @@ void SynchronousCompositorFactoryImpl::CompositorReleasedHardwareDraw() {
|
| num_hardware_compositors_--;
|
| }
|
|
|
| +void SynchronousCompositorFactoryImpl::RestoreContextOnMainThread() {
|
| + if (CanCreateMainThreadContext() && video_context_provider_ )
|
| + video_context_provider_->RestoreContext();
|
| +}
|
| +
|
| bool SynchronousCompositorFactoryImpl::CanCreateMainThreadContext() {
|
| base::AutoLock lock(num_hardware_compositor_lock_);
|
| return num_hardware_compositors_ > 0;
|
| @@ -241,6 +270,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
|
|
|