Index: ppapi/proxy/ppb_graphics_3d_proxy.cc |
diff --git a/ppapi/proxy/ppb_graphics_3d_proxy.cc b/ppapi/proxy/ppb_graphics_3d_proxy.cc |
index ba988fd223595abcc7732ac9bc3880a14413567e..dfd72b3c9830c91fe3f03e32888c4cf544ac95c5 100644 |
--- a/ppapi/proxy/ppb_graphics_3d_proxy.cc |
+++ b/ppapi/proxy/ppb_graphics_3d_proxy.cc |
@@ -12,7 +12,6 @@ |
#include "ppapi/proxy/ppapi_command_buffer_proxy.h" |
#include "ppapi/proxy/ppapi_messages.h" |
#include "ppapi/shared_impl/ppapi_globals.h" |
-#include "ppapi/shared_impl/proxy_lock.h" |
#include "ppapi/thunk/enter.h" |
#include "ppapi/thunk/resource_creation_api.h" |
#include "ppapi/thunk/thunk.h" |
@@ -53,132 +52,8 @@ gpu::CommandBuffer::State GetErrorState() { |
} // namespace |
-// This class just wraps a CommandBuffer and optionally locks around every |
-// method. This is used to ensure that we have the Proxy lock any time we enter |
-// PpapiCommandBufferProxy. |
-// |
-// Note, for performance reasons, most of this code is not truly thread |
-// safe in the sense of multiple threads concurrently rendering to the same |
-// Graphics3D context; this isn't allowed, and will likely either crash or |
-// result in undefined behavior. It is assumed that the thread which creates |
-// the Graphics3D context will be the thread on which subsequent gl rendering |
-// will be done. This is why it is okay to read need_to_lock_ without the lock; |
-// it should only ever be read and written on the same thread where the context |
-// was created. |
-// |
-// TODO(nfullagar): At some point, allow multiple threads to concurrently render |
-// each to its own context. First step is to allow a single thread (either main |
-// thread or background thread) to render to a single Graphics3D context. |
-class Graphics3D::LockingCommandBuffer : public gpu::CommandBuffer { |
- public: |
- explicit LockingCommandBuffer(gpu::CommandBuffer* gpu_command_buffer) |
- : gpu_command_buffer_(gpu_command_buffer), need_to_lock_(true) { |
- } |
- virtual ~LockingCommandBuffer() { |
- } |
- void set_need_to_lock(bool need_to_lock) { need_to_lock_ = need_to_lock; } |
- bool need_to_lock() const { return need_to_lock_; } |
- |
- private: |
- // MaybeLock acquires the proxy lock on construction if and only if |
- // need_to_lock is true. If it acquired the lock, it releases it on |
- // destruction. If need_to_lock is false, then the lock must already be held. |
- struct MaybeLock { |
- explicit MaybeLock(bool need_to_lock) : locked_(need_to_lock) { |
- if (need_to_lock) |
- ppapi::ProxyLock::Acquire(); |
- else |
- ppapi::ProxyLock::AssertAcquired(); |
- } |
- ~MaybeLock() { |
- if (locked_) |
- ppapi::ProxyLock::Release(); |
- } |
- private: |
- bool locked_; |
- }; |
- |
- // gpu::CommandBuffer implementation: |
- virtual bool Initialize() OVERRIDE { |
- MaybeLock lock(need_to_lock_); |
- return gpu_command_buffer_->Initialize(); |
- } |
- virtual State GetState() OVERRIDE { |
- MaybeLock lock(need_to_lock_); |
- return gpu_command_buffer_->GetState(); |
- } |
- virtual State GetLastState() OVERRIDE { |
- // During a normal scene, the vast majority of calls are to GetLastState(). |
- // We don't allow multi-threaded rendering on the same contex, so for |
- // performance reasons, avoid the global lock for this entry point. We can |
- // get away with this here because the underlying implementation of |
- // GetLastState() is trivial and does not involve global or shared state |
- // between other contexts. |
- // TODO(nfullagar): We can probably skip MaybeLock for other methods, but |
- // the performance gain may not be worth it. |
- // |
- // MaybeLock lock(need_to_lock_); |
- return gpu_command_buffer_->GetLastState(); |
- } |
- virtual int32 GetLastToken() OVERRIDE { |
- return GetLastState().token; |
- } |
- virtual void Flush(int32 put_offset) OVERRIDE { |
- MaybeLock lock(need_to_lock_); |
- gpu_command_buffer_->Flush(put_offset); |
- } |
- virtual State FlushSync(int32 put_offset, int32 last_known_get) OVERRIDE { |
- MaybeLock lock(need_to_lock_); |
- return gpu_command_buffer_->FlushSync(put_offset, last_known_get); |
- } |
- virtual void SetGetBuffer(int32 transfer_buffer_id) OVERRIDE { |
- MaybeLock lock(need_to_lock_); |
- gpu_command_buffer_->SetGetBuffer(transfer_buffer_id); |
- } |
- virtual void SetGetOffset(int32 get_offset) OVERRIDE { |
- MaybeLock lock(need_to_lock_); |
- gpu_command_buffer_->SetGetOffset(get_offset); |
- } |
- virtual gpu::Buffer CreateTransferBuffer(size_t size, |
- int32* id) OVERRIDE { |
- MaybeLock lock(need_to_lock_); |
- return gpu_command_buffer_->CreateTransferBuffer(size, id); |
- } |
- virtual void DestroyTransferBuffer(int32 id) OVERRIDE { |
- MaybeLock lock(need_to_lock_); |
- gpu_command_buffer_->DestroyTransferBuffer(id); |
- } |
- virtual gpu::Buffer GetTransferBuffer(int32 id) OVERRIDE { |
- MaybeLock lock(need_to_lock_); |
- return gpu_command_buffer_->GetTransferBuffer(id); |
- } |
- virtual void SetToken(int32 token) OVERRIDE { |
- MaybeLock lock(need_to_lock_); |
- gpu_command_buffer_->SetToken(token); |
- } |
- virtual void SetParseError(gpu::error::Error error) OVERRIDE { |
- MaybeLock lock(need_to_lock_); |
- gpu_command_buffer_->SetParseError(error); |
- } |
- virtual void SetContextLostReason( |
- gpu::error::ContextLostReason reason) OVERRIDE { |
- MaybeLock lock(need_to_lock_); |
- gpu_command_buffer_->SetContextLostReason(reason); |
- } |
- virtual uint32 InsertSyncPoint() OVERRIDE { |
- MaybeLock lock(need_to_lock_); |
- return gpu_command_buffer_->InsertSyncPoint(); |
- } |
- |
- // Weak pointer - see class Graphics3D for the scopted_ptr. |
- gpu::CommandBuffer* gpu_command_buffer_; |
- |
- bool need_to_lock_; |
-}; |
- |
Graphics3D::Graphics3D(const HostResource& resource) |
- : PPB_Graphics3D_Shared(resource), |
- num_already_locked_calls_(0) { |
+ : PPB_Graphics3D_Shared(resource) { |
} |
Graphics3D::~Graphics3D() { |
@@ -193,10 +68,7 @@ bool Graphics3D::Init(gpu::gles2::GLES2Implementation* share_gles2) { |
command_buffer_.reset( |
new PpapiCommandBufferProxy(host_resource(), dispatcher)); |
- locking_command_buffer_.reset( |
- new LockingCommandBuffer(command_buffer_.get())); |
- ScopedNoLocking already_locked(this); |
return CreateGLES2Impl(kCommandBufferSize, kTransferBufferSize, |
share_gles2); |
} |
@@ -242,7 +114,7 @@ uint32_t Graphics3D::InsertSyncPoint() { |
} |
gpu::CommandBuffer* Graphics3D::GetCommandBuffer() { |
- return locking_command_buffer_.get(); |
+ return command_buffer_.get(); |
} |
gpu::GpuControl* Graphics3D::GetGpuControl() { |
@@ -250,10 +122,6 @@ gpu::GpuControl* Graphics3D::GetGpuControl() { |
} |
int32 Graphics3D::DoSwapBuffers() { |
- // gles2_impl()->SwapBuffers() results in CommandBuffer calls, and we already |
- // have the proxy lock. |
- ScopedNoLocking already_locked(this); |
- |
gles2_impl()->SwapBuffers(); |
IPC::Message* msg = new PpapiHostMsg_PPBGraphics3D_SwapBuffers( |
API_ID_PPB_GRAPHICS_3D, host_resource()); |
@@ -263,31 +131,6 @@ int32 Graphics3D::DoSwapBuffers() { |
return PP_OK_COMPLETIONPENDING; |
} |
-void Graphics3D::PushAlreadyLocked() { |
- ppapi::ProxyLock::AssertAcquired(); |
- if (!locking_command_buffer_) { |
- NOTREACHED(); |
- return; |
- } |
- if (num_already_locked_calls_ == 0) |
- locking_command_buffer_->set_need_to_lock(false); |
- ++num_already_locked_calls_; |
-} |
- |
-void Graphics3D::PopAlreadyLocked() { |
- // We must have Pushed before we can Pop. |
- DCHECK(!locking_command_buffer_->need_to_lock()); |
- DCHECK_GT(num_already_locked_calls_, 0); |
- ppapi::ProxyLock::AssertAcquired(); |
- if (!locking_command_buffer_) { |
- NOTREACHED(); |
- return; |
- } |
- --num_already_locked_calls_; |
- if (num_already_locked_calls_ == 0) |
- locking_command_buffer_->set_need_to_lock(true); |
-} |
- |
PPB_Graphics3D_Proxy::PPB_Graphics3D_Proxy(Dispatcher* dispatcher) |
: InterfaceProxy(dispatcher), |
callback_factory_(this) { |