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 c3123457f64ff1c42bbffcef368c49d86ba3f149..68224839def174dcfcc0595e59611a690a9c2d35 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" |
| @@ -129,60 +130,63 @@ class ScopedEvent { |
| base::WaitableEvent* event_; |
| }; |
| -class SyncPointManager { |
| +class ThreadedSyncPointManager { |
|
no sievers
2015/01/16 20:03:37
nit: put a class comment that explains that 'threa
|
| public: |
| - SyncPointManager(); |
| - ~SyncPointManager(); |
| + ThreadedSyncPointManager(); |
| + ~ThreadedSyncPointManager(); |
| + // SyncPointManager methods. |
|
no sievers
2015/01/16 20:03:37
nit: you are not subclassing SyncPointManager
|
| uint32 GenerateSyncPoint(); |
| void RetireSyncPoint(uint32 sync_point); |
| + void AddSyncPointCallback(uint32 sync_point, const base::Closure& callback); |
| + bool IsSyncPointRetired(uint32 sync_point); |
| - 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. |
| + private: |
| base::Lock lock_; |
| - std::set<uint32> pending_sync_points_; |
| - uint32 next_sync_point_; |
| base::ConditionVariable cond_var_; |
| + scoped_refptr<SyncPointManager> sync_point_manager_; |
| }; |
| -SyncPointManager::SyncPointManager() : next_sync_point_(1), cond_var_(&lock_) {} |
| +ThreadedSyncPointManager::ThreadedSyncPointManager() |
| + : cond_var_(&lock_), sync_point_manager_(new SyncPointManager) { |
| +} |
| -SyncPointManager::~SyncPointManager() { |
| - DCHECK_EQ(pending_sync_points_.size(), 0U); |
| +ThreadedSyncPointManager::~ThreadedSyncPointManager() { |
| } |
| -uint32 SyncPointManager::GenerateSyncPoint() { |
| +uint32 ThreadedSyncPointManager::GenerateSyncPoint() { |
| base::AutoLock lock(lock_); |
|
no sievers
2015/01/16 20:03:37
This doesn't need the lock since SyncPointManager:
|
| - uint32 sync_point = next_sync_point_++; |
| - DCHECK_EQ(pending_sync_points_.count(sync_point), 0U); |
| - pending_sync_points_.insert(sync_point); |
| - return sync_point; |
| + return sync_point_manager_->GenerateSyncPoint(); |
| } |
| -void SyncPointManager::RetireSyncPoint(uint32 sync_point) { |
| +void ThreadedSyncPointManager::RetireSyncPoint(uint32 sync_point) { |
| base::AutoLock lock(lock_); |
| - DCHECK(pending_sync_points_.count(sync_point)); |
| - pending_sync_points_.erase(sync_point); |
| + sync_point_manager_->RetireSyncPoint(sync_point); |
|
no sievers
2015/01/16 20:03:37
However the other three calls will trigger the Cal
|
| cond_var_.Broadcast(); |
| } |
| -bool SyncPointManager::IsSyncPointPassed(uint32 sync_point) { |
| +void ThreadedSyncPointManager::AddSyncPointCallback( |
| + uint32 sync_point, |
| + const base::Closure& callback) { |
| + base::AutoLock lock(lock_); |
| + sync_point_manager_->AddSyncPointCallback(sync_point, callback); |
| +} |
| + |
| +bool ThreadedSyncPointManager::IsSyncPointRetired(uint32 sync_point) { |
| base::AutoLock lock(lock_); |
| - return pending_sync_points_.count(sync_point) == 0; |
| + return sync_point_manager_->IsSyncPointRetired(sync_point); |
| } |
| -void SyncPointManager::WaitSyncPoint(uint32 sync_point) { |
| +void ThreadedSyncPointManager::WaitSyncPoint(uint32 sync_point) { |
| base::AutoLock lock(lock_); |
| - while (pending_sync_points_.count(sync_point)) { |
| + while (!sync_point_manager_->IsSyncPointRetired(sync_point)) { |
| cond_var_.Wait(); |
|
no sievers
2015/01/16 20:18:25
We also have to think about the case where we mix
boliu
2015/01/16 20:33:30
Broadcast already cover all the waiting threads. I
|
| } |
| } |
| -base::LazyInstance<SyncPointManager> g_sync_point_manager = |
| +base::LazyInstance<ThreadedSyncPointManager> g_sync_point_manager = |
| LAZY_INSTANCE_INITIALIZER; |
| base::SharedMemoryHandle ShareToGpuThread( |
| @@ -842,15 +846,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, |