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 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 state_machine_.SetNeedsRedraw(); | 122 state_machine_.SetNeedsRedraw(); |
123 ProcessScheduledActions(); | 123 ProcessScheduledActions(); |
124 } | 124 } |
125 | 125 |
126 void Scheduler::SetNeedsPrepareTiles() { | 126 void Scheduler::SetNeedsPrepareTiles() { |
127 DCHECK(!IsInsideAction(SchedulerStateMachine::ACTION_PREPARE_TILES)); | 127 DCHECK(!IsInsideAction(SchedulerStateMachine::ACTION_PREPARE_TILES)); |
128 state_machine_.SetNeedsPrepareTiles(); | 128 state_machine_.SetNeedsPrepareTiles(); |
129 ProcessScheduledActions(); | 129 ProcessScheduledActions(); |
130 } | 130 } |
131 | 131 |
132 void Scheduler::DidSwapBuffers() { | 132 void Scheduler::DidSubmitCompositorFrame() { |
133 compositor_timing_history_->DidSwapBuffers(); | 133 compositor_timing_history_->DidSubmitCompositorFrame(); |
134 state_machine_.DidSwapBuffers(); | 134 state_machine_.DidSubmitCompositorFrame(); |
135 | 135 |
136 // There is no need to call ProcessScheduledActions here because | 136 // There is no need to call ProcessScheduledActions here because |
137 // swapping should not trigger any new actions. | 137 // submitting a CompositorFrame should not trigger any new actions. |
138 if (!inside_process_scheduled_actions_) { | 138 if (!inside_process_scheduled_actions_) { |
139 DCHECK_EQ(state_machine_.NextAction(), SchedulerStateMachine::ACTION_NONE); | 139 DCHECK_EQ(state_machine_.NextAction(), SchedulerStateMachine::ACTION_NONE); |
140 } | 140 } |
141 } | 141 } |
142 | 142 |
143 void Scheduler::DidSwapBuffersComplete() { | 143 void Scheduler::DidReceiveCompositorFrameAck() { |
144 DCHECK_GT(state_machine_.pending_swaps(), 0) << AsValue()->ToString(); | 144 DCHECK_GT(state_machine_.pending_submit_frames(), 0) << AsValue()->ToString(); |
145 compositor_timing_history_->DidSwapBuffersComplete(); | 145 compositor_timing_history_->DidReceiveCompositorFrameAck(); |
146 state_machine_.DidSwapBuffersComplete(); | 146 state_machine_.DidReceiveCompositorFrameAck(); |
147 ProcessScheduledActions(); | 147 ProcessScheduledActions(); |
148 } | 148 } |
149 | 149 |
150 void Scheduler::SetTreePrioritiesAndScrollState( | 150 void Scheduler::SetTreePrioritiesAndScrollState( |
151 TreePriority tree_priority, | 151 TreePriority tree_priority, |
152 ScrollHandlerState scroll_handler_state) { | 152 ScrollHandlerState scroll_handler_state) { |
153 state_machine_.SetTreePrioritiesAndScrollState(tree_priority, | 153 state_machine_.SetTreePrioritiesAndScrollState(tree_priority, |
154 scroll_handler_state); | 154 scroll_handler_state); |
155 ProcessScheduledActions(); | 155 ProcessScheduledActions(); |
156 } | 156 } |
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 // order to wait for more user-input before starting the next commit. | 518 // order to wait for more user-input before starting the next commit. |
519 // * Creating a new OuputSurface will not occur during the deadline in | 519 // * Creating a new OuputSurface will not occur during the deadline in |
520 // order to allow the state machine to "settle" first. | 520 // order to allow the state machine to "settle" first. |
521 compositor_timing_history_->WillFinishImplFrame( | 521 compositor_timing_history_->WillFinishImplFrame( |
522 state_machine_.needs_redraw()); | 522 state_machine_.needs_redraw()); |
523 state_machine_.OnBeginImplFrameDeadline(); | 523 state_machine_.OnBeginImplFrameDeadline(); |
524 ProcessScheduledActions(); | 524 ProcessScheduledActions(); |
525 FinishImplFrame(); | 525 FinishImplFrame(); |
526 } | 526 } |
527 | 527 |
528 void Scheduler::DrawAndSwapIfPossible() { | 528 void Scheduler::DrawIfPossible() { |
529 bool drawing_with_new_active_tree = | 529 bool drawing_with_new_active_tree = |
530 state_machine_.active_tree_needs_first_draw(); | 530 state_machine_.active_tree_needs_first_draw(); |
531 bool main_thread_missed_last_deadline = | 531 bool main_thread_missed_last_deadline = |
532 state_machine_.main_thread_missed_last_deadline(); | 532 state_machine_.main_thread_missed_last_deadline(); |
533 compositor_timing_history_->WillDraw(); | 533 compositor_timing_history_->WillDraw(); |
534 state_machine_.WillDraw(); | 534 state_machine_.WillDraw(); |
535 DrawResult result = client_->ScheduledActionDrawAndSwapIfPossible(); | 535 DrawResult result = client_->ScheduledActionDrawIfPossible(); |
536 state_machine_.DidDraw(result); | 536 state_machine_.DidDraw(result); |
537 compositor_timing_history_->DidDraw( | 537 compositor_timing_history_->DidDraw( |
538 drawing_with_new_active_tree, main_thread_missed_last_deadline, | 538 drawing_with_new_active_tree, main_thread_missed_last_deadline, |
539 begin_impl_frame_tracker_.DangerousMethodCurrentOrLast().frame_time); | 539 begin_impl_frame_tracker_.DangerousMethodCurrentOrLast().frame_time); |
540 } | 540 } |
541 | 541 |
542 void Scheduler::DrawAndSwapForced() { | 542 void Scheduler::DrawForced() { |
543 bool drawing_with_new_active_tree = | 543 bool drawing_with_new_active_tree = |
544 state_machine_.active_tree_needs_first_draw(); | 544 state_machine_.active_tree_needs_first_draw(); |
545 bool main_thread_missed_last_deadline = | 545 bool main_thread_missed_last_deadline = |
546 state_machine_.main_thread_missed_last_deadline(); | 546 state_machine_.main_thread_missed_last_deadline(); |
547 compositor_timing_history_->WillDraw(); | 547 compositor_timing_history_->WillDraw(); |
548 state_machine_.WillDraw(); | 548 state_machine_.WillDraw(); |
549 DrawResult result = client_->ScheduledActionDrawAndSwapForced(); | 549 DrawResult result = client_->ScheduledActionDrawForced(); |
550 state_machine_.DidDraw(result); | 550 state_machine_.DidDraw(result); |
551 compositor_timing_history_->DidDraw( | 551 compositor_timing_history_->DidDraw( |
552 drawing_with_new_active_tree, main_thread_missed_last_deadline, | 552 drawing_with_new_active_tree, main_thread_missed_last_deadline, |
553 begin_impl_frame_tracker_.DangerousMethodCurrentOrLast().frame_time); | 553 begin_impl_frame_tracker_.DangerousMethodCurrentOrLast().frame_time); |
554 } | 554 } |
555 | 555 |
556 void Scheduler::SetDeferCommits(bool defer_commits) { | 556 void Scheduler::SetDeferCommits(bool defer_commits) { |
557 TRACE_EVENT1("cc", "Scheduler::SetDeferCommits", "defer_commits", | 557 TRACE_EVENT1("cc", "Scheduler::SetDeferCommits", "defer_commits", |
558 defer_commits); | 558 defer_commits); |
559 state_machine_.SetDeferCommits(defer_commits); | 559 state_machine_.SetDeferCommits(defer_commits); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
595 state_machine_.WillCommit(commit_has_no_updates); | 595 state_machine_.WillCommit(commit_has_no_updates); |
596 client_->ScheduledActionCommit(); | 596 client_->ScheduledActionCommit(); |
597 break; | 597 break; |
598 } | 598 } |
599 case SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE: | 599 case SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE: |
600 compositor_timing_history_->WillActivate(); | 600 compositor_timing_history_->WillActivate(); |
601 state_machine_.WillActivate(); | 601 state_machine_.WillActivate(); |
602 client_->ScheduledActionActivateSyncTree(); | 602 client_->ScheduledActionActivateSyncTree(); |
603 compositor_timing_history_->DidActivate(); | 603 compositor_timing_history_->DidActivate(); |
604 break; | 604 break; |
605 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE: | 605 case SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE: |
606 DrawAndSwapIfPossible(); | 606 DrawIfPossible(); |
607 break; | 607 break; |
608 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED: | 608 case SchedulerStateMachine::ACTION_DRAW_FORCED: |
609 DrawAndSwapForced(); | 609 DrawForced(); |
610 break; | 610 break; |
611 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT: { | 611 case SchedulerStateMachine::ACTION_DRAW_ABORT: { |
612 // No action is actually performed, but this allows the state machine to | 612 // No action is actually performed, but this allows the state machine to |
613 // drain the pipeline without actually drawing. | 613 // drain the pipeline without actually drawing. |
614 state_machine_.AbortDrawAndSwap(); | 614 state_machine_.AbortDraw(); |
615 compositor_timing_history_->DrawAborted(); | 615 compositor_timing_history_->DrawAborted(); |
616 break; | 616 break; |
617 } | 617 } |
618 case SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION: | 618 case SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION: |
619 state_machine_.WillBeginCompositorFrameSinkCreation(); | 619 state_machine_.WillBeginCompositorFrameSinkCreation(); |
620 client_->ScheduledActionBeginCompositorFrameSinkCreation(); | 620 client_->ScheduledActionBeginCompositorFrameSinkCreation(); |
621 break; | 621 break; |
622 case SchedulerStateMachine::ACTION_PREPARE_TILES: | 622 case SchedulerStateMachine::ACTION_PREPARE_TILES: |
623 state_machine_.WillPrepareTiles(); | 623 state_machine_.WillPrepareTiles(); |
624 client_->ScheduledActionPrepareTiles(); | 624 client_->ScheduledActionPrepareTiles(); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
706 return false; | 706 return false; |
707 | 707 |
708 // Disable impl thread latency recovery when using the unthrottled | 708 // Disable impl thread latency recovery when using the unthrottled |
709 // begin frame source since we will always get a BeginFrame before | 709 // begin frame source since we will always get a BeginFrame before |
710 // the swap ack and our heuristics below will not work. | 710 // the swap ack and our heuristics below will not work. |
711 if (begin_frame_source_ && !begin_frame_source_->IsThrottled()) | 711 if (begin_frame_source_ && !begin_frame_source_->IsThrottled()) |
712 return false; | 712 return false; |
713 | 713 |
714 // If we are swap throttled at the BeginFrame, that means the impl thread is | 714 // If we are swap throttled at the BeginFrame, that means the impl thread is |
715 // very likely in a high latency mode. | 715 // very likely in a high latency mode. |
716 bool impl_thread_is_likely_high_latency = state_machine_.SwapThrottled(); | 716 bool impl_thread_is_likely_high_latency = state_machine_.IsDrawThrottled(); |
717 if (!impl_thread_is_likely_high_latency) | 717 if (!impl_thread_is_likely_high_latency) |
718 return false; | 718 return false; |
719 | 719 |
720 // The deadline may be in the past if our draw time is too long. | 720 // The deadline may be in the past if our draw time is too long. |
721 bool can_draw_before_deadline = args.frame_time < args.deadline; | 721 bool can_draw_before_deadline = args.frame_time < args.deadline; |
722 | 722 |
723 // When prioritizing impl thread latency, the deadline doesn't wait | 723 // When prioritizing impl thread latency, the deadline doesn't wait |
724 // for the main thread. | 724 // for the main thread. |
725 if (state_machine_.ImplLatencyTakesPriority()) | 725 if (state_machine_.ImplLatencyTakesPriority()) |
726 return can_draw_before_deadline; | 726 return can_draw_before_deadline; |
(...skipping 22 matching lines...) Expand all Loading... |
749 } | 749 } |
750 | 750 |
751 bool Scheduler::IsBeginMainFrameSentOrStarted() const { | 751 bool Scheduler::IsBeginMainFrameSentOrStarted() const { |
752 return (state_machine_.begin_main_frame_state() == | 752 return (state_machine_.begin_main_frame_state() == |
753 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT || | 753 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT || |
754 state_machine_.begin_main_frame_state() == | 754 state_machine_.begin_main_frame_state() == |
755 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_STARTED); | 755 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_STARTED); |
756 } | 756 } |
757 | 757 |
758 } // namespace cc | 758 } // namespace cc |
OLD | NEW |