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