| 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>
|
|
|