From 8eb4090f60a9a26882e3b2b44c17a76a142d4149 Mon Sep 17 00:00:00 2001 From: "sievers@chromium.org" Date: Wed, 17 Jul 2013 05:46:58 +0000 Subject: [PATCH] Minor GLInProcessContext cleanups. Make GLInProcessContext implement ImageFactory. Also allow more than one sync point callback. BUG=246450 Review URL: https://chromiumcodereview.appspot.com/19288002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@211963 0039d316-1c4b-4281-b951-d872f2087c98 --- gpu/command_buffer/client/gl_in_process_context.cc | 91 +++++++--------------- gpu/command_buffer/common/gles2_cmd_format.h | 1 + gpu/command_buffer/service/context_group.cc | 1 + 3 files changed, 30 insertions(+), 63 deletions(-) diff --git a/gpu/command_buffer/client/gl_in_process_context.cc b/gpu/command_buffer/client/gl_in_process_context.cc index cab449597fd9..ef2fe81c58c5 100644 --- a/gpu/command_buffer/client/gl_in_process_context.cc +++ b/gpu/command_buffer/client/gl_in_process_context.cc @@ -28,6 +28,7 @@ #include "gpu/command_buffer/client/image_factory.h" #include "gpu/command_buffer/client/transfer_buffer.h" #include "gpu/command_buffer/common/constants.h" +#include "gpu/command_buffer/common/id_allocator.h" #include "gpu/command_buffer/service/command_buffer_service.h" #include "gpu/command_buffer/service/context_group.h" #include "gpu/command_buffer/service/gl_context_virtual.h" @@ -62,7 +63,6 @@ static base::LazyInstance g_decoder_lock = LAZY_INSTANCE_INITIALIZER; class GLInProcessContextImpl; -class ImageFactoryInProcess; static base::LazyInstance< std::set > @@ -92,6 +92,7 @@ class AutoLockAndDecoderDetachThread { class GLInProcessContextImpl : public GLInProcessContext, + public gles2::ImageFactory, public base::SupportsWeakPtr { public: explicit GLInProcessContextImpl(bool share_resources); @@ -112,6 +113,12 @@ class GLInProcessContextImpl OVERRIDE; virtual gles2::GLES2Implementation* GetImplementation() OVERRIDE; + // ImageFactory implementation: + virtual scoped_ptr CreateGpuMemoryBuffer( + int width, int height, GLenum internalformat, + unsigned* image_id) OVERRIDE; + virtual void DeleteGpuMemoryBuffer(unsigned image_id) OVERRIDE; + // Other methods: gles2::GLES2Decoder* GetDecoder(); bool GetBufferChanged(int32 transfer_buffer_id); @@ -138,14 +145,14 @@ class GLInProcessContextImpl scoped_ptr gles2_helper_; scoped_ptr transfer_buffer_; scoped_ptr gles2_implementation_; - scoped_refptr image_factory_; - base::Closure signal_sync_point_callback_; bool share_resources_; bool context_lost_; typedef std::pair QueryCallback; std::vector query_callbacks_; + std::vector signal_sync_point_callbacks_; + DISALLOW_COPY_AND_ASSIGN(GLInProcessContextImpl); }; @@ -167,41 +174,10 @@ AutoLockAndDecoderDetachThread::~AutoLockAndDecoderDetachThread() { &DetachThread); } -class ImageFactoryInProcess - : public gles2::ImageFactory, - public base::RefCountedThreadSafe { - public: - explicit ImageFactoryInProcess(ImageManager* image_manager); - - // methods from ImageFactory - virtual scoped_ptr CreateGpuMemoryBuffer( - int width, int height, GLenum internalformat, - unsigned* image_id) OVERRIDE; - virtual void DeleteGpuMemoryBuffer(unsigned image_id) OVERRIDE; - private: - friend class base::RefCountedThreadSafe; - virtual ~ImageFactoryInProcess(); - - // ImageManager is referred by the ContextGroup and the - // ContextGroup outlives the client. - ImageManager* image_manager_; - unsigned next_id_; - - DISALLOW_COPY_AND_ASSIGN(ImageFactoryInProcess); -}; - -ImageFactoryInProcess::ImageFactoryInProcess( - ImageManager* image_manager) : image_manager_(image_manager), - next_id_(0) { -} - -ImageFactoryInProcess::~ImageFactoryInProcess() { -} - -scoped_ptr ImageFactoryInProcess::CreateGpuMemoryBuffer( +scoped_ptr GLInProcessContextImpl::CreateGpuMemoryBuffer( int width, int height, GLenum internalformat, unsigned int* image_id) { // We're taking the lock here because we're accessing the ContextGroup's - // shared ImageManager and next_id_. + // shared IdManager. AutoLockAndDecoderDetachThread lock(g_decoder_lock.Get(), g_all_shared_contexts.Get()); // For Android WebView we assume the |internalformat| will always be @@ -216,17 +192,20 @@ scoped_ptr ImageFactoryInProcess::CreateGpuMemoryBuffer( scoped_refptr gl_image = gfx::GLImage::CreateGLImageForGpuMemoryBuffer(buffer->GetNativeBuffer(), gfx::Size(width, height)); - *image_id = ++next_id_; // Valid image_ids start from 1. - image_manager_->AddImage(gl_image.get(), *image_id); + *image_id = decoder_->GetContextGroup() + ->GetIdAllocator(gles2::id_namespaces::kImages)->AllocateID(); + GetImageManager()->AddImage(gl_image.get(), *image_id); return buffer.Pass(); } -void ImageFactoryInProcess::DeleteGpuMemoryBuffer(unsigned int image_id) { +void GLInProcessContextImpl::DeleteGpuMemoryBuffer(unsigned int image_id) { // We're taking the lock here because we're accessing the ContextGroup's // shared ImageManager. AutoLockAndDecoderDetachThread lock(g_decoder_lock.Get(), g_all_shared_contexts.Get()); - image_manager_->RemoveImage(image_id); + GetImageManager()->RemoveImage(image_id); + decoder_->GetContextGroup()->GetIdAllocator(gles2::id_namespaces::kImages) + ->FreeID(image_id); } GLInProcessContextImpl::GLInProcessContextImpl(bool share_resources) @@ -259,11 +238,13 @@ void GLInProcessContextImpl::PumpCommands() { (error::IsError(state.error) && context_lost_)); } - if (!context_lost_ && !signal_sync_point_callback_.is_null()) { - base::MessageLoop::current()->PostTask( - FROM_HERE, signal_sync_point_callback_); - signal_sync_point_callback_.Reset(); + if (!context_lost_ && signal_sync_point_callbacks_.size()) { + for (size_t n = 0; n < signal_sync_point_callbacks_.size(); n++) { + base::MessageLoop::current()->PostTask(FROM_HERE, + signal_sync_point_callbacks_[n]); + } } + signal_sync_point_callbacks_.clear(); } bool GLInProcessContextImpl::GetBufferChanged(int32 transfer_buffer_id) { @@ -272,7 +253,8 @@ bool GLInProcessContextImpl::GetBufferChanged(int32 transfer_buffer_id) { void GLInProcessContextImpl::SignalSyncPoint(unsigned sync_point, const base::Closure& callback) { - signal_sync_point_callback_ = callback; + DCHECK(!callback.is_null()); + signal_sync_point_callbacks_.push_back(callback); } bool GLInProcessContextImpl::IsCommandBufferContextLost() { @@ -470,23 +452,6 @@ bool GLInProcessContextImpl::Initialize( // Create a transfer buffer. transfer_buffer_.reset(new TransferBuffer(gles2_helper_.get())); - if (share_resources_) { - AutoLockAndDecoderDetachThread lock(g_decoder_lock.Get(), - g_all_shared_contexts.Get()); - if (g_all_shared_contexts.Get().empty()) { - // Create the image factory for the first context. - image_factory_ = new ImageFactoryInProcess(GetImageManager()); - } else { - // Share the image factory created by the first context. - GLInProcessContextImpl* first_context = - *g_all_shared_contexts.Get().begin(); - image_factory_ = first_context->image_factory_; - } - } else { - // Create the image factory, this object retains its ownership. - image_factory_ = new ImageFactoryInProcess(GetImageManager()); - } - // Create the object exposing the OpenGL API. gles2_implementation_.reset(new gles2::GLES2Implementation( gles2_helper_.get(), @@ -494,7 +459,7 @@ bool GLInProcessContextImpl::Initialize( transfer_buffer_.get(), true, false, - image_factory_.get())); + this)); if (!gles2_implementation_->Initialize( kStartTransferBufferSize, diff --git a/gpu/command_buffer/common/gles2_cmd_format.h b/gpu/command_buffer/common/gles2_cmd_format.h index 76bb3fe1d4d2..37c7a53d9702 100644 --- a/gpu/command_buffer/common/gles2_cmd_format.h +++ b/gpu/command_buffer/common/gles2_cmd_format.h @@ -56,6 +56,7 @@ enum IdNamespaces { kTextures, kQueries, kVertexArrays, + kImages, kNumIdNamespaces }; diff --git a/gpu/command_buffer/service/context_group.cc b/gpu/command_buffer/service/context_group.cc index 90932fbdddc4..0cf991a7f45e 100644 --- a/gpu/command_buffer/service/context_group.cc +++ b/gpu/command_buffer/service/context_group.cc @@ -67,6 +67,7 @@ ContextGroup::ContextGroup( id_namespaces_[id_namespaces::kTextures].reset(new IdAllocator); id_namespaces_[id_namespaces::kQueries].reset(new IdAllocator); id_namespaces_[id_namespaces::kVertexArrays].reset(new IdAllocator); + id_namespaces_[id_namespaces::kImages].reset(new IdAllocator); } static void GetIntegerv(GLenum pname, uint32* var) { -- 2.11.4.GIT