| 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)
 | 
| 
 |