diff options
author | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-01 03:42:10 +0000 |
---|---|---|
committer | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-01 03:42:10 +0000 |
commit | 2221818610bf5b21f97132718aeb631f92130111 (patch) | |
tree | 94af4fdfa98584b5a28a49204de896fbaece6bcd /gpu | |
parent | c13728fe9894143431aa26d2338aee113b6026ac (diff) | |
download | chromium_src-2221818610bf5b21f97132718aeb631f92130111.zip chromium_src-2221818610bf5b21f97132718aeb631f92130111.tar.gz chromium_src-2221818610bf5b21f97132718aeb631f92130111.tar.bz2 |
GPU: Only allow the UI channel to preempt if all stubs are scheduled.
Necessary for uber-comp with --ui-prioritize-in-gpu-process. Currently will not affect preemption.
BUG=173650
Review URL: https://chromiumcodereview.appspot.com/12340118
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@185445 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r-- | gpu/command_buffer/service/gpu_scheduler.cc | 17 | ||||
-rw-r--r-- | gpu/command_buffer/service/gpu_scheduler.h | 11 |
2 files changed, 16 insertions, 12 deletions
diff --git a/gpu/command_buffer/service/gpu_scheduler.cc b/gpu/command_buffer/service/gpu_scheduler.cc index 78739dc..61bdcf8 100644 --- a/gpu/command_buffer/service/gpu_scheduler.cc +++ b/gpu/command_buffer/service/gpu_scheduler.cc @@ -136,11 +136,12 @@ void GpuScheduler::SetScheduled(bool scheduled) { // state, cancel the task that would reschedule it after a timeout. reschedule_task_factory_.InvalidateWeakPtrs(); - if (!scheduled_callback_.is_null()) - scheduled_callback_.Run(); + if (!scheduling_changed_callback_.is_null()) + scheduling_changed_callback_.Run(true); } } else { - if (unscheduled_count_ == 0) { + ++unscheduled_count_; + if (unscheduled_count_ == 1) { TRACE_EVENT_ASYNC_BEGIN1("gpu", "ProcessingSwap", this, "GpuScheduler", this); #if defined(OS_WIN) @@ -155,9 +156,9 @@ void GpuScheduler::SetScheduled(bool scheduled) { base::TimeDelta::FromMilliseconds(kRescheduleTimeOutDelay)); } #endif + if (!scheduling_changed_callback_.is_null()) + scheduling_changed_callback_.Run(false); } - - ++unscheduled_count_; } } @@ -170,9 +171,9 @@ bool GpuScheduler::HasMoreWork() { (decoder_ && decoder_->ProcessPendingQueries()); } -void GpuScheduler::SetScheduledCallback( - const base::Closure& scheduled_callback) { - scheduled_callback_ = scheduled_callback; +void GpuScheduler::SetSchedulingChangedCallback( + const SchedulingChangedCallback& callback) { + scheduling_changed_callback_ = callback; } Buffer GpuScheduler::GetSharedMemoryBuffer(int32 shm_id) { diff --git a/gpu/command_buffer/service/gpu_scheduler.h b/gpu/command_buffer/service/gpu_scheduler.h index 32a38b9..0e58d8c 100644 --- a/gpu/command_buffer/service/gpu_scheduler.h +++ b/gpu/command_buffer/service/gpu_scheduler.h @@ -76,9 +76,11 @@ class GPU_EXPORT GpuScheduler // Returns whether the scheduler needs to be polled again in the future. bool HasMoreWork(); - // Sets a callback that is invoked just before scheduler is rescheduled. - // Takes ownership of callback object. - void SetScheduledCallback(const base::Closure& scheduled_callback); + typedef base::Callback<void(bool /* scheduled */)> SchedulingChangedCallback; + + // Sets a callback that is invoked just before scheduler is rescheduled + // or descheduled. Takes ownership of callback object. + void SetSchedulingChangedCallback(const SchedulingChangedCallback& callback); // Implementation of CommandBufferEngine. virtual Buffer GetSharedMemoryBuffer(int32 shm_id) OVERRIDE; @@ -146,7 +148,8 @@ class GPU_EXPORT GpuScheduler }; std::queue<linked_ptr<UnscheduleFence> > unschedule_fences_; - base::Closure scheduled_callback_; + SchedulingChangedCallback scheduling_changed_callback_; + base::Closure descheduled_callback_; base::Closure command_processed_callback_; // If non-NULL and |preemption_flag_->IsSet()|, exit PutChanged early. |