Chromium Code Reviews| Index: gpu/command_buffer/client/gl_in_process_context.cc |
| diff --git a/gpu/command_buffer/client/gl_in_process_context.cc b/gpu/command_buffer/client/gl_in_process_context.cc |
| index 3c19c4d22fb40d78453c75f8c10a6aea746dc552..d9a258eaf291a7be629fc2d9455be95d8b5c8af0 100644 |
| --- a/gpu/command_buffer/client/gl_in_process_context.cc |
| +++ b/gpu/command_buffer/client/gl_in_process_context.cc |
| @@ -26,7 +26,6 @@ |
| #include "gpu/command_buffer/client/transfer_buffer.h" |
| #include "gpu/command_buffer/common/command_buffer.h" |
| #include "gpu/command_buffer/common/constants.h" |
| -#include "gpu/command_buffer/service/in_process_command_buffer.h" |
| #include "ui/gfx/size.h" |
| #include "ui/gl/gl_image.h" |
| @@ -52,13 +51,16 @@ class GLInProcessContextImpl |
| explicit GLInProcessContextImpl(); |
| virtual ~GLInProcessContextImpl(); |
| - bool Initialize(scoped_refptr<gfx::GLSurface> surface, |
| - bool is_offscreen, |
| - bool share_resources, |
| - gfx::AcceleratedWidget window, |
| - const gfx::Size& size, |
| - const GLInProcessContextAttribs& attribs, |
| - gfx::GpuPreference gpu_preference); |
| + bool Initialize( |
| + scoped_refptr<gfx::GLSurface> surface, |
| + bool is_offscreen, |
| + bool use_global_share_group, |
| + GLInProcessContext* share_context, |
| + gfx::AcceleratedWidget window, |
| + const gfx::Size& size, |
| + const GLInProcessContextAttribs& attribs, |
| + gfx::GpuPreference gpu_preference, |
| + const scoped_refptr<InProcessCommandBuffer::Service>& service); |
| // GLInProcessContext implementation: |
| virtual void SetContextLostCallback(const base::Closure& callback) OVERRIDE; |
| @@ -120,11 +122,14 @@ void GLInProcessContextImpl::OnContextLost() { |
| bool GLInProcessContextImpl::Initialize( |
| scoped_refptr<gfx::GLSurface> surface, |
| bool is_offscreen, |
| - bool share_resources, |
| + bool use_global_share_group, |
| + GLInProcessContext* share_context, |
| gfx::AcceleratedWidget window, |
| const gfx::Size& size, |
| const GLInProcessContextAttribs& attribs, |
| - gfx::GpuPreference gpu_preference) { |
| + gfx::GpuPreference gpu_preference, |
| + const scoped_refptr<InProcessCommandBuffer::Service>& service) { |
| + DCHECK(!use_global_share_group || !share_context); |
| DCHECK(size.width() >= 0 && size.height() >= 0); |
| // Changes to these values should also be copied to |
| @@ -184,12 +189,12 @@ bool GLInProcessContextImpl::Initialize( |
| base::Closure wrapped_callback = |
| base::Bind(&GLInProcessContextImpl::OnContextLost, AsWeakPtr()); |
| - command_buffer_.reset(new InProcessCommandBuffer()); |
| + command_buffer_.reset(new InProcessCommandBuffer(service)); |
|
piman
2014/02/12 04:10:42
Should we have a check somewhere that |service| is
no sievers
2014/02/12 22:31:29
I added a DCHECK() in InProcessCommandBuffer::Init
|
| scoped_ptr<base::AutoLock> scoped_shared_context_lock; |
| scoped_refptr<gles2::ShareGroup> share_group; |
| InProcessCommandBuffer* share_command_buffer = NULL; |
| - if (share_resources) { |
| + if (use_global_share_group) { |
| scoped_shared_context_lock.reset( |
| new base::AutoLock(g_all_shared_contexts_lock.Get())); |
| for (std::set<GLInProcessContextImpl*>::const_iterator it = |
| @@ -205,7 +210,15 @@ bool GLInProcessContextImpl::Initialize( |
| break; |
| } |
| } |
| + } else if (share_context) { |
| + GLInProcessContextImpl* impl = |
| + static_cast<GLInProcessContextImpl*>(share_context); |
| + share_group = impl->gles2_implementation_->share_group(); |
| + share_command_buffer = impl->command_buffer_.get(); |
| + DCHECK(share_group); |
| + DCHECK(share_command_buffer); |
| } |
| + |
| if (!command_buffer_->Initialize(surface, |
| is_offscreen, |
| window, |
| @@ -241,7 +254,7 @@ bool GLInProcessContextImpl::Initialize( |
| free_everything_when_invisible, |
| command_buffer_.get())); |
| - if (share_resources) { |
| + if (use_global_share_group) { |
| g_all_shared_contexts.Get().insert(this); |
| scoped_shared_context_lock.reset(); |
| } |
| @@ -307,10 +320,12 @@ GLInProcessContext* GLInProcessContext::CreateContext( |
| NULL /* surface */, |
| is_offscreen, |
| share_resources, |
| + NULL, |
| window, |
| size, |
| attribs, |
| - gpu_preference)) |
| + gpu_preference, |
| + scoped_refptr<InProcessCommandBuffer::Service>())) |
| return NULL; |
| return context.release(); |
| @@ -319,7 +334,8 @@ GLInProcessContext* GLInProcessContext::CreateContext( |
| // static |
| GLInProcessContext* GLInProcessContext::CreateWithSurface( |
| scoped_refptr<gfx::GLSurface> surface, |
| - bool share_resources, |
| + scoped_refptr<gpu::InProcessCommandBuffer::Service> service, |
| + GLInProcessContext* share_context, |
| const GLInProcessContextAttribs& attribs, |
| gfx::GpuPreference gpu_preference) { |
| scoped_ptr<GLInProcessContextImpl> context( |
| @@ -327,11 +343,13 @@ GLInProcessContext* GLInProcessContext::CreateWithSurface( |
| if (!context->Initialize( |
| surface, |
| surface->IsOffscreen(), |
| - share_resources, |
| + false, |
| + share_context, |
| gfx::kNullAcceleratedWidget, |
| surface->GetSize(), |
| attribs, |
| - gpu_preference)) |
| + gpu_preference, |
| + service)) |
| return NULL; |
| return context.release(); |