Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(712)

Unified Diff: content/browser/android/in_process/synchronous_compositor_impl.cc

Issue 102963010: Move SynchronousCompositorFactoryImpl into separate h/cc files (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: style Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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(
« no previous file with comments | « content/browser/android/in_process/synchronous_compositor_factory_impl.cc ('k') | content/content_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698