diff options
author | apatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-09 21:12:25 +0000 |
---|---|---|
committer | apatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-09 21:12:25 +0000 |
commit | 310bed51830d9cd367597ae58be2b10c9ee3b938 (patch) | |
tree | a1230c805c4c80d923eaa8679bc3ff286f5d3c5f /gpu | |
parent | aa11e68e26aed006d1de1a9d3048c700f9eda67f (diff) | |
download | chromium_src-310bed51830d9cd367597ae58be2b10c9ee3b938.zip chromium_src-310bed51830d9cd367597ae58be2b10c9ee3b938.tar.gz chromium_src-310bed51830d9cd367597ae58be2b10c9ee3b938.tar.bz2 |
Defer IPC messages to the GpuCommandBufferStub until GpuScheduler is rescheduled.
This stops the renderer process from continusously sending synchronous flushes during the swapbuffers period on mac.
TEST=WebGL on windows and mac, trybots
BUG=none
Review URL: http://codereview.chromium.org/6929045
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@84679 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r-- | gpu/command_buffer/service/gpu_scheduler.cc | 14 | ||||
-rw-r--r-- | gpu/command_buffer/service/gpu_scheduler.h | 9 |
2 files changed, 22 insertions, 1 deletions
diff --git a/gpu/command_buffer/service/gpu_scheduler.cc b/gpu/command_buffer/service/gpu_scheduler.cc index 09a24fd..67ff504 100644 --- a/gpu/command_buffer/service/gpu_scheduler.cc +++ b/gpu/command_buffer/service/gpu_scheduler.cc @@ -196,13 +196,25 @@ void GpuScheduler::SetScheduled(bool scheduled) { --unscheduled_count_; DCHECK_GE(unscheduled_count_, 0); - if (unscheduled_count_ == 0) + if (unscheduled_count_ == 0) { + if (scheduled_callback_.get()) + scheduled_callback_->Run(); + ScheduleProcessCommands(); + } } else { ++unscheduled_count_; } } +bool GpuScheduler::IsScheduled() { + return unscheduled_count_ == 0; +} + +void GpuScheduler::SetScheduledCallback(Callback0::Type* scheduled_callback) { + scheduled_callback_.reset(scheduled_callback); +} + Buffer GpuScheduler::GetSharedMemoryBuffer(int32 shm_id) { return command_buffer_->GetTransferBuffer(shm_id); } diff --git a/gpu/command_buffer/service/gpu_scheduler.h b/gpu/command_buffer/service/gpu_scheduler.h index ebb2368..5fc1a9d 100644 --- a/gpu/command_buffer/service/gpu_scheduler.h +++ b/gpu/command_buffer/service/gpu_scheduler.h @@ -69,6 +69,13 @@ class GpuScheduler : public CommandBufferEngine { // false must eventually be paired by a call with true. void SetScheduled(bool is_scheduled); + // Returns whether the scheduler is currently scheduled to process commands. + bool IsScheduled(); + + // Sets a callback that is invoked just before scheduler is rescheduled. + // Takes ownership of callback object. + void SetScheduledCallback(Callback0::Type* scheduled_callback); + // Implementation of CommandBufferEngine. virtual Buffer GetSharedMemoryBuffer(int32 shm_id); virtual void set_token(int32 token); @@ -161,6 +168,8 @@ class GpuScheduler : public CommandBufferEngine { // Greater than zero if this is waiting to be rescheduled before continuing. int unscheduled_count_; + scoped_ptr<Callback0::Type> scheduled_callback_; + #if defined(OS_MACOSX) scoped_ptr<AcceleratedSurface> surface_; uint64 swap_buffers_count_; |