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 |