| 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 5db80b0410038f9876cd64d60dc22411d46f73a0..c4fa167800478e1887431a4b14524413271e8053 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,64 @@ class ScopedEvent {
|
| base::WaitableEvent* event_;
|
| };
|
|
|
| -class SyncPointManager {
|
| +// This wrapper adds the WaitSyncPoint which allows waiting on a sync point
|
| +// on the service thread, implemented using a condition variable.
|
| +class SyncPointManagerWrapper {
|
| 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 OnSyncPointRetired();
|
| +
|
| + const scoped_refptr<SyncPointManager> manager_;
|
| + base::Lock retire_lock_;
|
| + base::ConditionVariable retire_cond_var_;
|
|
|
| -SyncPointManager::SyncPointManager() : next_sync_point_(1), cond_var_(&lock_) {}
|
| + DISALLOW_COPY_AND_ASSIGN(SyncPointManagerWrapper);
|
| +};
|
|
|
| -SyncPointManager::~SyncPointManager() {
|
| - DCHECK_EQ(pending_sync_points_.size(), 0U);
|
| +SyncPointManagerWrapper::SyncPointManagerWrapper()
|
| + : manager_(SyncPointManager::Create(true)),
|
| + 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::OnSyncPointRetired,
|
| + 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::OnSyncPointRetired() {
|
| + base::AutoLock lock(retire_lock_);
|
| + retire_cond_var_.Broadcast();
|
| +}
|
| +
|
| +base::LazyInstance<SyncPointManagerWrapper> g_sync_point_manager =
|
| LAZY_INSTANCE_INITIALIZER;
|
|
|
| base::SharedMemoryHandle ShareToGpuThread(
|
| @@ -858,15 +863,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,
|
| @@ -906,6 +903,9 @@ uint32 InProcessCommandBuffer::CreateStreamTexture(uint32 texture_id) {
|
| return stream_id;
|
| }
|
|
|
| +void InProcessCommandBuffer::SetLock(base::Lock*) {
|
| +}
|
| +
|
| uint32 InProcessCommandBuffer::CreateStreamTextureOnGpuThread(
|
| uint32 client_texture_id) {
|
| #if defined(OS_ANDROID)
|
|
|