| Index: content/browser/android/in_process/synchronous_compositor_impl.cc
|
| diff --git a/content/browser/android/in_process/synchronous_compositor_impl.cc b/content/browser/android/in_process/synchronous_compositor_impl.cc
|
| index 230b1e92dc621158acd4004bc28e08155914d73b..f9fda921c41427bf754225dd3e92e1e7f7a0e957 100644
|
| --- a/content/browser/android/in_process/synchronous_compositor_impl.cc
|
| +++ b/content/browser/android/in_process/synchronous_compositor_impl.cc
|
| @@ -6,30 +6,21 @@
|
|
|
| #include "base/lazy_instance.h"
|
| #include "base/message_loop/message_loop.h"
|
| -#include "base/synchronization/lock.h"
|
| #include "cc/input/input_handler.h"
|
| #include "cc/input/layer_scroll_offset_delegate.h"
|
| +#include "content/browser/android/in_process/synchronous_compositor_factory_impl.h"
|
| #include "content/browser/android/in_process/synchronous_input_event_filter.h"
|
| #include "content/browser/renderer_host/render_widget_host_view_android.h"
|
| #include "content/public/browser/android/synchronous_compositor_client.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/render_process_host.h"
|
| #include "content/public/browser/render_view_host.h"
|
| -#include "content/renderer/android/synchronous_compositor_factory.h"
|
| -#include "content/renderer/media/android/stream_texture_factory_android_synchronous_impl.h"
|
| -#include "gpu/command_buffer/client/gl_in_process_context.h"
|
| -#include "gpu/command_buffer/service/stream_texture_manager_in_process_android.h"
|
| -#include "ui/gl/android/surface_texture.h"
|
| #include "ui/gl/gl_surface.h"
|
| -#include "webkit/common/gpu/context_provider_in_process.h"
|
| -#include "webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h"
|
|
|
| namespace content {
|
|
|
| namespace {
|
|
|
| -using webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl;
|
| -
|
| int GetInProcessRendererId() {
|
| content::RenderProcessHost::iterator it =
|
| content::RenderProcessHost::AllHostsIterator();
|
| @@ -45,223 +36,6 @@ int GetInProcessRendererId() {
|
| return id;
|
| }
|
|
|
| -class VideoContextProvider
|
| - : public StreamTextureFactorySynchronousImpl::ContextProvider {
|
| - public:
|
| - VideoContextProvider(
|
| - const scoped_refptr<cc::ContextProvider>& context_provider,
|
| - gpu::GLInProcessContext* gl_in_process_context)
|
| - : context_provider_(context_provider),
|
| - gl_in_process_context_(gl_in_process_context) {}
|
| -
|
| - virtual scoped_refptr<gfx::SurfaceTexture> GetSurfaceTexture(
|
| - uint32 stream_id) OVERRIDE {
|
| - return gl_in_process_context_->GetSurfaceTexture(stream_id);
|
| - }
|
| -
|
| - virtual blink::WebGraphicsContext3D* Context3d() OVERRIDE {
|
| - return context_provider_->Context3d();
|
| - }
|
| -
|
| - private:
|
| - friend class base::RefCountedThreadSafe<VideoContextProvider>;
|
| - virtual ~VideoContextProvider() {}
|
| -
|
| - scoped_refptr<cc::ContextProvider> context_provider_;
|
| - gpu::GLInProcessContext* gl_in_process_context_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(VideoContextProvider);
|
| -};
|
| -
|
| -class SynchronousCompositorFactoryImpl : public SynchronousCompositorFactory {
|
| - public:
|
| - SynchronousCompositorFactoryImpl()
|
| - : wrapped_gl_context_for_main_thread_(NULL),
|
| - num_hardware_compositors_(0) {
|
| - SynchronousCompositorFactory::SetInstance(this);
|
| - }
|
| -
|
| - // SynchronousCompositorFactory
|
| - virtual scoped_refptr<base::MessageLoopProxy>
|
| - GetCompositorMessageLoop() OVERRIDE {
|
| - return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI);
|
| - }
|
| -
|
| - virtual scoped_ptr<cc::OutputSurface> CreateOutputSurface(
|
| - int routing_id) OVERRIDE {
|
| - scoped_ptr<SynchronousCompositorOutputSurface> output_surface(
|
| - new SynchronousCompositorOutputSurface(routing_id));
|
| - return output_surface.PassAs<cc::OutputSurface>();
|
| - }
|
| -
|
| - virtual InputHandlerManagerClient* GetInputHandlerManagerClient() OVERRIDE {
|
| - return synchronous_input_event_filter();
|
| - }
|
| -
|
| - SynchronousInputEventFilter* synchronous_input_event_filter() {
|
| - return &synchronous_input_event_filter_;
|
| - }
|
| -
|
| - scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>
|
| - CreateOffscreenContext() {
|
| - if (!gfx::GLSurface::InitializeOneOff())
|
| - return scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>();
|
| -
|
| - const gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu;
|
| -
|
| - blink::WebGraphicsContext3D::Attributes attributes;
|
| - attributes.antialias = false;
|
| - attributes.shareResources = true;
|
| - attributes.noAutomaticFlushes = true;
|
| -
|
| - gpu::GLInProcessContextAttribs in_process_attribs;
|
| - WebGraphicsContext3DInProcessCommandBufferImpl::ConvertAttributes(
|
| - attributes, &in_process_attribs);
|
| - scoped_ptr<gpu::GLInProcessContext> context(
|
| - gpu::GLInProcessContext::CreateContext(true,
|
| - NULL,
|
| - gfx::Size(1, 1),
|
| - attributes.shareResources,
|
| - in_process_attribs,
|
| - gpu_preference));
|
| -
|
| - wrapped_gl_context_for_main_thread_ = context.get();
|
| - if (!context.get())
|
| - return scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>();
|
| -
|
| - return scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>(
|
| - WebGraphicsContext3DInProcessCommandBufferImpl::WrapContext(
|
| - context.Pass(), attributes));
|
| - }
|
| -
|
| - virtual scoped_refptr<cc::ContextProvider>
|
| - GetOffscreenContextProviderForMainThread() OVERRIDE {
|
| - // This check only guarantees the main thread context is created after
|
| - // a compositor did successfully initialize hardware draw in the past.
|
| - // In particular this does not guarantee that the main thread context
|
| - // will fail creation when all compositors release hardware draw.
|
| - bool failed = !CanCreateMainThreadContext();
|
| - if (!failed &&
|
| - (!offscreen_context_for_main_thread_.get() ||
|
| - offscreen_context_for_main_thread_->DestroyedOnMainThread())) {
|
| - offscreen_context_for_main_thread_ =
|
| - webkit::gpu::ContextProviderInProcess::Create(
|
| - CreateOffscreenContext(),
|
| - "Compositor-Offscreen");
|
| - failed = !offscreen_context_for_main_thread_.get() ||
|
| - !offscreen_context_for_main_thread_->BindToCurrentThread();
|
| - }
|
| -
|
| - if (failed) {
|
| - offscreen_context_for_main_thread_ = NULL;
|
| - wrapped_gl_context_for_main_thread_ = NULL;
|
| - }
|
| - return offscreen_context_for_main_thread_;
|
| - }
|
| -
|
| - // This is called on both renderer main thread (offscreen context creation
|
| - // path shared between cross-process and in-process platforms) and renderer
|
| - // compositor impl thread (InitializeHwDraw) in order to support Android
|
| - // WebView synchronously enable and disable hardware mode multiple times in
|
| - // the same task. This is ok because in-process WGC3D creation may happen on
|
| - // any thread and is lightweight.
|
| - virtual scoped_refptr<cc::ContextProvider>
|
| - GetOffscreenContextProviderForCompositorThread() OVERRIDE {
|
| - base::AutoLock lock(offscreen_context_for_compositor_thread_lock_);
|
| - if (!offscreen_context_for_compositor_thread_.get() ||
|
| - offscreen_context_for_compositor_thread_->DestroyedOnMainThread()) {
|
| - offscreen_context_for_compositor_thread_ =
|
| - webkit::gpu::ContextProviderInProcess::CreateOffscreen();
|
| - }
|
| - return offscreen_context_for_compositor_thread_;
|
| - }
|
| -
|
| - virtual scoped_ptr<StreamTextureFactory> CreateStreamTextureFactory(
|
| - int view_id) OVERRIDE {
|
| - scoped_ptr<StreamTextureFactorySynchronousImpl> factory(
|
| - new StreamTextureFactorySynchronousImpl(
|
| - base::Bind(&SynchronousCompositorFactoryImpl::
|
| - TryCreateStreamTextureFactory,
|
| - base::Unretained(this)),
|
| - view_id));
|
| - return factory.PassAs<StreamTextureFactory>();
|
| - }
|
| -
|
| - void CompositorInitializedHardwareDraw(SynchronousCompositorImpl* compositor);
|
| - void CompositorReleasedHardwareDraw(SynchronousCompositorImpl* compositor);
|
| -
|
| - private:
|
| - void ReleaseGlobalHardwareResources();
|
| - bool CanCreateMainThreadContext();
|
| - scoped_refptr<StreamTextureFactorySynchronousImpl::ContextProvider>
|
| - TryCreateStreamTextureFactory();
|
| -
|
| - SynchronousInputEventFilter synchronous_input_event_filter_;
|
| -
|
| - // Only guards construction and destruction of
|
| - // |offscreen_context_for_compositor_thread_|, not usage.
|
| - base::Lock offscreen_context_for_compositor_thread_lock_;
|
| - scoped_refptr<cc::ContextProvider> offscreen_context_for_main_thread_;
|
| - // This is a pointer to the context owned by
|
| - // |offscreen_context_for_main_thread_|.
|
| - gpu::GLInProcessContext* wrapped_gl_context_for_main_thread_;
|
| - scoped_refptr<cc::ContextProvider> offscreen_context_for_compositor_thread_;
|
| -
|
| - // |num_hardware_compositor_lock_| is updated on UI thread only but can be
|
| - // read on renderer main thread.
|
| - base::Lock num_hardware_compositor_lock_;
|
| - unsigned int num_hardware_compositors_;
|
| -};
|
| -
|
| -void SynchronousCompositorFactoryImpl::CompositorInitializedHardwareDraw(
|
| - SynchronousCompositorImpl* compositor) {
|
| - base::AutoLock lock(num_hardware_compositor_lock_);
|
| - num_hardware_compositors_++;
|
| -}
|
| -
|
| -void SynchronousCompositorFactoryImpl::CompositorReleasedHardwareDraw(
|
| - SynchronousCompositorImpl* compositor) {
|
| - bool should_release_resources = false;
|
| - {
|
| - base::AutoLock lock(num_hardware_compositor_lock_);
|
| - DCHECK_GT(num_hardware_compositors_, 0u);
|
| - num_hardware_compositors_--;
|
| - should_release_resources = num_hardware_compositors_ == 0u;
|
| - }
|
| - if (should_release_resources)
|
| - ReleaseGlobalHardwareResources();
|
| -}
|
| -
|
| -void SynchronousCompositorFactoryImpl::ReleaseGlobalHardwareResources() {
|
| - {
|
| - base::AutoLock lock(offscreen_context_for_compositor_thread_lock_);
|
| - offscreen_context_for_compositor_thread_ = NULL;
|
| - }
|
| -
|
| - // TODO(boliu): Properly clean up command buffer server of main thread
|
| - // context here.
|
| -}
|
| -
|
| -bool SynchronousCompositorFactoryImpl::CanCreateMainThreadContext() {
|
| - base::AutoLock lock(num_hardware_compositor_lock_);
|
| - return num_hardware_compositors_ > 0;
|
| -}
|
| -
|
| -scoped_refptr<StreamTextureFactorySynchronousImpl::ContextProvider>
|
| -SynchronousCompositorFactoryImpl::TryCreateStreamTextureFactory() {
|
| - scoped_refptr<StreamTextureFactorySynchronousImpl::ContextProvider>
|
| - context_provider;
|
| - if (CanCreateMainThreadContext() &&
|
| - GetOffscreenContextProviderForMainThread()) {
|
| - DCHECK(offscreen_context_for_main_thread_);
|
| - DCHECK(wrapped_gl_context_for_main_thread_);
|
| - context_provider =
|
| - new VideoContextProvider(offscreen_context_for_main_thread_,
|
| - wrapped_gl_context_for_main_thread_);
|
| - }
|
| - return context_provider;
|
| -}
|
| -
|
| base::LazyInstance<SynchronousCompositorFactoryImpl>::Leaky g_factory =
|
| LAZY_INSTANCE_INITIALIZER;
|
|
|
| @@ -316,7 +90,7 @@ bool SynchronousCompositorImpl::InitializeHwDraw(
|
| surface,
|
| g_factory.Get().GetOffscreenContextProviderForCompositorThread());
|
| if (success)
|
| - g_factory.Get().CompositorInitializedHardwareDraw(this);
|
| + g_factory.Get().CompositorInitializedHardwareDraw();
|
| return success;
|
| }
|
|
|
| @@ -324,7 +98,7 @@ void SynchronousCompositorImpl::ReleaseHwDraw() {
|
| DCHECK(CalledOnValidThread());
|
| DCHECK(output_surface_);
|
| output_surface_->ReleaseHwDraw();
|
| - g_factory.Get().CompositorReleasedHardwareDraw(this);
|
| + g_factory.Get().CompositorReleasedHardwareDraw();
|
| }
|
|
|
| bool SynchronousCompositorImpl::DemandDrawHw(
|
|
|