| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/resources/raster_worker_pool.h" | 5 #include "cc/resources/raster_worker_pool.h" |
| 6 | 6 |
| 7 #include "cc/resources/picture_pile_impl.h" | 7 #include "cc/resources/picture_pile_impl.h" |
| 8 | 8 |
| 9 namespace cc { | 9 namespace cc { |
| 10 | 10 |
| 11 namespace { | 11 namespace { |
| 12 | 12 |
| 13 class RasterWorkerPoolTaskImpl : public internal::WorkerPoolTask { | 13 class RasterWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
| 14 public: | 14 public: |
| 15 RasterWorkerPoolTaskImpl(PicturePileImpl* picture_pile, | 15 RasterWorkerPoolTaskImpl(const base::Closure& callback, |
| 16 const RasterWorkerPool::RasterCallback& task, | 16 const RasterWorkerPool::Task::Reply& reply) |
| 17 const base::Closure& reply) | 17 : callback_(callback), |
| 18 : internal::WorkerPoolTask(reply), | 18 reply_(reply) { |
| 19 picture_pile_(picture_pile), | 19 } |
| 20 task_(task) { | 20 |
| 21 // Overridden from internal::WorkerPoolTask: |
| 22 virtual void RunOnThread(unsigned thread_index) OVERRIDE { |
| 23 callback_.Run(); |
| 24 } |
| 25 virtual void DispatchCompletionCallback() OVERRIDE { |
| 26 reply_.Run(!HasFinished()); |
| 27 } |
| 28 |
| 29 private: |
| 30 virtual ~RasterWorkerPoolTaskImpl() {} |
| 31 |
| 32 const base::Closure callback_; |
| 33 const RasterWorkerPool::Task::Reply reply_; |
| 34 }; |
| 35 |
| 36 class RasterWorkerPoolPictureTaskImpl : public internal::WorkerPoolTask { |
| 37 public: |
| 38 RasterWorkerPoolPictureTaskImpl( |
| 39 PicturePileImpl* picture_pile, |
| 40 const RasterWorkerPool::PictureTask::Callback& callback, |
| 41 const RasterWorkerPool::Task::Reply& reply) |
| 42 : picture_pile_(picture_pile), |
| 43 callback_(callback), |
| 44 reply_(reply) { |
| 21 DCHECK(picture_pile_); | 45 DCHECK(picture_pile_); |
| 22 } | 46 } |
| 23 | 47 |
| 48 // Overridden from internal::WorkerPoolTask: |
| 24 virtual void RunOnThread(unsigned thread_index) OVERRIDE { | 49 virtual void RunOnThread(unsigned thread_index) OVERRIDE { |
| 25 task_.Run(picture_pile_->GetCloneForDrawingOnThread(thread_index)); | 50 callback_.Run(picture_pile_->GetCloneForDrawingOnThread(thread_index)); |
| 51 } |
| 52 virtual void DispatchCompletionCallback() OVERRIDE { |
| 53 reply_.Run(!HasFinished()); |
| 26 } | 54 } |
| 27 | 55 |
| 28 private: | 56 private: |
| 57 virtual ~RasterWorkerPoolPictureTaskImpl() {} |
| 58 |
| 29 scoped_refptr<PicturePileImpl> picture_pile_; | 59 scoped_refptr<PicturePileImpl> picture_pile_; |
| 30 RasterWorkerPool::RasterCallback task_; | 60 const RasterWorkerPool::PictureTask::Callback callback_; |
| 61 const RasterWorkerPool::Task::Reply reply_; |
| 31 }; | 62 }; |
| 32 | 63 |
| 33 const char* kWorkerThreadNamePrefix = "CompositorRaster"; | 64 const char* kWorkerThreadNamePrefix = "CompositorRaster"; |
| 34 | 65 |
| 35 const int kCheckForCompletedTasksDelayMs = 6; | 66 const int kCheckForCompletedTasksDelayMs = 6; |
| 36 | 67 |
| 37 } // namespace | 68 } // namespace |
| 38 | 69 |
| 39 RasterWorkerPool::RasterWorkerPool(size_t num_threads) | 70 RasterWorkerPool::Task::Schedule::Schedule() { |
| 40 : WorkerPool( | 71 } |
| 41 num_threads, | 72 |
| 42 base::TimeDelta::FromMilliseconds(kCheckForCompletedTasksDelayMs), | 73 RasterWorkerPool::Task::Schedule::~Schedule() { |
| 43 kWorkerThreadNamePrefix) { | 74 } |
| 75 |
| 76 void RasterWorkerPool::Task::Schedule::Append(const Task& task) { |
| 77 DCHECK(!task.is_null()); |
| 78 internal::WorkerPoolTaskDependency::Create( |
| 79 task.internal_, &task_graph_, NULL); |
| 80 } |
| 81 |
| 82 void RasterWorkerPool::Task::Schedule::AppendWithDependencies( |
| 83 const Task& task, Schedule* dependencies) { |
| 84 DCHECK(!task.is_null()); |
| 85 internal::WorkerPoolTaskDependency::Create( |
| 86 task.internal_, &task_graph_, &dependencies->task_graph_); |
| 87 } |
| 88 |
| 89 RasterWorkerPool::Task::Task() { |
| 90 } |
| 91 |
| 92 RasterWorkerPool::Task::Task(const base::Closure& callback, |
| 93 const Reply& reply) |
| 94 : internal_(new RasterWorkerPoolTaskImpl(callback, reply)) { |
| 95 } |
| 96 |
| 97 RasterWorkerPool::Task::Task(scoped_refptr<internal::WorkerPoolTask> internal) |
| 98 : internal_(internal) { |
| 99 } |
| 100 |
| 101 RasterWorkerPool::Task::~Task() { |
| 102 } |
| 103 |
| 104 void RasterWorkerPool::Task::Reset() { |
| 105 internal_ = NULL; |
| 106 } |
| 107 |
| 108 RasterWorkerPool::PictureTask::PictureTask(PicturePileImpl* picture_pile, |
| 109 const Callback& callback, |
| 110 const Reply& reply) |
| 111 : RasterWorkerPool::Task(new RasterWorkerPoolPictureTaskImpl(picture_pile, |
| 112 callback, |
| 113 reply)) { |
| 114 } |
| 115 |
| 116 RasterWorkerPool::RasterWorkerPool(size_t num_threads) : WorkerPool( |
| 117 num_threads, |
| 118 base::TimeDelta::FromMilliseconds(kCheckForCompletedTasksDelayMs), |
| 119 kWorkerThreadNamePrefix) { |
| 44 } | 120 } |
| 45 | 121 |
| 46 RasterWorkerPool::~RasterWorkerPool() { | 122 RasterWorkerPool::~RasterWorkerPool() { |
| 47 } | 123 } |
| 48 | 124 |
| 49 void RasterWorkerPool::PostRasterTaskAndReply(PicturePileImpl* picture_pile, | 125 void RasterWorkerPool::Shutdown() { |
| 50 const RasterCallback& task, | 126 // Cancel all previously scheduled tasks. |
| 51 const base::Closure& reply) { | 127 Task::Schedule empty_schedule; |
| 52 PostTask(make_scoped_ptr(new RasterWorkerPoolTaskImpl( | 128 ScheduleTasks(&empty_schedule); |
| 53 picture_pile, | 129 |
| 54 task, | 130 WorkerPool::Shutdown(); |
| 55 reply)).PassAs<internal::WorkerPoolTask>()); | 131 } |
| 132 |
| 133 void RasterWorkerPool::ScheduleTasks(Task::Schedule* schedule) { |
| 134 WorkerPool::ScheduleTasks(&schedule->task_graph_); |
| 56 } | 135 } |
| 57 | 136 |
| 58 } // namespace cc | 137 } // namespace cc |
| OLD | NEW |