Chromium Code Reviews| Index: content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.cc |
| diff --git a/content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.cc b/content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.cc |
| index 01357764c75977c07d89afd429d849f3b75e0599..8b7d96c5d3d460273ffdf4f7f5290919a3e4c418 100644 |
| --- a/content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.cc |
| +++ b/content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.cc |
| @@ -39,51 +39,13 @@ |
| namespace content { |
| -namespace { |
| - |
| -static base::LazyInstance<base::Lock>::Leaky |
| - g_default_share_groups_lock = LAZY_INSTANCE_INITIALIZER; |
| - |
| -typedef std::map< |
| - gpu::GpuChannelHost*, |
| - scoped_refptr<WebGraphicsContext3DCommandBufferImpl::ShareGroup>> |
| - ShareGroupMap; |
| -static base::LazyInstance<ShareGroupMap> g_default_share_groups = |
| - LAZY_INSTANCE_INITIALIZER; |
| - |
| -scoped_refptr<WebGraphicsContext3DCommandBufferImpl::ShareGroup> |
| -GetDefaultShareGroupForHost(gpu::GpuChannelHost* host) { |
| - base::AutoLock lock(g_default_share_groups_lock.Get()); |
| - |
| - ShareGroupMap& share_groups = g_default_share_groups.Get(); |
| - ShareGroupMap::iterator it = share_groups.find(host); |
| - if (it == share_groups.end()) { |
| - scoped_refptr<WebGraphicsContext3DCommandBufferImpl::ShareGroup> group = |
| - new WebGraphicsContext3DCommandBufferImpl::ShareGroup(); |
| - share_groups[host] = group; |
| - return group; |
| - } |
| - return it->second; |
| -} |
| - |
| -} // namespace anonymous |
| - |
| -WebGraphicsContext3DCommandBufferImpl::ShareGroup::ShareGroup() { |
| -} |
| - |
| -WebGraphicsContext3DCommandBufferImpl::ShareGroup::~ShareGroup() { |
| - DCHECK(contexts_.empty()); |
| -} |
| - |
| WebGraphicsContext3DCommandBufferImpl::WebGraphicsContext3DCommandBufferImpl( |
| gpu::SurfaceHandle surface_handle, |
| const GURL& active_url, |
| gpu::GpuChannelHost* host, |
| const gpu::gles2::ContextCreationAttribHelper& attributes, |
| gfx::GpuPreference gpu_preference, |
| - bool share_resources, |
| - bool automatic_flushes, |
| - WebGraphicsContext3DCommandBufferImpl* share_context) |
| + bool automatic_flushes) |
| : automatic_flushes_(automatic_flushes), |
| attributes_(attributes), |
| host_(host), |
| @@ -100,14 +62,6 @@ WebGraphicsContext3DCommandBufferImpl::WebGraphicsContext3DCommandBufferImpl( |
| case gpu::gles2::CONTEXT_TYPE_WEBGL2: |
| context_type_ = OFFSCREEN_CONTEXT_FOR_WEBGL; |
| } |
| - if (share_context) { |
| - DCHECK(!share_resources); |
| - share_group_ = share_context->share_group_; |
| - } else if (share_resources) { |
| - share_group_ = GetDefaultShareGroupForHost(host); |
| - } else { |
| - share_group_ = make_scoped_refptr(new ShareGroup); |
| - } |
| } |
| WebGraphicsContext3DCommandBufferImpl:: |
| @@ -119,7 +73,9 @@ WebGraphicsContext3DCommandBufferImpl:: |
| } |
| bool WebGraphicsContext3DCommandBufferImpl::MaybeInitializeGL( |
| - const gpu::SharedMemoryLimits& memory_limits) { |
| + const gpu::SharedMemoryLimits& memory_limits, |
| + gpu::CommandBufferProxyImpl* shared_command_buffer, |
| + scoped_refptr<gpu::gles2::ShareGroup> share_group) { |
| if (initialized_) |
| return true; |
| @@ -133,7 +89,7 @@ bool WebGraphicsContext3DCommandBufferImpl::MaybeInitializeGL( |
| FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| "125248 WebGraphicsContext3DCommandBufferImpl::MaybeInitializeGL")); |
| - if (!CreateContext(memory_limits)) { |
| + if (!CreateContext(memory_limits, shared_command_buffer, share_group)) { |
|
piman
2016/04/27 22:09:33
nit: std::move(share_group)
danakj
2016/04/28 00:25:58
Done.
|
| Destroy(); |
| initialize_failed_ = true; |
| @@ -153,23 +109,17 @@ bool WebGraphicsContext3DCommandBufferImpl::MaybeInitializeGL( |
| } |
| bool WebGraphicsContext3DCommandBufferImpl::InitializeCommandBuffer( |
| - WebGraphicsContext3DCommandBufferImpl* share_context) { |
| + gpu::CommandBufferProxyImpl* shared_command_buffer) { |
| if (!host_.get()) |
| return false; |
| - gpu::CommandBufferProxyImpl* share_group_command_buffer = NULL; |
| - |
| - if (share_context) { |
| - share_group_command_buffer = share_context->GetCommandBufferProxy(); |
| - } |
| - |
| DCHECK(attributes_.buffer_preserved); |
| std::vector<int32_t> serialized_attributes; |
| attributes_.Serialize(&serialized_attributes); |
| // Create a proxy to a command buffer in the GPU process. |
| command_buffer_ = host_->CreateCommandBuffer( |
| - surface_handle_, gfx::Size(), share_group_command_buffer, |
| + surface_handle_, gfx::Size(), shared_command_buffer, |
| gpu::GpuChannelHost::kDefaultStreamId, |
| gpu::GpuChannelHost::kDefaultStreamPriority, serialized_attributes, |
| active_url_, gpu_preference_); |
| @@ -192,27 +142,15 @@ bool WebGraphicsContext3DCommandBufferImpl::InitializeCommandBuffer( |
| } |
| bool WebGraphicsContext3DCommandBufferImpl::CreateContext( |
| - const gpu::SharedMemoryLimits& memory_limits) { |
| + const gpu::SharedMemoryLimits& memory_limits, |
| + gpu::CommandBufferProxyImpl* shared_command_buffer, |
| + scoped_refptr<gpu::gles2::ShareGroup> share_group) { |
| TRACE_EVENT0("gpu", "WebGfxCtx3DCmdBfrImpl::CreateContext"); |
| - scoped_refptr<gpu::gles2::ShareGroup> gles2_share_group; |
| + DCHECK_EQ(!!shared_command_buffer, !!share_group); |
| - std::unique_ptr<base::AutoLock> share_group_lock; |
| - bool add_to_share_group = false; |
| - if (!command_buffer_) { |
| - WebGraphicsContext3DCommandBufferImpl* share_context = NULL; |
| - |
| - share_group_lock.reset(new base::AutoLock(share_group_->lock())); |
| - share_context = share_group_->GetAnyContextLocked(); |
| - |
| - if (!InitializeCommandBuffer(share_context)) { |
| - LOG(ERROR) << "Failed to initialize command buffer."; |
| - return false; |
| - } |
| - |
| - if (share_context) |
| - gles2_share_group = share_context->GetImplementation()->share_group(); |
| - |
| - add_to_share_group = true; |
| + if (!InitializeCommandBuffer(shared_command_buffer)) { |
| + LOG(ERROR) << "Failed to initialize command buffer."; |
| + return false; |
| } |
| // Create the GLES2 helper, which writes the command buffer protocol. |
| @@ -237,7 +175,7 @@ bool WebGraphicsContext3DCommandBufferImpl::CreateContext( |
| // Create the object exposing the OpenGL API. |
| real_gl_.reset(new gpu::gles2::GLES2Implementation( |
| - gles2_helper_.get(), gles2_share_group.get(), transfer_buffer_.get(), |
| + gles2_helper_.get(), std::move(share_group), transfer_buffer_.get(), |
| bind_generates_resource, lose_context_when_out_of_memory, |
| support_client_side_arrays, command_buffer_.get())); |
| if (!real_gl_->Initialize(memory_limits.start_transfer_buffer_size, |
| @@ -248,15 +186,14 @@ bool WebGraphicsContext3DCommandBufferImpl::CreateContext( |
| return false; |
| } |
| - if (add_to_share_group) |
| - share_group_->AddContextLocked(this); |
| - |
| return true; |
| } |
| bool WebGraphicsContext3DCommandBufferImpl::InitializeOnCurrentThread( |
| - const gpu::SharedMemoryLimits& memory_limits) { |
| - if (!MaybeInitializeGL(memory_limits)) { |
| + const gpu::SharedMemoryLimits& memory_limits, |
| + gpu::CommandBufferProxyImpl* shared_command_buffer, |
| + scoped_refptr<gpu::gles2::ShareGroup> share_group) { |
| + if (!MaybeInitializeGL(memory_limits, shared_command_buffer, share_group)) { |
|
piman
2016/04/27 22:09:33
nit: std::move(share_group)
danakj
2016/04/28 00:25:58
Done.
|
| DLOG(ERROR) << "Failed to initialize context."; |
| return false; |
| } |
| @@ -270,8 +207,6 @@ bool WebGraphicsContext3DCommandBufferImpl::InitializeOnCurrentThread( |
| } |
| void WebGraphicsContext3DCommandBufferImpl::Destroy() { |
| - share_group_->RemoveContext(this); |
| - |
| trace_gl_.reset(); |
| real_gl_.reset(); |
| transfer_buffer_.reset(); |
| @@ -291,14 +226,6 @@ void WebGraphicsContext3DCommandBufferImpl::OnContextLost() { |
| if (context_lost_callback_) |
| context_lost_callback_->onContextLost(); |
| - share_group_->RemoveAllContexts(); |
| - |
| - DCHECK(host_.get()); |
| - { |
| - base::AutoLock lock(g_default_share_groups_lock.Get()); |
| - g_default_share_groups.Get().erase(host_.get()); |
| - } |
| - |
| gpu::CommandBuffer::State state = command_buffer_->GetLastState(); |
| UmaRecordContextLost(context_type_, state.error, state.context_lost_reason); |
| } |