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

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

Issue 144463012: cc: Reuse the same TaskGraph and completed tasks vector. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: update comments 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/pixel_buffer_raster_worker_pool.h ('k') | no next file » | 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"
(...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 } 516 }
517 } 517 }
518 518
519 void PixelBufferRasterWorkerPool::ScheduleMoreTasks() { 519 void PixelBufferRasterWorkerPool::ScheduleMoreTasks() {
520 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks"); 520 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks");
521 521
522 WorkerPoolTaskVector tasks; 522 WorkerPoolTaskVector tasks;
523 WorkerPoolTaskVector tasks_required_for_activation; 523 WorkerPoolTaskVector tasks_required_for_activation;
524 524
525 unsigned priority = kRasterTaskPriorityBase; 525 unsigned priority = kRasterTaskPriorityBase;
526 internal::TaskGraph graph; 526
527 graph_.Reset();
527 528
528 size_t bytes_pending_upload = bytes_pending_upload_; 529 size_t bytes_pending_upload = bytes_pending_upload_;
529 bool did_throttle_raster_tasks = false; 530 bool did_throttle_raster_tasks = false;
530 531
531 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); 532 for (RasterTaskVector::const_iterator it = raster_tasks().begin();
532 it != raster_tasks().end(); 533 it != raster_tasks().end();
533 ++it) { 534 ++it) {
534 internal::RasterWorkerPoolTask* task = it->get(); 535 internal::RasterWorkerPoolTask* task = it->get();
535 536
536 // |raster_task_states_| contains the state of all tasks that we have not 537 // |raster_task_states_| contains the state of all tasks that we have not
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 break; 569 break;
569 } 570 }
570 571
571 // Update |bytes_pending_upload| now that task has cleared all 572 // Update |bytes_pending_upload| now that task has cleared all
572 // throttling limits. 573 // throttling limits.
573 bytes_pending_upload = new_bytes_pending_upload; 574 bytes_pending_upload = new_bytes_pending_upload;
574 575
575 DCHECK(state_it->second == UNSCHEDULED || state_it->second == SCHEDULED); 576 DCHECK(state_it->second == UNSCHEDULED || state_it->second == SCHEDULED);
576 state_it->second = SCHEDULED; 577 state_it->second = SCHEDULED;
577 578
578 InsertNodeForRasterTask(&graph, task, task->dependencies(), priority++); 579 InsertNodeForRasterTask(&graph_, task, task->dependencies(), priority++);
579 580
580 tasks.container().push_back(task); 581 tasks.container().push_back(task);
581 if (IsRasterTaskRequiredForActivation(task)) 582 if (IsRasterTaskRequiredForActivation(task))
582 tasks_required_for_activation.container().push_back(task); 583 tasks_required_for_activation.container().push_back(task);
583 } 584 }
584 585
585 scoped_refptr<internal::WorkerPoolTask> 586 scoped_refptr<internal::WorkerPoolTask>
586 new_raster_required_for_activation_finished_task; 587 new_raster_required_for_activation_finished_task;
587 588
588 size_t scheduled_raster_task_required_for_activation_count = 589 size_t scheduled_raster_task_required_for_activation_count =
589 tasks_required_for_activation.container().size(); 590 tasks_required_for_activation.container().size();
590 DCHECK_LE(scheduled_raster_task_required_for_activation_count, 591 DCHECK_LE(scheduled_raster_task_required_for_activation_count,
591 raster_tasks_required_for_activation_.size()); 592 raster_tasks_required_for_activation_.size());
592 // Schedule OnRasterTasksRequiredForActivationFinished call only when 593 // Schedule OnRasterTasksRequiredForActivationFinished call only when
593 // notification is pending and throttling is not preventing all pending 594 // notification is pending and throttling is not preventing all pending
594 // tasks required for activation from being scheduled. 595 // tasks required for activation from being scheduled.
595 if (scheduled_raster_task_required_for_activation_count == 596 if (scheduled_raster_task_required_for_activation_count ==
596 raster_tasks_required_for_activation_.size() && 597 raster_tasks_required_for_activation_.size() &&
597 should_notify_client_if_no_tasks_required_for_activation_are_pending_) { 598 should_notify_client_if_no_tasks_required_for_activation_are_pending_) {
598 new_raster_required_for_activation_finished_task = 599 new_raster_required_for_activation_finished_task =
599 CreateRasterRequiredForActivationFinishedTask( 600 CreateRasterRequiredForActivationFinishedTask(
600 raster_tasks_required_for_activation_.size()); 601 raster_tasks_required_for_activation_.size());
601 raster_required_for_activation_finished_task_pending_ = true; 602 raster_required_for_activation_finished_task_pending_ = true;
602 InsertNodeForTask(&graph, 603 InsertNodeForTask(&graph_,
603 new_raster_required_for_activation_finished_task.get(), 604 new_raster_required_for_activation_finished_task.get(),
604 kRasterRequiredForActivationFinishedTaskPriority, 605 kRasterRequiredForActivationFinishedTaskPriority,
605 scheduled_raster_task_required_for_activation_count); 606 scheduled_raster_task_required_for_activation_count);
606 for (WorkerPoolTaskVector::ContainerType::const_iterator it = 607 for (WorkerPoolTaskVector::ContainerType::const_iterator it =
607 tasks_required_for_activation.container().begin(); 608 tasks_required_for_activation.container().begin();
608 it != tasks_required_for_activation.container().end(); 609 it != tasks_required_for_activation.container().end();
609 ++it) { 610 ++it) {
610 graph.edges.push_back(internal::TaskGraph::Edge( 611 graph_.edges.push_back(internal::TaskGraph::Edge(
611 *it, new_raster_required_for_activation_finished_task.get())); 612 *it, new_raster_required_for_activation_finished_task.get()));
612 } 613 }
613 } 614 }
614 615
615 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task; 616 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task;
616 617
617 size_t scheduled_raster_task_count = tasks.container().size(); 618 size_t scheduled_raster_task_count = tasks.container().size();
618 DCHECK_LE(scheduled_raster_task_count, PendingRasterTaskCount()); 619 DCHECK_LE(scheduled_raster_task_count, PendingRasterTaskCount());
619 // Schedule OnRasterTasksFinished call only when notification is pending 620 // Schedule OnRasterTasksFinished call only when notification is pending
620 // and throttling is not preventing all pending tasks from being scheduled. 621 // and throttling is not preventing all pending tasks from being scheduled.
621 if (!did_throttle_raster_tasks && 622 if (!did_throttle_raster_tasks &&
622 should_notify_client_if_no_tasks_are_pending_) { 623 should_notify_client_if_no_tasks_are_pending_) {
623 new_raster_finished_task = CreateRasterFinishedTask(); 624 new_raster_finished_task = CreateRasterFinishedTask();
624 raster_finished_task_pending_ = true; 625 raster_finished_task_pending_ = true;
625 InsertNodeForTask(&graph, 626 InsertNodeForTask(&graph_,
626 new_raster_finished_task.get(), 627 new_raster_finished_task.get(),
627 kRasterFinishedTaskPriority, 628 kRasterFinishedTaskPriority,
628 scheduled_raster_task_count); 629 scheduled_raster_task_count);
629 for (WorkerPoolTaskVector::ContainerType::const_iterator it = 630 for (WorkerPoolTaskVector::ContainerType::const_iterator it =
630 tasks.container().begin(); 631 tasks.container().begin();
631 it != tasks.container().end(); 632 it != tasks.container().end();
632 ++it) { 633 ++it) {
633 graph.edges.push_back( 634 graph_.edges.push_back(
634 internal::TaskGraph::Edge(*it, new_raster_finished_task.get())); 635 internal::TaskGraph::Edge(*it, new_raster_finished_task.get()));
635 } 636 }
636 } 637 }
637 638
638 SetTaskGraph(&graph); 639 SetTaskGraph(&graph_);
639 640
640 scheduled_raster_task_count_ = scheduled_raster_task_count; 641 scheduled_raster_task_count_ = scheduled_raster_task_count;
641 642
642 set_raster_finished_task(new_raster_finished_task); 643 set_raster_finished_task(new_raster_finished_task);
643 set_raster_required_for_activation_finished_task( 644 set_raster_required_for_activation_finished_task(
644 new_raster_required_for_activation_finished_task); 645 new_raster_required_for_activation_finished_task);
645 } 646 }
646 647
647 unsigned PixelBufferRasterWorkerPool::PendingRasterTaskCount() const { 648 unsigned PixelBufferRasterWorkerPool::PendingRasterTaskCount() const {
648 unsigned num_completed_raster_tasks = 649 unsigned num_completed_raster_tasks =
(...skipping 15 matching lines...) Expand all
664 return "rasterizing"; 665 return "rasterizing";
665 if (PendingRasterTaskCount()) 666 if (PendingRasterTaskCount())
666 return "throttled"; 667 return "throttled";
667 if (!raster_tasks_with_pending_upload_.empty()) 668 if (!raster_tasks_with_pending_upload_.empty())
668 return "waiting_for_uploads"; 669 return "waiting_for_uploads";
669 670
670 return "finishing"; 671 return "finishing";
671 } 672 }
672 673
673 void PixelBufferRasterWorkerPool::CheckForCompletedWorkerPoolTasks() { 674 void PixelBufferRasterWorkerPool::CheckForCompletedWorkerPoolTasks() {
674 internal::Task::Vector completed_tasks; 675 CollectCompletedWorkerPoolTasks(&completed_tasks_);
675 CollectCompletedWorkerPoolTasks(&completed_tasks); 676 for (internal::Task::Vector::const_iterator it = completed_tasks_.begin();
676 677 it != completed_tasks_.end();
677 for (internal::Task::Vector::const_iterator it = completed_tasks.begin();
678 it != completed_tasks.end();
679 ++it) { 678 ++it) {
680 internal::WorkerPoolTask* task = 679 internal::WorkerPoolTask* task =
681 static_cast<internal::WorkerPoolTask*>(it->get()); 680 static_cast<internal::WorkerPoolTask*>(it->get());
682 681
683 task->WillComplete(); 682 task->WillComplete();
684 task->CompleteOnOriginThread(this); 683 task->CompleteOnOriginThread(this);
685 task->DidComplete(); 684 task->DidComplete();
686 } 685 }
686 completed_tasks_.clear();
687 } 687 }
688 688
689 scoped_ptr<base::Value> PixelBufferRasterWorkerPool::StateAsValue() const { 689 scoped_ptr<base::Value> PixelBufferRasterWorkerPool::StateAsValue() const {
690 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue); 690 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue);
691 691
692 state->SetInteger("completed_count", completed_raster_tasks_.size()); 692 state->SetInteger("completed_count", completed_raster_tasks_.size());
693 state->SetInteger("pending_count", raster_task_states_.size()); 693 state->SetInteger("pending_count", raster_task_states_.size());
694 state->SetInteger("pending_upload_count", 694 state->SetInteger("pending_upload_count",
695 raster_tasks_with_pending_upload_.size()); 695 raster_tasks_with_pending_upload_.size());
696 state->SetInteger("required_for_activation_count", 696 state->SetInteger("required_for_activation_count",
697 raster_tasks_required_for_activation_.size()); 697 raster_tasks_required_for_activation_.size());
698 state->Set("scheduled_state", ScheduledStateAsValue().release()); 698 state->Set("scheduled_state", ScheduledStateAsValue().release());
699 state->Set("throttle_state", ThrottleStateAsValue().release()); 699 state->Set("throttle_state", ThrottleStateAsValue().release());
700 return state.PassAs<base::Value>(); 700 return state.PassAs<base::Value>();
701 } 701 }
702 702
703 scoped_ptr<base::Value> PixelBufferRasterWorkerPool::ThrottleStateAsValue() 703 scoped_ptr<base::Value> PixelBufferRasterWorkerPool::ThrottleStateAsValue()
704 const { 704 const {
705 scoped_ptr<base::DictionaryValue> throttle_state(new base::DictionaryValue); 705 scoped_ptr<base::DictionaryValue> throttle_state(new base::DictionaryValue);
706 706
707 throttle_state->SetInteger("bytes_available_for_upload", 707 throttle_state->SetInteger("bytes_available_for_upload",
708 max_bytes_pending_upload_ - bytes_pending_upload_); 708 max_bytes_pending_upload_ - bytes_pending_upload_);
709 throttle_state->SetInteger("bytes_pending_upload", bytes_pending_upload_); 709 throttle_state->SetInteger("bytes_pending_upload", bytes_pending_upload_);
710 throttle_state->SetInteger("scheduled_raster_task_count", 710 throttle_state->SetInteger("scheduled_raster_task_count",
711 scheduled_raster_task_count_); 711 scheduled_raster_task_count_);
712 return throttle_state.PassAs<base::Value>(); 712 return throttle_state.PassAs<base::Value>();
713 } 713 }
714 714
715 } // namespace cc 715 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/pixel_buffer_raster_worker_pool.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698