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..8ae3591f53156d5e5aeb3a7ae3761492163208a6 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,7 @@ class ScopedEvent { |
base::WaitableEvent* event_; |
}; |
-class SyncPointManager { |
- public: |
- SyncPointManager(); |
- ~SyncPointManager(); |
- |
- uint32 GenerateSyncPoint(); |
- void RetireSyncPoint(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. |
- base::Lock lock_; |
- std::set<uint32> pending_sync_points_; |
- uint32 next_sync_point_; |
- base::ConditionVariable cond_var_; |
-}; |
- |
-SyncPointManager::SyncPointManager() : next_sync_point_(1), cond_var_(&lock_) {} |
- |
-SyncPointManager::~SyncPointManager() { |
- DCHECK_EQ(pending_sync_points_.size(), 0U); |
-} |
- |
-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); |
- 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(); |
-} |
- |
-bool SyncPointManager::IsSyncPointPassed(uint32 sync_point) { |
- base::AutoLock lock(lock_); |
- return pending_sync_points_.count(sync_point) == 0; |
-} |
- |
-void SyncPointManager::WaitSyncPoint(uint32 sync_point) { |
- base::AutoLock lock(lock_); |
- while (pending_sync_points_.count(sync_point)) { |
- cond_var_.Wait(); |
- } |
-} |
- |
-base::LazyInstance<SyncPointManager> g_sync_point_manager = |
+base::LazyInstance<ThreadedSyncPointManager> g_sync_point_manager = |
LAZY_INSTANCE_INITIALIZER; |
base::SharedMemoryHandle ShareToGpuThread( |
@@ -842,15 +790,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, |