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..f065b5217b288f8f31900cd1b0a62adce3fe833f 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,62 +130,14 @@ 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; |
+SyncPointManager* GetSyncPointManager() { |
+ static base::LazyInstance<scoped_refptr<SyncPointManager>> |
+ g_sync_point_manager = LAZY_INSTANCE_INITIALIZER; |
+ if (!g_sync_point_manager.Get().get()) |
no sievers
2015/01/15 20:10:47
not thread-safe. you can probably just wrap the re
|
+ g_sync_point_manager.Get() = new SyncPointManager; |
+ return g_sync_point_manager.Get().get(); |
} |
-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 = |
- LAZY_INSTANCE_INITIALIZER; |
- |
base::SharedMemoryHandle ShareToGpuThread( |
base::SharedMemoryHandle source_handle) { |
#if defined(OS_WIN) |
@@ -790,7 +743,7 @@ int32 InProcessCommandBuffer::CreateGpuMemoryBufferImage( |
} |
uint32 InProcessCommandBuffer::InsertSyncPoint() { |
- uint32 sync_point = g_sync_point_manager.Get().GenerateSyncPoint(); |
+ uint32 sync_point = GetSyncPointManager()->GenerateSyncPoint(); |
QueueTask(base::Bind(&InProcessCommandBuffer::RetireSyncPointOnGpuThread, |
base::Unretained(this), |
sync_point)); |
@@ -798,7 +751,7 @@ uint32 InProcessCommandBuffer::InsertSyncPoint() { |
} |
uint32 InProcessCommandBuffer::InsertFutureSyncPoint() { |
- return g_sync_point_manager.Get().GenerateSyncPoint(); |
+ return GetSyncPointManager()->GenerateSyncPoint(); |
} |
void InProcessCommandBuffer::RetireSyncPoint(uint32 sync_point) { |
@@ -819,7 +772,7 @@ void InProcessCommandBuffer::RetireSyncPointOnGpuThread(uint32 sync_point) { |
if (make_current_success) |
mailbox_manager->PushTextureUpdates(sync_point); |
} |
- g_sync_point_manager.Get().RetireSyncPoint(sync_point); |
+ GetSyncPointManager()->RetireSyncPoint(sync_point); |
} |
void InProcessCommandBuffer::SignalSyncPoint(unsigned sync_point, |
@@ -832,7 +785,7 @@ void InProcessCommandBuffer::SignalSyncPoint(unsigned sync_point, |
} |
bool InProcessCommandBuffer::WaitSyncPointOnGpuThread(unsigned sync_point) { |
- g_sync_point_manager.Get().WaitSyncPoint(sync_point); |
+ // GetSyncPointManager()->WaitSyncPoint(sync_point); TODO(boliu) |
gles2::MailboxManager* mailbox_manager = |
decoder_->GetContextGroup()->mailbox_manager(); |
mailbox_manager->PullTextureUpdates(sync_point); |
@@ -842,15 +795,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)); |
- } |
+ GetSyncPointManager()->AddSyncPointCallback(sync_point, callback); |
} |
void InProcessCommandBuffer::SignalQuery(unsigned query_id, |