gpu: Early return GpuCommandBufferStub::OnWaitSyncPoint() if the sync point is retired.

If the sync point is retired, the scheduler already executed all gl calls before
the sync point, so OnWaitSyncPoint() does not need to do anything. Currently,
OnWaitSyncPoint() always sets the scheduler off and then on. This CL makes
OnWaitSyncPoint() be able to return early.

BUG=332401

Review URL: https://codereview.chromium.org/128123002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@243932 0039d316-1c4b-4281-b951-d872f2087c98
parent ecbf440a
...@@ -768,13 +768,16 @@ void GpuCommandBufferStub::OnRetireSyncPoint(uint32 sync_point) { ...@@ -768,13 +768,16 @@ void GpuCommandBufferStub::OnRetireSyncPoint(uint32 sync_point) {
} }
bool GpuCommandBufferStub::OnWaitSyncPoint(uint32 sync_point) { bool GpuCommandBufferStub::OnWaitSyncPoint(uint32 sync_point) {
GpuChannelManager* manager = channel_->gpu_channel_manager();
if (manager->sync_point_manager()->IsSyncPointRetired(sync_point))
return true;
if (sync_point_wait_count_ == 0) { if (sync_point_wait_count_ == 0) {
TRACE_EVENT_ASYNC_BEGIN1("gpu", "WaitSyncPoint", this, TRACE_EVENT_ASYNC_BEGIN1("gpu", "WaitSyncPoint", this,
"GpuCommandBufferStub", this); "GpuCommandBufferStub", this);
} }
scheduler_->SetScheduled(false); scheduler_->SetScheduled(false);
++sync_point_wait_count_; ++sync_point_wait_count_;
GpuChannelManager* manager = channel_->gpu_channel_manager();
manager->sync_point_manager()->AddSyncPointCallback( manager->sync_point_manager()->AddSyncPointCallback(
sync_point, sync_point,
base::Bind(&GpuCommandBufferStub::OnSyncPointRetired, base::Bind(&GpuCommandBufferStub::OnSyncPointRetired,
......
...@@ -57,4 +57,13 @@ void SyncPointManager::AddSyncPointCallback(uint32 sync_point, ...@@ -57,4 +57,13 @@ void SyncPointManager::AddSyncPointCallback(uint32 sync_point,
callback.Run(); callback.Run();
} }
bool SyncPointManager::IsSyncPointRetired(uint32 sync_point) {
DCHECK(thread_checker_.CalledOnValidThread());
{
base::AutoLock lock(lock_);
SyncPointMap::iterator it = sync_point_map_.find(sync_point);
return it == sync_point_map_.end();
}
}
} // namespace content } // namespace content
...@@ -35,6 +35,8 @@ class SyncPointManager : public base::RefCountedThreadSafe<SyncPointManager> { ...@@ -35,6 +35,8 @@ class SyncPointManager : public base::RefCountedThreadSafe<SyncPointManager> {
// called on the main thread. // called on the main thread.
void AddSyncPointCallback(uint32 sync_point, const base::Closure& callback); void AddSyncPointCallback(uint32 sync_point, const base::Closure& callback);
bool IsSyncPointRetired(uint32 sync_point);
private: private:
friend class base::RefCountedThreadSafe<SyncPointManager>; friend class base::RefCountedThreadSafe<SyncPointManager>;
typedef std::vector<base::Closure> ClosureList; typedef std::vector<base::Closure> ClosureList;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment