Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(249)

Unified Diff: gpu/command_buffer/service/in_process_command_buffer.cc

Issue 851473003: gpu: Optimize in-process idle task scheduling (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 c3123457f64ff1c42bbffcef368c49d86ba3f149..7f4276f027731a259b2cf7b8e2f7e09b76475297 100644
--- a/gpu/command_buffer/service/in_process_command_buffer.cc
+++ b/gpu/command_buffer/service/in_process_command_buffer.cc
@@ -82,13 +82,22 @@ class GpuInProcessThread
private:
~GpuInProcessThread() override;
+
+ void CheckIdleTasksLocked();
+ void RunIdleTask();
+
friend class base::RefCountedThreadSafe<GpuInProcessThread>;
scoped_refptr<gpu::gles2::ShaderTranslatorCache> shader_translator_cache_;
+
+ base::Lock lock_;
+ bool idle_post_pending_;
+ std::queue<base::Closure> pending_idle_tasks_;
DISALLOW_COPY_AND_ASSIGN(GpuInProcessThread);
};
-GpuInProcessThread::GpuInProcessThread() : base::Thread("GpuThread") {
+GpuInProcessThread::GpuInProcessThread()
+ : base::Thread("GpuThread"), idle_post_pending_(false) {
Start();
}
@@ -101,8 +110,34 @@ void GpuInProcessThread::ScheduleTask(const base::Closure& task) {
}
void GpuInProcessThread::ScheduleIdleWork(const base::Closure& callback) {
- message_loop()->PostDelayedTask(
- FROM_HERE, callback, base::TimeDelta::FromMilliseconds(5));
+ base::AutoLock lock(lock_);
+ pending_idle_tasks_.push(callback);
+ CheckIdleTasksLocked();
+}
+
+void GpuInProcessThread::CheckIdleTasksLocked() {
+ lock_.AssertAcquired();
+ if (pending_idle_tasks_.size() && !idle_post_pending_) {
+ idle_post_pending_ = true;
+ message_loop()->PostTask(
+ FROM_HERE, base::Bind(&GpuInProcessThread::RunIdleTask, this));
+ }
+}
+
+void GpuInProcessThread::RunIdleTask() {
+ base::Closure idle_task;
+ base::AutoLock lock(lock_);
+ idle_post_pending_ = false;
+ DCHECK(pending_idle_tasks_.size());
+ idle_task = pending_idle_tasks_.front();
+ pending_idle_tasks_.pop();
+
+ {
+ base::AutoUnlock unlock(lock_);
+ idle_task.Run();
+ }
+
+ CheckIdleTasksLocked();
}
scoped_refptr<gles2::ShaderTranslatorCache>
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698