Chromium Code Reviews| Index: gpu/command_buffer/service/in_process_command_buffer.cc |
| diff --git a/gpu/command_buffer/service/in_process_command_buffer.cc b/gpu/command_buffer/service/in_process_command_buffer.cc |
| index 7a6556b8e617b59e432e383b9f3d52f041ddc933..26568b8cb48882531808bf745a0c797bc9fa48e9 100644 |
| --- a/gpu/command_buffer/service/in_process_command_buffer.cc |
| +++ b/gpu/command_buffer/service/in_process_command_buffer.cc |
| @@ -31,6 +31,7 @@ |
| #include "gpu/command_buffer/service/mailbox_manager_sync.h" |
| #include "gpu/command_buffer/service/memory_tracking.h" |
| #include "gpu/command_buffer/service/query_manager.h" |
| +#include "gpu/command_buffer/service/sync_point_manager.h" |
| #include "gpu/command_buffer/service/transfer_buffer_manager.h" |
| #include "gpu/command_buffer/service/valuebuffer_manager.h" |
| #include "ui/gfx/geometry/size.h" |
| @@ -130,60 +131,61 @@ class ScopedEvent { |
| base::WaitableEvent* event_; |
| }; |
| -class SyncPointManager { |
| +class SyncPointManagerWrapper { |
|
no sievers
2015/02/05 21:55:04
nit: put a comment that this class allows for a se
boliu
2015/02/05 23:50:44
Done.
|
| public: |
| - SyncPointManager(); |
| - ~SyncPointManager(); |
| + SyncPointManagerWrapper(); |
| uint32 GenerateSyncPoint(); |
| void RetireSyncPoint(uint32 sync_point); |
| + void AddSyncPointCallback(uint32 sync_point, const base::Closure& callback); |
| - bool IsSyncPointPassed(uint32 sync_point); |
| void WaitSyncPoint(uint32 sync_point); |
| -private: |
| - // This lock protects access to pending_sync_points_ and next_sync_point_ and |
| - // is used with the ConditionVariable to signal when a sync point is retired. |
| - base::Lock lock_; |
| - std::set<uint32> pending_sync_points_; |
| - uint32 next_sync_point_; |
| - base::ConditionVariable cond_var_; |
| -}; |
| + private: |
| + void SyncPointRetired(); |
| -SyncPointManager::SyncPointManager() : next_sync_point_(1), cond_var_(&lock_) {} |
| + const scoped_refptr<SyncPointManager> manager_; |
| + base::Lock retire_lock_; |
| + base::ConditionVariable retire_cond_var_; |
| -SyncPointManager::~SyncPointManager() { |
| - DCHECK_EQ(pending_sync_points_.size(), 0U); |
| + DISALLOW_COPY_AND_ASSIGN(SyncPointManagerWrapper); |
| +}; |
| + |
| +SyncPointManagerWrapper::SyncPointManagerWrapper() |
| + : manager_(new SyncPointManager), retire_cond_var_(&retire_lock_) { |
| } |
| -uint32 SyncPointManager::GenerateSyncPoint() { |
| - base::AutoLock lock(lock_); |
| - uint32 sync_point = next_sync_point_++; |
| - DCHECK_EQ(pending_sync_points_.count(sync_point), 0U); |
| - pending_sync_points_.insert(sync_point); |
| +uint32 SyncPointManagerWrapper::GenerateSyncPoint() { |
| + uint32 sync_point = manager_->GenerateSyncPoint(); |
| + manager_->AddSyncPointCallback( |
| + sync_point, base::Bind(&SyncPointManagerWrapper::SyncPointRetired, |
| + base::Unretained(this))); |
| return sync_point; |
| } |
| -void SyncPointManager::RetireSyncPoint(uint32 sync_point) { |
| - base::AutoLock lock(lock_); |
| - DCHECK(pending_sync_points_.count(sync_point)); |
| - pending_sync_points_.erase(sync_point); |
| - cond_var_.Broadcast(); |
| +void SyncPointManagerWrapper::RetireSyncPoint(uint32 sync_point) { |
| + manager_->RetireSyncPoint(sync_point); |
| } |
| -bool SyncPointManager::IsSyncPointPassed(uint32 sync_point) { |
| - base::AutoLock lock(lock_); |
| - return pending_sync_points_.count(sync_point) == 0; |
| +void SyncPointManagerWrapper::AddSyncPointCallback( |
| + uint32 sync_point, |
| + const base::Closure& callback) { |
| + manager_->AddSyncPointCallback(sync_point, callback); |
| } |
| -void SyncPointManager::WaitSyncPoint(uint32 sync_point) { |
| - base::AutoLock lock(lock_); |
| - while (pending_sync_points_.count(sync_point)) { |
| - cond_var_.Wait(); |
| +void SyncPointManagerWrapper::WaitSyncPoint(uint32 sync_point) { |
| + base::AutoLock lock(retire_lock_); |
| + while (!manager_->IsSyncPointRetired(sync_point)) { |
| + retire_cond_var_.Wait(); |
| } |
| } |
| -base::LazyInstance<SyncPointManager> g_sync_point_manager = |
| +void SyncPointManagerWrapper::SyncPointRetired() { |
|
no sievers
2015/02/05 21:55:04
nit: maybe OnSyncPointRetired()?
boliu
2015/02/05 23:50:44
Done.
|
| + base::AutoLock lock(retire_lock_); |
| + retire_cond_var_.Broadcast(); |
| +} |
| + |
| +base::LazyInstance<SyncPointManagerWrapper> g_sync_point_manager = |
| LAZY_INSTANCE_INITIALIZER; |
| base::SharedMemoryHandle ShareToGpuThread( |
| @@ -854,15 +856,7 @@ bool InProcessCommandBuffer::WaitSyncPointOnGpuThread(unsigned sync_point) { |
| void InProcessCommandBuffer::SignalSyncPointOnGpuThread( |
| unsigned sync_point, |
| const base::Closure& callback) { |
| - if (g_sync_point_manager.Get().IsSyncPointPassed(sync_point)) { |
| - callback.Run(); |
| - } else { |
| - service_->ScheduleIdleWork( |
| - base::Bind(&InProcessCommandBuffer::SignalSyncPointOnGpuThread, |
| - gpu_thread_weak_ptr_, |
| - sync_point, |
| - callback)); |
| - } |
| + g_sync_point_manager.Get().AddSyncPointCallback(sync_point, callback); |
| } |
| void InProcessCommandBuffer::SignalQuery(unsigned query_id, |