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 "base/json/json_writer.h" | 7 #include "base/json/json_writer.h" |
8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
9 #include "base/values.h" | 9 #include "base/values.h" |
10 #include "cc/debug/devtools_instrumentation.h" | 10 #include "cc/debug/devtools_instrumentation.h" |
(...skipping 11 matching lines...) Expand all Loading... | |
22 // SkDrawFilter interface. | 22 // SkDrawFilter interface. |
23 virtual bool filter(SkPaint* paint, SkDrawFilter::Type type) OVERRIDE { | 23 virtual bool filter(SkPaint* paint, SkDrawFilter::Type type) OVERRIDE { |
24 if (type != SkDrawFilter::kText_Type) | 24 if (type != SkDrawFilter::kText_Type) |
25 return true; | 25 return true; |
26 | 26 |
27 paint->setLCDRenderText(false); | 27 paint->setLCDRenderText(false); |
28 return true; | 28 return true; |
29 } | 29 } |
30 }; | 30 }; |
31 | 31 |
32 void Noop() {} | |
33 | |
34 class RootWorkerPoolTaskImpl : public internal::WorkerPoolTask { | |
35 public: | |
36 RootWorkerPoolTaskImpl(const base::Closure& callback, | |
37 const base::Closure& reply) | |
38 : callback_(callback), reply_(reply) {} | |
39 | |
40 explicit RootWorkerPoolTaskImpl( | |
41 internal::WorkerPoolTask::TaskVector* dependencies) | |
42 : internal::WorkerPoolTask(dependencies), | |
43 callback_(base::Bind(&Noop)), | |
44 reply_(base::Bind(&Noop)) {} | |
45 | |
46 RootWorkerPoolTaskImpl(const base::Closure& callback, | |
47 internal::WorkerPoolTask::TaskVector* dependencies) | |
48 : internal::WorkerPoolTask(dependencies), | |
49 callback_(callback), | |
50 reply_(base::Bind(&Noop)) {} | |
51 | |
52 // Overridden from internal::WorkerPoolTask: | |
53 virtual void RunOnThread(unsigned thread_index) OVERRIDE { | |
54 callback_.Run(); | |
55 } | |
56 virtual void DispatchCompletionCallback() OVERRIDE { | |
57 reply_.Run(); | |
58 } | |
59 | |
60 private: | |
61 virtual ~RootWorkerPoolTaskImpl() {} | |
62 | |
63 const base::Closure callback_; | |
64 const base::Closure reply_; | |
65 | |
66 DISALLOW_COPY_AND_ASSIGN(RootWorkerPoolTaskImpl); | |
67 }; | |
68 | |
69 class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { | 32 class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
70 public: | 33 public: |
71 RasterWorkerPoolTaskImpl(const Resource* resource, | 34 RasterWorkerPoolTaskImpl(const Resource* resource, |
72 PicturePileImpl* picture_pile, | 35 PicturePileImpl* picture_pile, |
73 gfx::Rect content_rect, | 36 gfx::Rect content_rect, |
74 float contents_scale, | 37 float contents_scale, |
75 RasterMode raster_mode, | 38 RasterMode raster_mode, |
76 bool use_color_estimator, | 39 bool use_color_estimator, |
77 const RasterTaskMetadata& metadata, | 40 const RasterTaskMetadata& metadata, |
78 RenderingStatsInstrumentation* rendering_stats, | 41 RenderingStatsInstrumentation* rendering_stats, |
79 const RasterWorkerPool::RasterTask::Reply& reply, | 42 const RasterWorkerPool::RasterTask::Reply& reply, |
80 internal::WorkerPoolTask::TaskVector* dependencies) | 43 TaskVector* dependencies) |
81 : internal::RasterWorkerPoolTask(resource, dependencies), | 44 : internal::RasterWorkerPoolTask(resource, dependencies), |
82 picture_pile_(picture_pile), | 45 picture_pile_(picture_pile), |
83 content_rect_(content_rect), | 46 content_rect_(content_rect), |
84 contents_scale_(contents_scale), | 47 contents_scale_(contents_scale), |
85 raster_mode_(raster_mode), | 48 raster_mode_(raster_mode), |
86 use_color_estimator_(use_color_estimator), | 49 use_color_estimator_(use_color_estimator), |
87 metadata_(metadata), | 50 metadata_(metadata), |
88 rendering_stats_(rendering_stats), | 51 rendering_stats_(rendering_stats), |
89 reply_(reply) {} | 52 reply_(reply) {} |
90 | 53 |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
230 | 193 |
231 private: | 194 private: |
232 skia::LazyPixelRef* pixel_ref_; | 195 skia::LazyPixelRef* pixel_ref_; |
233 int layer_id_; | 196 int layer_id_; |
234 RenderingStatsInstrumentation* rendering_stats_; | 197 RenderingStatsInstrumentation* rendering_stats_; |
235 const RasterWorkerPool::Task::Reply reply_; | 198 const RasterWorkerPool::Task::Reply reply_; |
236 | 199 |
237 DISALLOW_COPY_AND_ASSIGN(ImageDecodeWorkerPoolTaskImpl); | 200 DISALLOW_COPY_AND_ASSIGN(ImageDecodeWorkerPoolTaskImpl); |
238 }; | 201 }; |
239 | 202 |
203 class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask { | |
204 public: | |
205 RasterFinishedWorkerPoolTaskImpl( | |
206 base::MessageLoopProxy* origin_loop, | |
207 const base::Closure& on_raster_finished_callback) | |
208 : origin_loop_(origin_loop), | |
209 on_raster_finished_callback_(on_raster_finished_callback) { | |
210 } | |
211 | |
212 // Overridden from internal::WorkerPoolTask: | |
213 virtual void RunOnThread(unsigned thread_index) OVERRIDE { | |
214 origin_loop_->PostTask(FROM_HERE, on_raster_finished_callback_); | |
215 } | |
216 virtual void DispatchCompletionCallback() OVERRIDE {} | |
217 | |
218 private: | |
219 virtual ~RasterFinishedWorkerPoolTaskImpl() {} | |
220 | |
221 scoped_refptr<base::MessageLoopProxy> origin_loop_; | |
222 const base::Closure on_raster_finished_callback_; | |
223 | |
224 DISALLOW_COPY_AND_ASSIGN(RasterFinishedWorkerPoolTaskImpl); | |
225 }; | |
226 | |
227 void Noop() {} | |
228 | |
240 const char* kWorkerThreadNamePrefix = "CompositorRaster"; | 229 const char* kWorkerThreadNamePrefix = "CompositorRaster"; |
241 | 230 |
242 } // namespace | 231 } // namespace |
243 | 232 |
244 namespace internal { | 233 namespace internal { |
245 | 234 |
246 RasterWorkerPoolTask::RasterWorkerPoolTask( | 235 RasterWorkerPoolTask::RasterWorkerPoolTask( |
247 const Resource* resource, | 236 const Resource* resource, TaskVector* dependencies) |
248 WorkerPoolTask::TaskVector* dependencies) | |
249 : did_run_(false), | 237 : did_run_(false), |
250 did_complete_(false), | 238 did_complete_(false), |
251 was_canceled_(false), | 239 was_canceled_(false), |
252 resource_(resource) { | 240 resource_(resource) { |
253 dependencies_.swap(*dependencies); | 241 dependencies_.swap(*dependencies); |
254 } | 242 } |
255 | 243 |
256 RasterWorkerPoolTask::~RasterWorkerPoolTask() { | 244 RasterWorkerPoolTask::~RasterWorkerPoolTask() { |
257 } | 245 } |
258 | 246 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
338 : internal_(internal) { | 326 : internal_(internal) { |
339 } | 327 } |
340 | 328 |
341 void RasterWorkerPool::RasterTask::Reset() { | 329 void RasterWorkerPool::RasterTask::Reset() { |
342 internal_ = NULL; | 330 internal_ = NULL; |
343 } | 331 } |
344 | 332 |
345 RasterWorkerPool::RasterTask::~RasterTask() { | 333 RasterWorkerPool::RasterTask::~RasterTask() { |
346 } | 334 } |
347 | 335 |
348 RasterWorkerPool::RootTask::RootTask() { | 336 RasterWorkerPool::RasterTaskGraph::RasterTaskGraph() |
337 : raster_finished_node_(new GraphNode), | |
338 next_priority_(1u) { | |
349 } | 339 } |
350 | 340 |
351 RasterWorkerPool::RootTask::RootTask( | 341 RasterWorkerPool::RasterTaskGraph::~RasterTaskGraph() { |
352 internal::WorkerPoolTask::TaskVector* dependencies) | |
353 : internal_(new RootWorkerPoolTaskImpl(dependencies)) { | |
354 } | 342 } |
355 | 343 |
356 RasterWorkerPool::RootTask::RootTask( | 344 void RasterWorkerPool::RasterTaskGraph::InsertRasterTask( |
357 const base::Closure& callback, | 345 internal::WorkerPoolTask* raster_task, |
358 internal::WorkerPoolTask::TaskVector* dependencies) | 346 const TaskVector& decode_tasks) { |
359 : internal_(new RootWorkerPoolTaskImpl(callback, dependencies)) { | 347 DCHECK(!raster_task->HasCompleted()); |
360 } | 348 DCHECK(graph_.find(raster_task) == graph_.end()); |
361 | 349 |
362 RasterWorkerPool::RootTask::~RootTask() { | 350 scoped_ptr<GraphNode> raster_node(new GraphNode); |
351 raster_node->set_task(raster_task); | |
352 raster_node->set_priority(next_priority_++); | |
353 | |
354 // Insert image decode tasks. | |
355 for (TaskVector::const_iterator it = decode_tasks.begin(); | |
356 it != decode_tasks.end(); ++it) { | |
357 internal::WorkerPoolTask* decode_task = it->get(); | |
358 | |
359 // Skip if already decoded. | |
360 if (decode_task->HasCompleted()) | |
361 continue; | |
362 | |
363 raster_node->add_dependency(); | |
364 | |
365 // Check if decode task already exists in graph. | |
366 GraphNodeMap::iterator decode_it = graph_.find(decode_task); | |
367 if (decode_it != graph_.end()) { | |
368 GraphNode* decode_node = decode_it->second; | |
369 decode_node->add_dependent(raster_node.get()); | |
370 continue; | |
371 } | |
372 | |
373 scoped_ptr<GraphNode> decode_node(new GraphNode); | |
374 decode_node->set_task(decode_task); | |
375 decode_node->set_priority(next_priority_++); | |
376 decode_node->add_dependent(raster_node.get()); | |
377 graph_.set(decode_task, decode_node.Pass()); | |
378 } | |
379 | |
380 raster_finished_node_->add_dependency(); | |
381 raster_node->add_dependent(raster_finished_node_.get()); | |
382 | |
383 graph_.set(raster_task, raster_node.Pass()); | |
363 } | 384 } |
364 | 385 |
365 // static | 386 // static |
366 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( | 387 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( |
367 const Resource* resource, | 388 const Resource* resource, |
368 PicturePileImpl* picture_pile, | 389 PicturePileImpl* picture_pile, |
369 gfx::Rect content_rect, | 390 gfx::Rect content_rect, |
370 float contents_scale, | 391 float contents_scale, |
371 RasterMode raster_mode, | 392 RasterMode raster_mode, |
372 bool use_color_estimator, | 393 bool use_color_estimator, |
373 const RasterTaskMetadata& metadata, | 394 const RasterTaskMetadata& metadata, |
374 RenderingStatsInstrumentation* rendering_stats, | 395 RenderingStatsInstrumentation* rendering_stats, |
375 const RasterTask::Reply& reply, | 396 const RasterTask::Reply& reply, |
376 Task::Set& dependencies) { | 397 Task::Set* dependencies) { |
377 return RasterTask(new RasterWorkerPoolTaskImpl(resource, | 398 return RasterTask(new RasterWorkerPoolTaskImpl(resource, |
378 picture_pile, | 399 picture_pile, |
379 content_rect, | 400 content_rect, |
380 contents_scale, | 401 contents_scale, |
381 raster_mode, | 402 raster_mode, |
382 use_color_estimator, | 403 use_color_estimator, |
383 metadata, | 404 metadata, |
384 rendering_stats, | 405 rendering_stats, |
385 reply, | 406 reply, |
386 &dependencies.tasks_)); | 407 &dependencies->tasks_)); |
387 } | 408 } |
388 | 409 |
389 // static | 410 // static |
390 RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask( | 411 RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask( |
391 skia::LazyPixelRef* pixel_ref, | 412 skia::LazyPixelRef* pixel_ref, |
392 int layer_id, | 413 int layer_id, |
393 RenderingStatsInstrumentation* stats_instrumentation, | 414 RenderingStatsInstrumentation* stats_instrumentation, |
394 const Task::Reply& reply) { | 415 const Task::Reply& reply) { |
395 return Task(new ImageDecodeWorkerPoolTaskImpl(pixel_ref, | 416 return Task(new ImageDecodeWorkerPoolTaskImpl(pixel_ref, |
396 layer_id, | 417 layer_id, |
397 stats_instrumentation, | 418 stats_instrumentation, |
398 reply)); | 419 reply)); |
399 } | 420 } |
400 | 421 |
401 RasterWorkerPool::RasterWorkerPool(ResourceProvider* resource_provider, | 422 RasterWorkerPool::RasterWorkerPool(ResourceProvider* resource_provider, |
402 size_t num_threads) | 423 size_t num_threads) |
403 : WorkerPool(num_threads, kWorkerThreadNamePrefix), | 424 : WorkerPool(num_threads, kWorkerThreadNamePrefix), |
404 client_(NULL), | 425 client_(NULL), |
405 resource_provider_(resource_provider) { | 426 resource_provider_(resource_provider), |
427 weak_ptr_factory_(this), | |
428 schedule_raster_tasks_count_(0) { | |
406 } | 429 } |
407 | 430 |
408 RasterWorkerPool::~RasterWorkerPool() { | 431 RasterWorkerPool::~RasterWorkerPool() { |
409 } | 432 } |
410 | 433 |
411 void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { | 434 void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { |
412 client_ = client; | 435 client_ = client; |
413 } | 436 } |
414 | 437 |
415 void RasterWorkerPool::Shutdown() { | 438 void RasterWorkerPool::Shutdown() { |
439 TaskGraph empty; | |
440 SetTaskGraph(&empty); | |
441 WorkerPool::Shutdown(); | |
416 raster_tasks_.clear(); | 442 raster_tasks_.clear(); |
417 WorkerPool::Shutdown(); | 443 // Cancel any pending OnRasterFinished callback. |
444 weak_ptr_factory_.InvalidateWeakPtrs(); | |
418 } | 445 } |
419 | 446 |
420 void RasterWorkerPool::SetRasterTasks(RasterTask::Queue* queue) { | 447 void RasterWorkerPool::SetRasterTasks(RasterTask::Queue* queue) { |
421 raster_tasks_.swap(queue->tasks_); | 448 raster_tasks_.swap(queue->tasks_); |
422 raster_tasks_required_for_activation_.swap( | 449 raster_tasks_required_for_activation_.swap( |
423 queue->tasks_required_for_activation_); | 450 queue->tasks_required_for_activation_); |
424 } | 451 } |
425 | 452 |
426 void RasterWorkerPool::ScheduleRasterTasks(const RootTask& root) { | 453 void RasterWorkerPool::SetRasterTaskGraph(RasterTaskGraph* graph) { |
427 scoped_refptr<internal::WorkerPoolTask> new_root(root.internal_); | 454 scoped_ptr<GraphNode> raster_finished_node( |
455 graph->raster_finished_node_.Pass()); | |
456 TaskGraph new_graph; | |
457 new_graph.swap(graph->graph_); | |
428 | 458 |
429 TaskGraph graph; | 459 if (new_graph.empty()) { |
430 BuildTaskGraph(new_root.get(), &graph); | 460 SetTaskGraph(&new_graph); |
431 WorkerPool::SetTaskGraph(&graph); | 461 raster_finished_task_ = NULL; |
462 return; | |
463 } | |
432 | 464 |
433 root_.swap(new_root); | 465 ++schedule_raster_tasks_count_; |
vmpstr
2013/06/20 18:01:30
should this be incremented even if we schedule NUL
reveman
2013/06/20 18:34:09
we'll probably change this moving forward but I pr
| |
466 | |
467 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task( | |
468 new RasterFinishedWorkerPoolTaskImpl( | |
469 base::MessageLoopProxy::current(), | |
470 base::Bind(&RasterWorkerPool::OnRasterFinished, | |
471 weak_ptr_factory_.GetWeakPtr(), | |
472 schedule_raster_tasks_count_))); | |
473 raster_finished_node->set_task(new_raster_finished_task.get()); | |
474 // Insert "raster finished" task before switching to new graph. | |
475 new_graph.set(new_raster_finished_task.get(), raster_finished_node.Pass()); | |
476 SetTaskGraph(&new_graph); | |
477 raster_finished_task_.swap(new_raster_finished_task); | |
434 } | 478 } |
435 | 479 |
436 bool RasterWorkerPool::IsRasterTaskRequiredForActivation( | 480 bool RasterWorkerPool::IsRasterTaskRequiredForActivation( |
437 internal::RasterWorkerPoolTask* task) const { | 481 internal::RasterWorkerPoolTask* task) const { |
438 return | 482 return |
439 raster_tasks_required_for_activation_.find(task) != | 483 raster_tasks_required_for_activation_.find(task) != |
440 raster_tasks_required_for_activation_.end(); | 484 raster_tasks_required_for_activation_.end(); |
441 } | 485 } |
442 | 486 |
487 void RasterWorkerPool::OnRasterFinished(int64 schedule_raster_tasks_count) { | |
488 TRACE_EVENT1("cc", "RasterWorkerPool::OnRasterFinished", | |
489 "schedule_raster_tasks_count", schedule_raster_tasks_count); | |
490 DCHECK_GE(schedule_raster_tasks_count_, schedule_raster_tasks_count); | |
491 // Call OnRasterTasksFinished() when we've finished running all raster | |
492 // tasks needed since last time SetRasterTaskGraph() was called. | |
493 if (schedule_raster_tasks_count_ == schedule_raster_tasks_count) | |
494 OnRasterTasksFinished(); | |
495 } | |
496 | |
443 } // namespace cc | 497 } // namespace cc |
OLD | NEW |