Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: cc/resources/pixel_buffer_raster_worker_pool.cc

Issue 154003006: cc: Switch to vector based TaskGraph implementation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: build fix Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/resources/image_raster_worker_pool.cc ('k') | cc/resources/raster_worker_pool.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/pixel_buffer_raster_worker_pool.h" 5 #include "cc/resources/pixel_buffer_raster_worker_pool.h"
6 6
7 #include "base/containers/stack_container.h" 7 #include "base/containers/stack_container.h"
8 #include "base/debug/trace_event.h" 8 #include "base/debug/trace_event.h"
9 #include "base/values.h" 9 #include "base/values.h"
10 #include "cc/debug/traced_value.h" 10 #include "cc/debug/traced_value.h"
11 #include "cc/resources/resource.h" 11 #include "cc/resources/resource.h"
12 #include "third_party/skia/include/core/SkBitmapDevice.h"
13
14 #if defined(OS_ANDROID)
15 #include "base/android/sys_utils.h"
16 #endif
17 12
18 namespace cc { 13 namespace cc {
19 namespace { 14 namespace {
20 15
21 const int kCheckForCompletedRasterTasksDelayMs = 6; 16 const int kCheckForCompletedRasterTasksDelayMs = 6;
22 17
23 const size_t kMaxScheduledRasterTasks = 48; 18 const size_t kMaxScheduledRasterTasks = 48;
24 19
25 typedef base::StackVector<internal::GraphNode*, kMaxScheduledRasterTasks> 20 typedef base::StackVector<internal::WorkerPoolTask*, kMaxScheduledRasterTasks>
26 NodeVector; 21 WorkerPoolTaskVector;
27
28 void AddDependenciesToGraphNode(internal::GraphNode* node,
29 const NodeVector::ContainerType& dependencies) {
30 for (NodeVector::ContainerType::const_iterator it = dependencies.begin();
31 it != dependencies.end();
32 ++it) {
33 internal::GraphNode* dependency = *it;
34
35 node->add_dependency();
36 dependency->add_dependent(node);
37 }
38 }
39 22
40 // Only used as std::find_if predicate for DCHECKs. 23 // Only used as std::find_if predicate for DCHECKs.
41 bool WasCanceled(const internal::RasterWorkerPoolTask* task) { 24 bool WasCanceled(const internal::RasterWorkerPoolTask* task) {
42 return !task->HasFinishedRunning(); 25 return !task->HasFinishedRunning();
43 } 26 }
44 27
45 } // namespace 28 } // namespace
46 29
47 PixelBufferRasterWorkerPool::PixelBufferRasterWorkerPool( 30 PixelBufferRasterWorkerPool::PixelBufferRasterWorkerPool(
48 ResourceProvider* resource_provider, 31 ResourceProvider* resource_provider,
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 if (will_notify_client_that_no_tasks_are_pending) { 462 if (will_notify_client_that_no_tasks_are_pending) {
480 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); 463 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this);
481 DCHECK(!HasPendingTasksRequiredForActivation()); 464 DCHECK(!HasPendingTasksRequiredForActivation());
482 client()->DidFinishRunningTasks(); 465 client()->DidFinishRunningTasks();
483 } 466 }
484 } 467 }
485 468
486 void PixelBufferRasterWorkerPool::ScheduleMoreTasks() { 469 void PixelBufferRasterWorkerPool::ScheduleMoreTasks() {
487 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks"); 470 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks");
488 471
489 enum RasterTaskType { 472 WorkerPoolTaskVector tasks;
490 PREPAINT_TYPE = 0, 473 WorkerPoolTaskVector tasks_required_for_activation;
491 REQUIRED_FOR_ACTIVATION_TYPE = 1, 474
492 NUM_TYPES = 2 475 unsigned priority = kRasterTaskPriorityBase;
493 }; 476 internal::TaskGraph graph;
494 NodeVector tasks[NUM_TYPES];
495 unsigned priority = 2u; // 0-1 reserved for RasterFinished tasks.
496 TaskGraph graph;
497 477
498 size_t bytes_pending_upload = bytes_pending_upload_; 478 size_t bytes_pending_upload = bytes_pending_upload_;
499 bool did_throttle_raster_tasks = false; 479 bool did_throttle_raster_tasks = false;
500 480
501 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); 481 for (RasterTaskVector::const_iterator it = raster_tasks().begin();
502 it != raster_tasks().end(); 482 it != raster_tasks().end();
503 ++it) { 483 ++it) {
504 internal::RasterWorkerPoolTask* task = it->get(); 484 internal::RasterWorkerPoolTask* task = it->get();
505 485
506 // |raster_task_states_| contains the state of all tasks that we have not 486 // |raster_task_states_| contains the state of all tasks that we have not
(...skipping 19 matching lines...) Expand all
526 } 506 }
527 507
528 // If raster has finished, just update |bytes_pending_upload|. 508 // If raster has finished, just update |bytes_pending_upload|.
529 if (state_it->second == UPLOADING) { 509 if (state_it->second == UPLOADING) {
530 DCHECK(task->HasCompleted()); 510 DCHECK(task->HasCompleted());
531 bytes_pending_upload = new_bytes_pending_upload; 511 bytes_pending_upload = new_bytes_pending_upload;
532 continue; 512 continue;
533 } 513 }
534 514
535 // Throttle raster tasks based on kMaxScheduledRasterTasks. 515 // Throttle raster tasks based on kMaxScheduledRasterTasks.
536 size_t scheduled_raster_task_count = 516 if (tasks.container().size() >= kMaxScheduledRasterTasks) {
537 tasks[PREPAINT_TYPE].container().size() +
538 tasks[REQUIRED_FOR_ACTIVATION_TYPE].container().size();
539 if (scheduled_raster_task_count >= kMaxScheduledRasterTasks) {
540 did_throttle_raster_tasks = true; 517 did_throttle_raster_tasks = true;
541 break; 518 break;
542 } 519 }
543 520
544 // Update |bytes_pending_upload| now that task has cleared all 521 // Update |bytes_pending_upload| now that task has cleared all
545 // throttling limits. 522 // throttling limits.
546 bytes_pending_upload = new_bytes_pending_upload; 523 bytes_pending_upload = new_bytes_pending_upload;
547 524
548 RasterTaskType type = IsRasterTaskRequiredForActivation(task)
549 ? REQUIRED_FOR_ACTIVATION_TYPE
550 : PREPAINT_TYPE;
551
552 DCHECK(state_it->second == UNSCHEDULED || state_it->second == SCHEDULED); 525 DCHECK(state_it->second == UNSCHEDULED || state_it->second == SCHEDULED);
553 state_it->second = SCHEDULED; 526 state_it->second = SCHEDULED;
554 527
555 tasks[type].container().push_back(CreateGraphNodeForRasterTask( 528 InsertNodeForRasterTask(&graph, task, task->dependencies(), priority++);
556 task, task->dependencies(), priority++, &graph)); 529
530 tasks.container().push_back(task);
531 if (IsRasterTaskRequiredForActivation(task))
532 tasks_required_for_activation.container().push_back(task);
557 } 533 }
558 534
559 scoped_refptr<internal::WorkerPoolTask> 535 scoped_refptr<internal::WorkerPoolTask>
560 new_raster_required_for_activation_finished_task; 536 new_raster_required_for_activation_finished_task;
561 537
562 size_t scheduled_raster_task_required_for_activation_count = 538 size_t scheduled_raster_task_required_for_activation_count =
563 tasks[REQUIRED_FOR_ACTIVATION_TYPE].container().size(); 539 tasks_required_for_activation.container().size();
564 DCHECK_LE(scheduled_raster_task_required_for_activation_count, 540 DCHECK_LE(scheduled_raster_task_required_for_activation_count,
565 raster_tasks_required_for_activation_.size()); 541 raster_tasks_required_for_activation_.size());
566 // Schedule OnRasterTasksRequiredForActivationFinished call only when 542 // Schedule OnRasterTasksRequiredForActivationFinished call only when
567 // notification is pending and throttling is not preventing all pending 543 // notification is pending and throttling is not preventing all pending
568 // tasks required for activation from being scheduled. 544 // tasks required for activation from being scheduled.
569 if (scheduled_raster_task_required_for_activation_count == 545 if (scheduled_raster_task_required_for_activation_count ==
570 raster_tasks_required_for_activation_.size() && 546 raster_tasks_required_for_activation_.size() &&
571 should_notify_client_if_no_tasks_required_for_activation_are_pending_) { 547 should_notify_client_if_no_tasks_required_for_activation_are_pending_) {
572 new_raster_required_for_activation_finished_task = 548 new_raster_required_for_activation_finished_task =
573 CreateRasterRequiredForActivationFinishedTask( 549 CreateRasterRequiredForActivationFinishedTask(
574 raster_tasks_required_for_activation_.size()); 550 raster_tasks_required_for_activation_.size());
575 raster_required_for_activation_finished_task_pending_ = true; 551 raster_required_for_activation_finished_task_pending_ = true;
576 internal::GraphNode* raster_required_for_activation_finished_node = 552 InsertNodeForTask(&graph,
577 CreateGraphNodeForTask( 553 new_raster_required_for_activation_finished_task.get(),
578 new_raster_required_for_activation_finished_task.get(), 554 kRasterRequiredForActivationFinishedTaskPriority,
579 0u, // Priority 0 555 scheduled_raster_task_required_for_activation_count);
580 &graph); 556 for (WorkerPoolTaskVector::ContainerType::const_iterator it =
581 AddDependenciesToGraphNode(raster_required_for_activation_finished_node, 557 tasks_required_for_activation.container().begin();
582 tasks[REQUIRED_FOR_ACTIVATION_TYPE].container()); 558 it != tasks_required_for_activation.container().end();
559 ++it) {
560 graph.edges.push_back(internal::TaskGraph::Edge(
561 *it, new_raster_required_for_activation_finished_task.get()));
562 }
583 } 563 }
584 564
585 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task; 565 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task;
586 566
587 size_t scheduled_raster_task_count = 567 size_t scheduled_raster_task_count = tasks.container().size();
588 tasks[PREPAINT_TYPE].container().size() +
589 tasks[REQUIRED_FOR_ACTIVATION_TYPE].container().size();
590 DCHECK_LE(scheduled_raster_task_count, PendingRasterTaskCount()); 568 DCHECK_LE(scheduled_raster_task_count, PendingRasterTaskCount());
591 // Schedule OnRasterTasksFinished call only when notification is pending 569 // Schedule OnRasterTasksFinished call only when notification is pending
592 // and throttling is not preventing all pending tasks from being scheduled. 570 // and throttling is not preventing all pending tasks from being scheduled.
593 if (!did_throttle_raster_tasks && 571 if (!did_throttle_raster_tasks &&
594 should_notify_client_if_no_tasks_are_pending_) { 572 should_notify_client_if_no_tasks_are_pending_) {
595 new_raster_finished_task = CreateRasterFinishedTask(); 573 new_raster_finished_task = CreateRasterFinishedTask();
596 raster_finished_task_pending_ = true; 574 raster_finished_task_pending_ = true;
597 internal::GraphNode* raster_finished_node = 575 InsertNodeForTask(&graph,
598 CreateGraphNodeForTask(new_raster_finished_task.get(), 576 new_raster_finished_task.get(),
599 1u, // Priority 1 577 kRasterFinishedTaskPriority,
600 &graph); 578 scheduled_raster_task_count);
601 for (unsigned type = 0; type < NUM_TYPES; ++type) { 579 for (WorkerPoolTaskVector::ContainerType::const_iterator it =
602 AddDependenciesToGraphNode(raster_finished_node, tasks[type].container()); 580 tasks.container().begin();
581 it != tasks.container().end();
582 ++it) {
583 graph.edges.push_back(
584 internal::TaskGraph::Edge(*it, new_raster_finished_task.get()));
603 } 585 }
604 } 586 }
605 587
606 SetTaskGraph(&graph); 588 SetTaskGraph(&graph);
607 589
608 scheduled_raster_task_count_ = scheduled_raster_task_count; 590 scheduled_raster_task_count_ = scheduled_raster_task_count;
609 591
610 set_raster_finished_task(new_raster_finished_task); 592 set_raster_finished_task(new_raster_finished_task);
611 set_raster_required_for_activation_finished_task( 593 set_raster_required_for_activation_finished_task(
612 new_raster_required_for_activation_finished_task); 594 new_raster_required_for_activation_finished_task);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 656
675 throttle_state->SetInteger("bytes_available_for_upload", 657 throttle_state->SetInteger("bytes_available_for_upload",
676 max_bytes_pending_upload_ - bytes_pending_upload_); 658 max_bytes_pending_upload_ - bytes_pending_upload_);
677 throttle_state->SetInteger("bytes_pending_upload", bytes_pending_upload_); 659 throttle_state->SetInteger("bytes_pending_upload", bytes_pending_upload_);
678 throttle_state->SetInteger("scheduled_raster_task_count", 660 throttle_state->SetInteger("scheduled_raster_task_count",
679 scheduled_raster_task_count_); 661 scheduled_raster_task_count_);
680 return throttle_state.PassAs<base::Value>(); 662 return throttle_state.PassAs<base::Value>();
681 } 663 }
682 664
683 } // namespace cc 665 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/image_raster_worker_pool.cc ('k') | cc/resources/raster_worker_pool.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698