| Index: gpu/command_buffer/client/share_group.cc
|
| diff --git a/gpu/command_buffer/client/share_group.cc b/gpu/command_buffer/client/share_group.cc
|
| index cb9f9bca5c6819e8769fdf11e738046eddafa364..8711ce817e64485ac76cf65115bb737be88bc8b3 100644
|
| --- a/gpu/command_buffer/client/share_group.cc
|
| +++ b/gpu/command_buffer/client/share_group.cc
|
| @@ -26,6 +26,7 @@ class IdHandler : public IdHandlerInterface {
|
| virtual void MakeIds(
|
| GLES2Implementation* /* gl_impl */,
|
| GLuint id_offset, GLsizei n, GLuint* ids) OVERRIDE {
|
| + base::AutoLock auto_lock(lock_);
|
| if (id_offset == 0) {
|
| for (GLsizei ii = 0; ii < n; ++ii) {
|
| ids[ii] = id_allocator_.AllocateID();
|
| @@ -42,6 +43,7 @@ class IdHandler : public IdHandlerInterface {
|
| virtual bool FreeIds(
|
| GLES2Implementation* gl_impl,
|
| GLsizei n, const GLuint* ids, DeleteFn delete_fn) OVERRIDE {
|
| + base::AutoLock auto_lock(lock_);
|
| for (GLsizei ii = 0; ii < n; ++ii) {
|
| id_allocator_.FreeID(ids[ii]);
|
| }
|
| @@ -54,13 +56,18 @@ class IdHandler : public IdHandlerInterface {
|
|
|
| // Overridden from IdHandlerInterface.
|
| virtual bool MarkAsUsedForBind(GLuint id) OVERRIDE {
|
| - return id == 0 ? true : id_allocator_.MarkAsUsed(id);
|
| + if (id == 0)
|
| + return true;
|
| + base::AutoLock auto_lock(lock_);
|
| + return id_allocator_.MarkAsUsed(id);
|
| }
|
| +
|
| protected:
|
| + base::Lock lock_;
|
| IdAllocator id_allocator_;
|
| };
|
|
|
| -// An id handler that require Gen before Bind.
|
| +// An id handler that requires Gen before Bind.
|
| class StrictIdHandler : public IdHandler {
|
| public:
|
| StrictIdHandler() {}
|
| @@ -68,8 +75,13 @@ class StrictIdHandler : public IdHandler {
|
|
|
| // Overridden from IdHandler.
|
| virtual bool MarkAsUsedForBind(GLuint id) OVERRIDE {
|
| - DCHECK(id == 0 || id_allocator_.InUse(id));
|
| - return IdHandler::MarkAsUsedForBind(id);
|
| +#ifndef NDEBUG
|
| + {
|
| + base::AutoLock auto_lock(lock_);
|
| + DCHECK(id == 0 || id_allocator_.InUse(id));
|
| + }
|
| +#endif
|
| + return true;
|
| }
|
| };
|
|
|
| @@ -83,6 +95,7 @@ class NonReusedIdHandler : public IdHandlerInterface {
|
| virtual void MakeIds(
|
| GLES2Implementation* /* gl_impl */,
|
| GLuint id_offset, GLsizei n, GLuint* ids) OVERRIDE {
|
| + base::AutoLock auto_lock(lock_);
|
| for (GLsizei ii = 0; ii < n; ++ii) {
|
| ids[ii] = ++last_id_ + id_offset;
|
| }
|
| @@ -104,103 +117,26 @@ class NonReusedIdHandler : public IdHandlerInterface {
|
| }
|
|
|
| private:
|
| + base::Lock lock_;
|
| GLuint last_id_;
|
| };
|
|
|
| -// An id handler for shared ids.
|
| -class SharedIdHandler : public IdHandlerInterface {
|
| - public:
|
| - SharedIdHandler(
|
| - id_namespaces::IdNamespaces id_namespace)
|
| - : id_namespace_(id_namespace) {
|
| - }
|
| -
|
| - virtual ~SharedIdHandler() {}
|
| -
|
| - virtual void MakeIds(GLES2Implementation* gl_impl,
|
| - GLuint id_offset,
|
| - GLsizei n,
|
| - GLuint* ids) OVERRIDE {
|
| - gl_impl->GenSharedIdsCHROMIUM(id_namespace_, id_offset, n, ids);
|
| - }
|
| -
|
| - virtual bool FreeIds(GLES2Implementation* gl_impl,
|
| - GLsizei n,
|
| - const GLuint* ids,
|
| - DeleteFn delete_fn) OVERRIDE {
|
| - gl_impl->DeleteSharedIdsCHROMIUM(id_namespace_, n, ids);
|
| - (gl_impl->*delete_fn)(n, ids);
|
| - // We need to ensure that the delete call is evaluated on the service side
|
| - // before any other contexts issue commands using these client ids.
|
| - gl_impl->helper()->CommandBufferHelper::Flush();
|
| - return true;
|
| - }
|
| -
|
| - virtual bool MarkAsUsedForBind(GLuint id) OVERRIDE {
|
| - // This has no meaning for shared resources.
|
| - return true;
|
| - }
|
| -
|
| - private:
|
| - id_namespaces::IdNamespaces id_namespace_;
|
| -};
|
| -
|
| -class ThreadSafeIdHandlerWrapper : public IdHandlerInterface {
|
| - public:
|
| - ThreadSafeIdHandlerWrapper(IdHandlerInterface* id_handler)
|
| - : id_handler_(id_handler) {
|
| - }
|
| - virtual ~ThreadSafeIdHandlerWrapper() { }
|
| -
|
| - // Overridden from IdHandlerInterface.
|
| - virtual void MakeIds(GLES2Implementation* gl_impl,
|
| - GLuint id_offset,
|
| - GLsizei n,
|
| - GLuint* ids) OVERRIDE {
|
| - base::AutoLock auto_lock(lock_);
|
| - id_handler_->MakeIds(gl_impl, id_offset, n, ids);
|
| - }
|
| -
|
| - // Overridden from IdHandlerInterface.
|
| - virtual bool FreeIds(GLES2Implementation* gl_impl,
|
| - GLsizei n,
|
| - const GLuint* ids,
|
| - DeleteFn delete_fn) OVERRIDE {
|
| - base::AutoLock auto_lock(lock_);
|
| - return id_handler_->FreeIds(gl_impl, n, ids, delete_fn);
|
| - }
|
| -
|
| - // Overridden from IdHandlerInterface.
|
| - virtual bool MarkAsUsedForBind(GLuint id) OVERRIDE {
|
| - base::AutoLock auto_lock(lock_);
|
| - return id_handler_->MarkAsUsedForBind(id);
|
| - }
|
| -
|
| - private:
|
| - scoped_ptr<IdHandlerInterface> id_handler_;
|
| - base::Lock lock_;
|
| -};
|
| -
|
| ShareGroup::ShareGroup(bool bind_generates_resource)
|
| : bind_generates_resource_(bind_generates_resource) {
|
| if (bind_generates_resource) {
|
| for (int i = 0; i < id_namespaces::kNumIdNamespaces; ++i) {
|
| if (i == id_namespaces::kProgramsAndShaders) {
|
| - id_handlers_[i].reset(new ThreadSafeIdHandlerWrapper(
|
| - new NonReusedIdHandler()));
|
| + id_handlers_[i].reset(new NonReusedIdHandler());
|
| } else {
|
| - id_handlers_[i].reset(new ThreadSafeIdHandlerWrapper(
|
| - new IdHandler()));
|
| + id_handlers_[i].reset(new IdHandler());
|
| }
|
| }
|
| } else {
|
| for (int i = 0; i < id_namespaces::kNumIdNamespaces; ++i) {
|
| if (i == id_namespaces::kProgramsAndShaders) {
|
| - id_handlers_[i].reset(new ThreadSafeIdHandlerWrapper(
|
| - new NonReusedIdHandler()));
|
| + id_handlers_[i].reset(new NonReusedIdHandler());
|
| } else {
|
| - id_handlers_[i].reset(new ThreadSafeIdHandlerWrapper(
|
| - new StrictIdHandler()));
|
| + id_handlers_[i].reset(new StrictIdHandler());
|
| }
|
| }
|
| }
|
|
|