Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(177)

Unified Diff: gpu/command_buffer/service/in_process_command_buffer.cc

Issue 849103002: Share SyncPointManager implementation in in-process cmd buffer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: blank lines Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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,
« no previous file with comments | « no previous file | gpu/command_buffer/service/sync_point_manager.h » ('j') | gpu/command_buffer/service/sync_point_manager.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698