summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorbacker@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-01 03:42:10 +0000
committerbacker@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-01 03:42:10 +0000
commit2221818610bf5b21f97132718aeb631f92130111 (patch)
tree94af4fdfa98584b5a28a49204de896fbaece6bcd /gpu
parentc13728fe9894143431aa26d2338aee113b6026ac (diff)
downloadchromium_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.cc17
-rw-r--r--gpu/command_buffer/service/gpu_scheduler.h11
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.