Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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/scheduler/scheduler.h" | 5 #include "cc/scheduler/scheduler.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 57 BackToBackBeginFrameSource::Create(scheduler->task_runner_.get()); | 57 BackToBackBeginFrameSource::Create(scheduler->task_runner_.get()); |
| 58 return scheduler->unthrottled_frame_source_internal_.get(); | 58 return scheduler->unthrottled_frame_source_internal_.get(); |
| 59 } | 59 } |
| 60 | 60 |
| 61 Scheduler::Scheduler( | 61 Scheduler::Scheduler( |
| 62 SchedulerClient* client, | 62 SchedulerClient* client, |
| 63 const SchedulerSettings& scheduler_settings, | 63 const SchedulerSettings& scheduler_settings, |
| 64 int layer_tree_host_id, | 64 int layer_tree_host_id, |
| 65 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 65 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
| 66 scoped_ptr<BeginFrameSource> external_begin_frame_source, | 66 scoped_ptr<BeginFrameSource> external_begin_frame_source, |
| 67 RenderingStatsInstrumentation* rendering_stats_instrumentation, | |
|
sunnyps
2015/06/23 18:11:02
The Scheduler could take in a CompositorTimingHist
brianderson
2015/06/23 20:23:27
I kept this constructor and Scheduler::Create the
| |
| 67 SchedulerFrameSourcesConstructor* frame_sources_constructor) | 68 SchedulerFrameSourcesConstructor* frame_sources_constructor) |
| 68 : frame_source_(), | 69 : frame_source_(), |
| 69 primary_frame_source_(NULL), | 70 primary_frame_source_(NULL), |
| 70 primary_frame_source_internal_(external_begin_frame_source.Pass()), | 71 primary_frame_source_internal_(external_begin_frame_source.Pass()), |
| 71 vsync_observer_(NULL), | 72 vsync_observer_(NULL), |
| 72 authoritative_vsync_interval_(base::TimeDelta()), | 73 authoritative_vsync_interval_(base::TimeDelta()), |
| 73 last_vsync_timebase_(base::TimeTicks()), | 74 last_vsync_timebase_(base::TimeTicks()), |
| 74 throttle_frame_production_(false), | 75 throttle_frame_production_(false), |
| 75 settings_(scheduler_settings), | 76 settings_(scheduler_settings), |
| 76 client_(client), | 77 client_(client), |
| 77 layer_tree_host_id_(layer_tree_host_id), | 78 layer_tree_host_id_(layer_tree_host_id), |
| 78 task_runner_(task_runner), | 79 task_runner_(task_runner), |
| 80 compositor_timing_history_(rendering_stats_instrumentation), | |
| 79 begin_impl_frame_deadline_mode_( | 81 begin_impl_frame_deadline_mode_( |
| 80 SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_NONE), | 82 SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_NONE), |
| 81 begin_impl_frame_tracker_(BEGINFRAMETRACKER_FROM_HERE), | 83 begin_impl_frame_tracker_(BEGINFRAMETRACKER_FROM_HERE), |
| 82 state_machine_(scheduler_settings), | 84 state_machine_(scheduler_settings), |
| 83 inside_process_scheduled_actions_(false), | 85 inside_process_scheduled_actions_(false), |
| 84 inside_action_(SchedulerStateMachine::ACTION_NONE), | 86 inside_action_(SchedulerStateMachine::ACTION_NONE), |
| 85 weak_factory_(this) { | 87 weak_factory_(this) { |
| 86 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"), | 88 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"), |
| 87 "Scheduler::Scheduler", | 89 "Scheduler::Scheduler", |
| 88 "settings", | 90 "settings", |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 122 | 124 |
| 123 base::TimeTicks Scheduler::Now() const { | 125 base::TimeTicks Scheduler::Now() const { |
| 124 base::TimeTicks now = base::TimeTicks::Now(); | 126 base::TimeTicks now = base::TimeTicks::Now(); |
| 125 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.now"), | 127 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.now"), |
| 126 "Scheduler::Now", | 128 "Scheduler::Now", |
| 127 "now", | 129 "now", |
| 128 now); | 130 now); |
| 129 return now; | 131 return now; |
| 130 } | 132 } |
| 131 | 133 |
| 134 base::TimeDelta Scheduler::DrawDurationEstimate() const { | |
| 135 return compositor_timing_history_.DrawDurationEstimate(); | |
| 136 } | |
| 137 | |
| 138 base::TimeDelta Scheduler::BeginMainFrameToCommitDurationEstimate() const { | |
| 139 return compositor_timing_history_.BeginMainFrameToCommitDurationEstimate(); | |
| 140 } | |
| 141 | |
| 142 base::TimeDelta Scheduler::CommitToActivateDurationEstimate() const { | |
| 143 return compositor_timing_history_.CommitToActivateDurationEstimate(); | |
| 144 } | |
| 145 | |
| 132 void Scheduler::CommitVSyncParameters(base::TimeTicks timebase, | 146 void Scheduler::CommitVSyncParameters(base::TimeTicks timebase, |
| 133 base::TimeDelta interval) { | 147 base::TimeDelta interval) { |
| 134 if (authoritative_vsync_interval_ != base::TimeDelta()) { | 148 if (authoritative_vsync_interval_ != base::TimeDelta()) { |
| 135 interval = authoritative_vsync_interval_; | 149 interval = authoritative_vsync_interval_; |
| 136 } else if (interval == base::TimeDelta()) { | 150 } else if (interval == base::TimeDelta()) { |
| 137 // TODO(brianderson): We should not be receiving 0 intervals. | 151 // TODO(brianderson): We should not be receiving 0 intervals. |
| 138 interval = BeginFrameArgs::DefaultInterval(); | 152 interval = BeginFrameArgs::DefaultInterval(); |
| 139 } | 153 } |
| 140 | 154 |
| 141 last_vsync_timebase_ = timebase; | 155 last_vsync_timebase_ = timebase; |
| (...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 488 state_machine_.MainThreadIsInHighLatencyMode(); | 502 state_machine_.MainThreadIsInHighLatencyMode(); |
| 489 TRACE_EVENT2("cc,benchmark", "Scheduler::BeginImplFrame", "args", | 503 TRACE_EVENT2("cc,benchmark", "Scheduler::BeginImplFrame", "args", |
| 490 args.AsValue(), "main_thread_is_high_latency", | 504 args.AsValue(), "main_thread_is_high_latency", |
| 491 main_thread_is_in_high_latency_mode); | 505 main_thread_is_in_high_latency_mode); |
| 492 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"), | 506 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"), |
| 493 "MainThreadLatency", main_thread_is_in_high_latency_mode); | 507 "MainThreadLatency", main_thread_is_in_high_latency_mode); |
| 494 | 508 |
| 495 advance_commit_state_task_.Cancel(); | 509 advance_commit_state_task_.Cancel(); |
| 496 | 510 |
| 497 BeginFrameArgs adjusted_args = args; | 511 BeginFrameArgs adjusted_args = args; |
| 498 adjusted_args.deadline -= client_->DrawDurationEstimate(); | 512 adjusted_args.deadline -= DrawDurationEstimate(); |
| 499 | 513 |
| 500 if (!state_machine_.impl_latency_takes_priority() && | 514 if (!state_machine_.impl_latency_takes_priority() && |
| 501 main_thread_is_in_high_latency_mode && | 515 main_thread_is_in_high_latency_mode && |
| 502 CanCommitAndActivateBeforeDeadline()) { | 516 CanCommitAndActivateBeforeDeadline()) { |
| 503 state_machine_.SetSkipNextBeginMainFrameToReduceLatency(); | 517 state_machine_.SetSkipNextBeginMainFrameToReduceLatency(); |
| 504 } | 518 } |
| 505 | 519 |
| 506 BeginImplFrame(adjusted_args); | 520 BeginImplFrame(adjusted_args); |
| 507 | 521 |
| 508 // The deadline will be scheduled in ProcessScheduledActions. | 522 // The deadline will be scheduled in ProcessScheduledActions. |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 631 } | 645 } |
| 632 | 646 |
| 633 | 647 |
| 634 void Scheduler::PollToAdvanceCommitState() { | 648 void Scheduler::PollToAdvanceCommitState() { |
| 635 TRACE_EVENT0("cc", "Scheduler::PollToAdvanceCommitState"); | 649 TRACE_EVENT0("cc", "Scheduler::PollToAdvanceCommitState"); |
| 636 advance_commit_state_task_.Cancel(); | 650 advance_commit_state_task_.Cancel(); |
| 637 ProcessScheduledActions(); | 651 ProcessScheduledActions(); |
| 638 } | 652 } |
| 639 | 653 |
| 640 void Scheduler::DrawAndSwapIfPossible() { | 654 void Scheduler::DrawAndSwapIfPossible() { |
| 655 compositor_timing_history_.DidStartDrawing(); | |
| 641 DrawResult result = client_->ScheduledActionDrawAndSwapIfPossible(); | 656 DrawResult result = client_->ScheduledActionDrawAndSwapIfPossible(); |
| 642 state_machine_.DidDrawIfPossibleCompleted(result); | 657 state_machine_.DidDrawIfPossibleCompleted(result); |
| 658 compositor_timing_history_.DidFinishDrawing(); | |
| 659 } | |
| 660 | |
| 661 void Scheduler::DrawAndSwapForced() { | |
| 662 compositor_timing_history_.DidStartDrawing(); | |
| 663 client_->ScheduledActionDrawAndSwapForced(); | |
| 664 compositor_timing_history_.DidFinishDrawing(); | |
| 643 } | 665 } |
| 644 | 666 |
| 645 void Scheduler::SetDeferCommits(bool defer_commits) { | 667 void Scheduler::SetDeferCommits(bool defer_commits) { |
| 646 TRACE_EVENT1("cc", "Scheduler::SetDeferCommits", | 668 TRACE_EVENT1("cc", "Scheduler::SetDeferCommits", |
| 647 "defer_commits", | 669 "defer_commits", |
| 648 defer_commits); | 670 defer_commits); |
| 649 state_machine_.SetDeferCommits(defer_commits); | 671 state_machine_.SetDeferCommits(defer_commits); |
| 650 ProcessScheduledActions(); | 672 ProcessScheduledActions(); |
| 651 } | 673 } |
| 652 | 674 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 671 state_machine_.UpdateState(action); | 693 state_machine_.UpdateState(action); |
| 672 base::AutoReset<SchedulerStateMachine::Action> | 694 base::AutoReset<SchedulerStateMachine::Action> |
| 673 mark_inside_action(&inside_action_, action); | 695 mark_inside_action(&inside_action_, action); |
| 674 switch (action) { | 696 switch (action) { |
| 675 case SchedulerStateMachine::ACTION_NONE: | 697 case SchedulerStateMachine::ACTION_NONE: |
| 676 break; | 698 break; |
| 677 case SchedulerStateMachine::ACTION_ANIMATE: | 699 case SchedulerStateMachine::ACTION_ANIMATE: |
| 678 client_->ScheduledActionAnimate(); | 700 client_->ScheduledActionAnimate(); |
| 679 break; | 701 break; |
| 680 case SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME: | 702 case SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME: |
| 703 compositor_timing_history_.WillBeginMainFrame(); | |
| 681 client_->ScheduledActionSendBeginMainFrame(); | 704 client_->ScheduledActionSendBeginMainFrame(); |
| 682 break; | 705 break; |
| 683 case SchedulerStateMachine::ACTION_COMMIT: { | 706 case SchedulerStateMachine::ACTION_COMMIT: { |
| 684 // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is | 707 // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is |
| 685 // fixed. | 708 // fixed. |
| 686 tracked_objects::ScopedTracker tracking_profile4( | 709 tracked_objects::ScopedTracker tracking_profile4( |
| 687 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 710 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 688 "461509 Scheduler::ProcessScheduledActions4")); | 711 "461509 Scheduler::ProcessScheduledActions4")); |
| 689 client_->ScheduledActionCommit(); | 712 client_->ScheduledActionCommit(); |
| 713 compositor_timing_history_.DidCommit(); | |
| 690 break; | 714 break; |
| 691 } | 715 } |
| 692 case SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE: | 716 case SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE: |
| 693 client_->ScheduledActionActivateSyncTree(); | 717 client_->ScheduledActionActivateSyncTree(); |
| 718 compositor_timing_history_.DidActivateSyncTree(); | |
| 694 break; | 719 break; |
| 695 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE: { | 720 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE: { |
| 696 // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is | 721 // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is |
| 697 // fixed. | 722 // fixed. |
| 698 tracked_objects::ScopedTracker tracking_profile6( | 723 tracked_objects::ScopedTracker tracking_profile6( |
| 699 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 724 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 700 "461509 Scheduler::ProcessScheduledActions6")); | 725 "461509 Scheduler::ProcessScheduledActions6")); |
| 701 DrawAndSwapIfPossible(); | 726 DrawAndSwapIfPossible(); |
| 702 break; | 727 break; |
| 703 } | 728 } |
| 704 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED: | 729 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED: |
| 705 client_->ScheduledActionDrawAndSwapForced(); | 730 DrawAndSwapForced(); |
| 706 break; | 731 break; |
| 707 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT: | 732 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT: |
| 708 // No action is actually performed, but this allows the state machine to | 733 // No action is actually performed, but this allows the state machine to |
| 709 // advance out of its waiting to draw state without actually drawing. | 734 // advance out of its waiting to draw state without actually drawing. |
| 710 break; | 735 break; |
| 711 case SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION: | 736 case SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION: |
| 712 client_->ScheduledActionBeginOutputSurfaceCreation(); | 737 client_->ScheduledActionBeginOutputSurfaceCreation(); |
| 713 break; | 738 break; |
| 714 case SchedulerStateMachine::ACTION_PREPARE_TILES: | 739 case SchedulerStateMachine::ACTION_PREPARE_TILES: |
| 715 client_->ScheduledActionPrepareTiles(); | 740 client_->ScheduledActionPrepareTiles(); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 765 !begin_impl_frame_deadline_task_.IsCancelled()); | 790 !begin_impl_frame_deadline_task_.IsCancelled()); |
| 766 state->SetBoolean("advance_commit_state_task", | 791 state->SetBoolean("advance_commit_state_task", |
| 767 !advance_commit_state_task_.IsCancelled()); | 792 !advance_commit_state_task_.IsCancelled()); |
| 768 state->SetString("inside_action", | 793 state->SetString("inside_action", |
| 769 SchedulerStateMachine::ActionToString(inside_action_)); | 794 SchedulerStateMachine::ActionToString(inside_action_)); |
| 770 state->BeginDictionary("begin_impl_frame_args"); | 795 state->BeginDictionary("begin_impl_frame_args"); |
| 771 begin_impl_frame_tracker_.AsValueInto(Now(), state); | 796 begin_impl_frame_tracker_.AsValueInto(Now(), state); |
| 772 state->EndDictionary(); | 797 state->EndDictionary(); |
| 773 state->EndDictionary(); | 798 state->EndDictionary(); |
| 774 | 799 |
| 775 state->BeginDictionary("client_state"); | 800 state->BeginDictionary("compositor_timing_history"); |
| 776 state->SetDouble("draw_duration_estimate_ms", | 801 state->SetDouble("draw_duration_estimate_ms", |
| 777 client_->DrawDurationEstimate().InMillisecondsF()); | 802 DrawDurationEstimate().InMillisecondsF()); |
| 778 state->SetDouble( | 803 state->SetDouble("begin_main_frame_to_commit_duration_estimate_ms", |
| 779 "begin_main_frame_to_commit_duration_estimate_ms", | 804 BeginMainFrameToCommitDurationEstimate().InMillisecondsF()); |
| 780 client_->BeginMainFrameToCommitDurationEstimate().InMillisecondsF()); | 805 state->SetDouble("commit_to_activate_duration_estimate_ms", |
| 781 state->SetDouble( | 806 CommitToActivateDurationEstimate().InMillisecondsF()); |
| 782 "commit_to_activate_duration_estimate_ms", | |
| 783 client_->CommitToActivateDurationEstimate().InMillisecondsF()); | |
| 784 state->EndDictionary(); | 807 state->EndDictionary(); |
| 785 } | 808 } |
| 786 | 809 |
| 787 bool Scheduler::CanCommitAndActivateBeforeDeadline() const { | 810 bool Scheduler::CanCommitAndActivateBeforeDeadline() const { |
| 788 BeginFrameArgs args = | 811 BeginFrameArgs args = |
| 789 begin_impl_frame_tracker_.DangerousMethodCurrentOrLast(); | 812 begin_impl_frame_tracker_.DangerousMethodCurrentOrLast(); |
| 790 | 813 |
| 791 // Check if the main thread computation and commit can be finished before the | 814 // Check if the main thread computation and commit can be finished before the |
| 792 // impl thread's deadline. | 815 // impl thread's deadline. |
| 793 base::TimeTicks estimated_draw_time = | 816 base::TimeTicks estimated_draw_time = |
| 794 args.frame_time + client_->BeginMainFrameToCommitDurationEstimate() + | 817 args.frame_time + BeginMainFrameToCommitDurationEstimate() + |
| 795 client_->CommitToActivateDurationEstimate(); | 818 CommitToActivateDurationEstimate(); |
| 796 | 819 |
| 797 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"), | 820 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"), |
| 798 "CanCommitAndActivateBeforeDeadline", | 821 "CanCommitAndActivateBeforeDeadline", |
| 799 "time_left_after_drawing_ms", | 822 "time_left_after_drawing_ms", |
| 800 (args.deadline - estimated_draw_time).InMillisecondsF(), "state", | 823 (args.deadline - estimated_draw_time).InMillisecondsF(), "state", |
| 801 AsValue()); | 824 AsValue()); |
| 802 | 825 |
| 803 return estimated_draw_time < args.deadline; | 826 return estimated_draw_time < args.deadline; |
| 804 } | 827 } |
| 805 | 828 |
| 806 bool Scheduler::IsBeginMainFrameSentOrStarted() const { | 829 bool Scheduler::IsBeginMainFrameSentOrStarted() const { |
| 807 return (state_machine_.commit_state() == | 830 return (state_machine_.commit_state() == |
| 808 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || | 831 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || |
| 809 state_machine_.commit_state() == | 832 state_machine_.commit_state() == |
| 810 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED); | 833 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED); |
| 811 } | 834 } |
| 812 | 835 |
| 813 } // namespace cc | 836 } // namespace cc |
| OLD | NEW |