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

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

Issue 143023005: Support multiple service instances with GLInProcessContext (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 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_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 5024ff86fa1e78cbc8c7aff83e1ef4a5c30f14f8..90ba4fa5208c503bd87eb3e9c43afa2577ef0ae8 100644
--- a/content/browser/android/in_process/synchronous_compositor_factory_impl.cc
+++ b/content/browser/android/in_process/synchronous_compositor_factory_impl.cc
@@ -8,6 +8,8 @@
#include "content/public/browser/browser_thread.h"
#include "gpu/command_buffer/client/gl_in_process_context.h"
#include "ui/gl/android/surface_texture.h"
+#include "ui/gl/gl_surface.h"
+#include "ui/gl/gl_surface_stub.h"
#include "webkit/common/gpu/context_provider_in_process.h"
#include "webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h"
@@ -17,14 +19,62 @@ namespace content {
namespace {
+blink::WebGraphicsContext3D::Attributes GetDefaultAttribs() {
+ blink::WebGraphicsContext3D::Attributes attributes;
+ attributes.antialias = false;
+ attributes.depth = false;
+ attributes.stencil = false;
+ attributes.shareResources = true;
+ attributes.noAutomaticFlushes = true;
+
+ return attributes;
+}
+
+using webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl;
+
+scoped_ptr<gpu::GLInProcessContext> CreateContext(
+ scoped_refptr<gfx::GLSurface> surface,
+ scoped_refptr<gpu::InProcessCommandBuffer::Service> service,
+ gpu::GLInProcessContext* share_context) {
+ const gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu;
+
+ if (!surface)
+ surface = gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(1, 1));
+
+ gpu::GLInProcessContextAttribs in_process_attribs;
+ WebGraphicsContext3DInProcessCommandBufferImpl::ConvertAttributes(
+ GetDefaultAttribs(), &in_process_attribs);
+ scoped_ptr<gpu::GLInProcessContext> context(
+ gpu::GLInProcessContext::CreateWithSurface(surface,
+ service,
+ share_context,
+ in_process_attribs,
+ gpu_preference));
+ return context.Pass();
+}
+
+scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl> WrapContext(
+ scoped_ptr<gpu::GLInProcessContext> context) {
+ if (!context.get())
+ return scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>();
+
+ return scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>(
+ WebGraphicsContext3DInProcessCommandBufferImpl::WrapContext(
+ context.Pass(), GetDefaultAttribs()));
+}
+
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) {}
+ scoped_ptr<gpu::GLInProcessContext> gl_in_process_context)
+ : gl_in_process_context_(gl_in_process_context.get()) {
+
+ context_provider_ = webkit::gpu::ContextProviderInProcess::Create(
+ WrapContext(gl_in_process_context.Pass()),
+ "Video-Offscreen-main-thread");
+ context_provider_->BindToCurrentThread();
+ }
virtual scoped_refptr<gfx::SurfaceTexture> GetSurfaceTexture(
uint32 stream_id) OVERRIDE {
@@ -51,6 +101,7 @@ using webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl;
SynchronousCompositorFactoryImpl::SynchronousCompositorFactoryImpl()
: wrapped_gl_context_for_main_thread_(NULL),
+ wrapped_gl_context_for_compositor_thread_(NULL),
num_hardware_compositors_(0) {
SynchronousCompositorFactory::SetInstance(this);
}
@@ -76,17 +127,16 @@ SynchronousCompositorFactoryImpl::GetInputHandlerManagerClient() {
scoped_refptr<ContextProviderWebContext>
SynchronousCompositorFactoryImpl::GetOffscreenContextProviderForMainThread() {
- // 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 = false;
if ((!offscreen_context_for_main_thread_.get() ||
offscreen_context_for_main_thread_->DestroyedOnMainThread())) {
+ scoped_ptr<gpu::GLInProcessContext> context =
+ CreateContext(NULL, NULL, NULL);
+ wrapped_gl_context_for_main_thread_ = context.get();
offscreen_context_for_main_thread_ =
webkit::gpu::ContextProviderInProcess::Create(
- CreateOffscreenContext(),
- "Compositor-Offscreen");
+ WrapContext(context.Pass()),
+ "Compositor-Offscreen-main-thread");
failed = !offscreen_context_for_main_thread_.get() ||
!offscreen_context_for_main_thread_->BindToCurrentThread();
}
@@ -107,14 +157,40 @@ SynchronousCompositorFactoryImpl::GetOffscreenContextProviderForMainThread() {
scoped_refptr<cc::ContextProvider> SynchronousCompositorFactoryImpl::
GetOffscreenContextProviderForCompositorThread() {
base::AutoLock lock(offscreen_context_for_compositor_thread_lock_);
+ DCHECK(service_);
+ bool failed = false;
if (!offscreen_context_for_compositor_thread_.get() ||
offscreen_context_for_compositor_thread_->DestroyedOnMainThread()) {
+ scoped_ptr<gpu::GLInProcessContext> context =
+ CreateContext(new gfx::GLSurfaceStub, service_, NULL);
+ wrapped_gl_context_for_compositor_thread_ = context.get();
offscreen_context_for_compositor_thread_ =
- webkit::gpu::ContextProviderInProcess::CreateOffscreen();
+ webkit::gpu::ContextProviderInProcess::Create(
+ WrapContext(context.Pass()),
+ "Compositor-Offscreen-compositor-thread");
+ failed = !offscreen_context_for_compositor_thread_.get() ||
+ !offscreen_context_for_compositor_thread_->BindToCurrentThread();
+ }
+ if (failed) {
+ offscreen_context_for_compositor_thread_ = NULL;
+ wrapped_gl_context_for_compositor_thread_ = NULL;
}
return offscreen_context_for_compositor_thread_;
}
+scoped_refptr<cc::ContextProvider> SynchronousCompositorFactoryImpl::
+ CreateOnscreenContextProviderForCompositorThread(
+ scoped_refptr<gfx::GLSurface> surface) {
+ DCHECK(surface);
+ DCHECK(service_);
+ DCHECK(wrapped_gl_context_for_compositor_thread_);
+
+ return webkit::gpu::ContextProviderInProcess::Create(
+ WrapContext(CreateContext(
+ surface, service_, wrapped_gl_context_for_compositor_thread_)),
+ "Compositor-Onscreen");
+}
+
scoped_ptr<StreamTextureFactory>
SynchronousCompositorFactoryImpl::CreateStreamTextureFactory(int view_id) {
scoped_ptr<StreamTextureFactorySynchronousImpl> factory(
@@ -162,45 +238,26 @@ 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_);
+ // 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.
+ if (CanCreateMainThreadContext() && !video_context_provider_) {
+ DCHECK(service_);
+ DCHECK(wrapped_gl_context_for_compositor_thread_);
+
+ video_context_provider_ = new VideoContextProvider(
+ CreateContext(new gfx::GLSurfaceStub,
+ service_,
+ wrapped_gl_context_for_compositor_thread_));
}
- return context_provider;
+ return video_context_provider_;
}
-// TODO(boliu): Deduplicate this with synchronous_compositor_output_surface.cc.
-scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>
-SynchronousCompositorFactoryImpl::CreateOffscreenContext() {
- 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));
+void SynchronousCompositorFactoryImpl::SetDeferredGpuService(
+ scoped_refptr<gpu::InProcessCommandBuffer::Service> service) {
+ DCHECK(!service_);
+ service_ = service;
}
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698