OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/atomic_sequence_num.h" | 9 #include "base/atomic_sequence_num.h" |
10 #include "base/debug/trace_event_synthetic_delay.h" | 10 #include "base/debug/trace_event_synthetic_delay.h" |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 base::ThreadLocalPointer<ThreadLocalState> current_tls_; | 78 base::ThreadLocalPointer<ThreadLocalState> current_tls_; |
79 }; | 79 }; |
80 | 80 |
81 base::LazyInstance<RasterTaskGraphRunner>::Leaky g_task_graph_runner = | 81 base::LazyInstance<RasterTaskGraphRunner>::Leaky g_task_graph_runner = |
82 LAZY_INSTANCE_INITIALIZER; | 82 LAZY_INSTANCE_INITIALIZER; |
83 | 83 |
84 const int kDefaultNumRasterThreads = 1; | 84 const int kDefaultNumRasterThreads = 1; |
85 | 85 |
86 int g_num_raster_threads = 0; | 86 int g_num_raster_threads = 0; |
87 | 87 |
88 class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask { | 88 class RasterFinishedTaskImpl : public internal::RasterizerTask { |
89 public: | 89 public: |
90 explicit RasterFinishedWorkerPoolTaskImpl( | 90 explicit RasterFinishedTaskImpl( |
91 base::SequencedTaskRunner* task_runner, | 91 base::SequencedTaskRunner* task_runner, |
92 const base::Closure& on_raster_finished_callback) | 92 const base::Closure& on_raster_finished_callback) |
93 : task_runner_(task_runner), | 93 : task_runner_(task_runner), |
94 on_raster_finished_callback_(on_raster_finished_callback) {} | 94 on_raster_finished_callback_(on_raster_finished_callback) {} |
95 | 95 |
96 // Overridden from internal::Task: | 96 // Overridden from internal::Task: |
97 virtual void RunOnWorkerThread() OVERRIDE { | 97 virtual void RunOnWorkerThread() OVERRIDE { |
98 TRACE_EVENT0("cc", "RasterFinishedWorkerPoolTaskImpl::RunOnWorkerThread"); | 98 TRACE_EVENT0("cc", "RasterFinishedTaskImpl::RunOnWorkerThread"); |
99 RasterFinished(); | 99 RasterFinished(); |
100 } | 100 } |
101 | 101 |
102 // Overridden from internal::WorkerPoolTask: | 102 // Overridden from internal::RasterizerTask: |
103 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client) | 103 virtual void ScheduleOnOriginThread(internal::RasterizerTaskClient* client) |
104 OVERRIDE {} | 104 OVERRIDE {} |
105 virtual void RunOnOriginThread() OVERRIDE { | 105 virtual void RunOnOriginThread() OVERRIDE { |
106 TRACE_EVENT0("cc", "RasterFinishedWorkerPoolTaskImpl::RunOnOriginThread"); | 106 TRACE_EVENT0("cc", "RasterFinishedTaskImpl::RunOnOriginThread"); |
107 RasterFinished(); | 107 RasterFinished(); |
108 } | 108 } |
109 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) | 109 virtual void CompleteOnOriginThread(internal::RasterizerTaskClient* client) |
110 OVERRIDE {} | 110 OVERRIDE {} |
111 virtual void RunReplyOnOriginThread() OVERRIDE {} | 111 virtual void RunReplyOnOriginThread() OVERRIDE {} |
112 | 112 |
113 protected: | 113 protected: |
114 virtual ~RasterFinishedWorkerPoolTaskImpl() {} | 114 virtual ~RasterFinishedTaskImpl() {} |
115 | 115 |
116 void RasterFinished() { | 116 void RasterFinished() { |
117 task_runner_->PostTask(FROM_HERE, on_raster_finished_callback_); | 117 task_runner_->PostTask(FROM_HERE, on_raster_finished_callback_); |
118 } | 118 } |
119 | 119 |
120 private: | 120 private: |
121 scoped_refptr<base::SequencedTaskRunner> task_runner_; | 121 scoped_refptr<base::SequencedTaskRunner> task_runner_; |
122 const base::Closure on_raster_finished_callback_; | 122 const base::Closure on_raster_finished_callback_; |
123 | 123 |
124 DISALLOW_COPY_AND_ASSIGN(RasterFinishedWorkerPoolTaskImpl); | 124 DISALLOW_COPY_AND_ASSIGN(RasterFinishedTaskImpl); |
125 }; | 125 }; |
126 | 126 |
127 class RasterRequiredForActivationFinishedWorkerPoolTaskImpl | 127 class RasterRequiredForActivationFinishedTaskImpl |
128 : public RasterFinishedWorkerPoolTaskImpl { | 128 : public RasterFinishedTaskImpl { |
129 public: | 129 public: |
130 RasterRequiredForActivationFinishedWorkerPoolTaskImpl( | 130 RasterRequiredForActivationFinishedTaskImpl( |
131 base::SequencedTaskRunner* task_runner, | 131 base::SequencedTaskRunner* task_runner, |
132 const base::Closure& on_raster_finished_callback, | 132 const base::Closure& on_raster_finished_callback, |
133 size_t tasks_required_for_activation_count) | 133 size_t tasks_required_for_activation_count) |
134 : RasterFinishedWorkerPoolTaskImpl(task_runner, | 134 : RasterFinishedTaskImpl(task_runner, on_raster_finished_callback), |
135 on_raster_finished_callback), | |
136 tasks_required_for_activation_count_( | 135 tasks_required_for_activation_count_( |
137 tasks_required_for_activation_count) { | 136 tasks_required_for_activation_count) { |
138 if (tasks_required_for_activation_count_) { | 137 if (tasks_required_for_activation_count_) { |
139 g_raster_required_for_activation_delay.Get().delay->BeginParallel( | 138 g_raster_required_for_activation_delay.Get().delay->BeginParallel( |
140 &activation_delay_end_time_); | 139 &activation_delay_end_time_); |
141 } | 140 } |
142 } | 141 } |
143 | 142 |
144 // Overridden from internal::Task: | 143 // Overridden from internal::Task: |
145 virtual void RunOnWorkerThread() OVERRIDE { | 144 virtual void RunOnWorkerThread() OVERRIDE { |
146 TRACE_EVENT0("cc", | 145 TRACE_EVENT0( |
147 "RasterRequiredForActivationFinishedWorkerPoolTaskImpl::" | 146 "cc", "RasterRequiredForActivationFinishedTaskImpl::RunOnWorkerThread"); |
148 "RunOnWorkerThread"); | |
149 RunRasterFinished(); | 147 RunRasterFinished(); |
150 } | 148 } |
151 | 149 |
152 // Overridden from internal::WorkerPoolTask: | 150 // Overridden from internal::RasterizerTask: |
153 virtual void RunOnOriginThread() OVERRIDE { | 151 virtual void RunOnOriginThread() OVERRIDE { |
154 TRACE_EVENT0("cc", | 152 TRACE_EVENT0( |
155 "RasterRequiredForActivationFinishedWorkerPoolTaskImpl::" | 153 "cc", "RasterRequiredForActivationFinishedTaskImpl::RunOnOriginThread"); |
156 "RunOnOriginThread"); | |
157 RunRasterFinished(); | 154 RunRasterFinished(); |
158 } | 155 } |
159 | 156 |
160 private: | 157 private: |
161 virtual ~RasterRequiredForActivationFinishedWorkerPoolTaskImpl() {} | 158 virtual ~RasterRequiredForActivationFinishedTaskImpl() {} |
162 | 159 |
163 void RunRasterFinished() { | 160 void RunRasterFinished() { |
164 if (tasks_required_for_activation_count_) { | 161 if (tasks_required_for_activation_count_) { |
165 g_raster_required_for_activation_delay.Get().delay->EndParallel( | 162 g_raster_required_for_activation_delay.Get().delay->EndParallel( |
166 activation_delay_end_time_); | 163 activation_delay_end_time_); |
167 } | 164 } |
168 RasterFinished(); | 165 RasterFinished(); |
169 } | 166 } |
170 | 167 |
171 base::TimeTicks activation_delay_end_time_; | 168 base::TimeTicks activation_delay_end_time_; |
172 const size_t tasks_required_for_activation_count_; | 169 const size_t tasks_required_for_activation_count_; |
173 | 170 |
174 DISALLOW_COPY_AND_ASSIGN( | 171 DISALLOW_COPY_AND_ASSIGN(RasterRequiredForActivationFinishedTaskImpl); |
175 RasterRequiredForActivationFinishedWorkerPoolTaskImpl); | |
176 }; | 172 }; |
177 | 173 |
178 } // namespace | 174 } // namespace |
179 | 175 |
180 namespace internal { | |
181 | |
182 WorkerPoolTask::WorkerPoolTask() : did_schedule_(false), did_complete_(false) {} | |
183 | |
184 WorkerPoolTask::~WorkerPoolTask() { | |
185 DCHECK(!did_schedule_); | |
186 DCHECK(!did_run_ || did_complete_); | |
187 } | |
188 | |
189 void WorkerPoolTask::WillSchedule() { DCHECK(!did_schedule_); } | |
190 | |
191 void WorkerPoolTask::DidSchedule() { | |
192 did_schedule_ = true; | |
193 did_complete_ = false; | |
194 } | |
195 | |
196 bool WorkerPoolTask::HasBeenScheduled() const { return did_schedule_; } | |
197 | |
198 void WorkerPoolTask::WillComplete() { DCHECK(!did_complete_); } | |
199 | |
200 void WorkerPoolTask::DidComplete() { | |
201 DCHECK(did_schedule_); | |
202 DCHECK(!did_complete_); | |
203 did_schedule_ = false; | |
204 did_complete_ = true; | |
205 } | |
206 | |
207 bool WorkerPoolTask::HasCompleted() const { return did_complete_; } | |
208 | |
209 RasterWorkerPoolTask::RasterWorkerPoolTask( | |
210 const Resource* resource, | |
211 internal::WorkerPoolTask::Vector* dependencies) | |
212 : resource_(resource) { | |
213 dependencies_.swap(*dependencies); | |
214 } | |
215 | |
216 RasterWorkerPoolTask::~RasterWorkerPoolTask() {} | |
217 | |
218 } // namespace internal | |
219 | |
220 RasterTaskQueue::Item::Item(internal::RasterWorkerPoolTask* task, | |
221 bool required_for_activation) | |
222 : task(task), required_for_activation(required_for_activation) {} | |
223 | |
224 RasterTaskQueue::Item::~Item() {} | |
225 | |
226 RasterTaskQueue::RasterTaskQueue() : required_for_activation_count(0u) {} | |
227 | |
228 RasterTaskQueue::~RasterTaskQueue() {} | |
229 | |
230 void RasterTaskQueue::Swap(RasterTaskQueue* other) { | |
231 items.swap(other->items); | |
232 std::swap(required_for_activation_count, | |
233 other->required_for_activation_count); | |
234 } | |
235 | |
236 void RasterTaskQueue::Reset() { | |
237 required_for_activation_count = 0u; | |
238 items.clear(); | |
239 } | |
240 | |
241 // This allows an external rasterize on-demand system to run raster tasks | 176 // This allows an external rasterize on-demand system to run raster tasks |
242 // with highest priority using the same task graph runner instance. | 177 // with highest priority using the same task graph runner instance. |
243 unsigned RasterWorkerPool::kOnDemandRasterTaskPriority = 0u; | 178 unsigned RasterWorkerPool::kOnDemandRasterTaskPriority = 0u; |
244 // This allows a micro benchmark system to run tasks with highest priority, | 179 // This allows a micro benchmark system to run tasks with highest priority, |
245 // since it should finish as quickly as possible. | 180 // since it should finish as quickly as possible. |
246 unsigned RasterWorkerPool::kBenchmarkRasterTaskPriority = 0u; | 181 unsigned RasterWorkerPool::kBenchmarkRasterTaskPriority = 0u; |
247 // Task priorities that make sure raster finished tasks run before any | 182 // Task priorities that make sure raster finished tasks run before any |
248 // remaining raster tasks. | 183 // remaining raster tasks. |
249 unsigned RasterWorkerPool::kRasterFinishedTaskPriority = 2u; | 184 unsigned RasterWorkerPool::kRasterFinishedTaskPriority = 2u; |
250 unsigned RasterWorkerPool::kRasterRequiredForActivationFinishedTaskPriority = | 185 unsigned RasterWorkerPool::kRasterRequiredForActivationFinishedTaskPriority = |
251 1u; | 186 1u; |
252 unsigned RasterWorkerPool::kRasterTaskPriorityBase = 3u; | 187 unsigned RasterWorkerPool::kRasterTaskPriorityBase = 3u; |
253 | 188 |
| 189 RasterWorkerPool::RasterWorkerPool() {} |
| 190 |
| 191 RasterWorkerPool::~RasterWorkerPool() {} |
| 192 |
254 // static | 193 // static |
255 void RasterWorkerPool::SetNumRasterThreads(int num_threads) { | 194 void RasterWorkerPool::SetNumRasterThreads(int num_threads) { |
256 DCHECK_LT(0, num_threads); | 195 DCHECK_LT(0, num_threads); |
257 DCHECK_EQ(0, g_num_raster_threads); | 196 DCHECK_EQ(0, g_num_raster_threads); |
258 | 197 |
259 g_num_raster_threads = num_threads; | 198 g_num_raster_threads = num_threads; |
260 } | 199 } |
261 | 200 |
262 // static | 201 // static |
263 int RasterWorkerPool::GetNumRasterThreads() { | 202 int RasterWorkerPool::GetNumRasterThreads() { |
264 if (!g_num_raster_threads) | 203 if (!g_num_raster_threads) |
265 g_num_raster_threads = kDefaultNumRasterThreads; | 204 g_num_raster_threads = kDefaultNumRasterThreads; |
266 | 205 |
267 return g_num_raster_threads; | 206 return g_num_raster_threads; |
268 } | 207 } |
269 | 208 |
270 // static | 209 // static |
271 internal::TaskGraphRunner* RasterWorkerPool::GetTaskGraphRunner() { | 210 internal::TaskGraphRunner* RasterWorkerPool::GetTaskGraphRunner() { |
272 return g_task_graph_runner.Pointer(); | 211 return g_task_graph_runner.Pointer(); |
273 } | 212 } |
274 | 213 |
275 // static | 214 // static |
276 size_t RasterWorkerPool::GetPictureCloneIndexForCurrentThread() { | 215 size_t RasterWorkerPool::GetPictureCloneIndexForCurrentThread() { |
277 return g_task_graph_runner.Pointer()->GetPictureCloneIndexForCurrentThread(); | 216 return g_task_graph_runner.Pointer()->GetPictureCloneIndexForCurrentThread(); |
278 } | 217 } |
279 | 218 |
280 // static | 219 // static |
281 scoped_refptr<internal::WorkerPoolTask> | 220 scoped_refptr<internal::RasterizerTask> |
282 RasterWorkerPool::CreateRasterFinishedTask( | 221 RasterWorkerPool::CreateRasterFinishedTask( |
283 base::SequencedTaskRunner* task_runner, | 222 base::SequencedTaskRunner* task_runner, |
284 const base::Closure& on_raster_finished_callback) { | 223 const base::Closure& on_raster_finished_callback) { |
285 return make_scoped_refptr(new RasterFinishedWorkerPoolTaskImpl( | 224 return make_scoped_refptr( |
286 task_runner, on_raster_finished_callback)); | 225 new RasterFinishedTaskImpl(task_runner, on_raster_finished_callback)); |
287 } | 226 } |
288 | 227 |
289 // static | 228 // static |
290 scoped_refptr<internal::WorkerPoolTask> | 229 scoped_refptr<internal::RasterizerTask> |
291 RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask( | 230 RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask( |
292 size_t tasks_required_for_activation_count, | 231 size_t tasks_required_for_activation_count, |
293 base::SequencedTaskRunner* task_runner, | 232 base::SequencedTaskRunner* task_runner, |
294 const base::Closure& on_raster_finished_callback) { | 233 const base::Closure& on_raster_finished_callback) { |
295 return make_scoped_refptr( | 234 return make_scoped_refptr(new RasterRequiredForActivationFinishedTaskImpl( |
296 new RasterRequiredForActivationFinishedWorkerPoolTaskImpl( | 235 task_runner, |
297 task_runner, | 236 on_raster_finished_callback, |
298 on_raster_finished_callback, | 237 tasks_required_for_activation_count)); |
299 tasks_required_for_activation_count)); | |
300 } | 238 } |
301 | 239 |
302 // static | 240 // static |
303 void RasterWorkerPool::ScheduleTasksOnOriginThread( | 241 void RasterWorkerPool::ScheduleTasksOnOriginThread( |
304 internal::WorkerPoolTaskClient* client, | 242 internal::RasterizerTaskClient* client, |
305 internal::TaskGraph* graph) { | 243 internal::TaskGraph* graph) { |
306 TRACE_EVENT0("cc", "RasterWorkerPool::ScheduleTasksOnOriginThread"); | 244 TRACE_EVENT0("cc", "Rasterizer::ScheduleTasksOnOriginThread"); |
307 | 245 |
308 for (internal::TaskGraph::Node::Vector::iterator it = graph->nodes.begin(); | 246 for (internal::TaskGraph::Node::Vector::iterator it = graph->nodes.begin(); |
309 it != graph->nodes.end(); | 247 it != graph->nodes.end(); |
310 ++it) { | 248 ++it) { |
311 internal::TaskGraph::Node& node = *it; | 249 internal::TaskGraph::Node& node = *it; |
312 internal::WorkerPoolTask* task = | 250 internal::RasterizerTask* task = |
313 static_cast<internal::WorkerPoolTask*>(node.task); | 251 static_cast<internal::RasterizerTask*>(node.task); |
314 | 252 |
315 if (!task->HasBeenScheduled()) { | 253 if (!task->HasBeenScheduled()) { |
316 task->WillSchedule(); | 254 task->WillSchedule(); |
317 task->ScheduleOnOriginThread(client); | 255 task->ScheduleOnOriginThread(client); |
318 task->DidSchedule(); | 256 task->DidSchedule(); |
319 } | 257 } |
320 } | 258 } |
321 } | 259 } |
322 | 260 |
323 // static | 261 // static |
324 void RasterWorkerPool::InsertNodeForTask(internal::TaskGraph* graph, | 262 void RasterWorkerPool::InsertNodeForTask(internal::TaskGraph* graph, |
325 internal::WorkerPoolTask* task, | 263 internal::RasterizerTask* task, |
326 unsigned priority, | 264 unsigned priority, |
327 size_t dependencies) { | 265 size_t dependencies) { |
328 DCHECK(std::find_if(graph->nodes.begin(), | 266 DCHECK(std::find_if(graph->nodes.begin(), |
329 graph->nodes.end(), | 267 graph->nodes.end(), |
330 internal::TaskGraph::Node::TaskComparator(task)) == | 268 internal::TaskGraph::Node::TaskComparator(task)) == |
331 graph->nodes.end()); | 269 graph->nodes.end()); |
332 graph->nodes.push_back( | 270 graph->nodes.push_back( |
333 internal::TaskGraph::Node(task, priority, dependencies)); | 271 internal::TaskGraph::Node(task, priority, dependencies)); |
334 } | 272 } |
335 | 273 |
336 // static | 274 // static |
337 void RasterWorkerPool::InsertNodesForRasterTask( | 275 void RasterWorkerPool::InsertNodesForRasterTask( |
338 internal::TaskGraph* graph, | 276 internal::TaskGraph* graph, |
339 internal::WorkerPoolTask* raster_task, | 277 internal::RasterTask* raster_task, |
340 const internal::WorkerPoolTask::Vector& decode_tasks, | 278 const internal::ImageDecodeTask::Vector& decode_tasks, |
341 unsigned priority) { | 279 unsigned priority) { |
342 size_t dependencies = 0u; | 280 size_t dependencies = 0u; |
343 | 281 |
344 // Insert image decode tasks. | 282 // Insert image decode tasks. |
345 for (internal::WorkerPoolTask::Vector::const_iterator it = | 283 for (internal::ImageDecodeTask::Vector::const_iterator it = |
346 decode_tasks.begin(); | 284 decode_tasks.begin(); |
347 it != decode_tasks.end(); | 285 it != decode_tasks.end(); |
348 ++it) { | 286 ++it) { |
349 internal::WorkerPoolTask* decode_task = it->get(); | 287 internal::ImageDecodeTask* decode_task = it->get(); |
350 | 288 |
351 // Skip if already decoded. | 289 // Skip if already decoded. |
352 if (decode_task->HasCompleted()) | 290 if (decode_task->HasCompleted()) |
353 continue; | 291 continue; |
354 | 292 |
355 dependencies++; | 293 dependencies++; |
356 | 294 |
357 // Add decode task if it doesn't already exists in graph. | 295 // Add decode task if it doesn't already exists in graph. |
358 internal::TaskGraph::Node::Vector::iterator decode_it = | 296 internal::TaskGraph::Node::Vector::iterator decode_it = |
359 std::find_if(graph->nodes.begin(), | 297 std::find_if(graph->nodes.begin(), |
360 graph->nodes.end(), | 298 graph->nodes.end(), |
361 internal::TaskGraph::Node::TaskComparator(decode_task)); | 299 internal::TaskGraph::Node::TaskComparator(decode_task)); |
362 if (decode_it == graph->nodes.end()) | 300 if (decode_it == graph->nodes.end()) |
363 InsertNodeForTask(graph, decode_task, priority, 0u); | 301 InsertNodeForTask(graph, decode_task, priority, 0u); |
364 | 302 |
365 graph->edges.push_back(internal::TaskGraph::Edge(decode_task, raster_task)); | 303 graph->edges.push_back(internal::TaskGraph::Edge(decode_task, raster_task)); |
366 } | 304 } |
367 | 305 |
368 InsertNodeForTask(graph, raster_task, priority, dependencies); | 306 InsertNodeForTask(graph, raster_task, priority, dependencies); |
369 } | 307 } |
370 | 308 |
371 } // namespace cc | 309 } // namespace cc |
OLD | NEW |