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_state_machine.h" | 5 #include "cc/scheduler/scheduler_state_machine.h" |
| 6 | 6 |
| 7 #include "base/format_macros.h" | 7 #include "base/format_macros.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
| 10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 242 state->SetBoolean("main_thread_missed_last_deadline", | 242 state->SetBoolean("main_thread_missed_last_deadline", |
| 243 main_thread_missed_last_deadline_); | 243 main_thread_missed_last_deadline_); |
| 244 state->SetBoolean("skip_next_begin_main_frame_to_reduce_latency", | 244 state->SetBoolean("skip_next_begin_main_frame_to_reduce_latency", |
| 245 skip_next_begin_main_frame_to_reduce_latency_); | 245 skip_next_begin_main_frame_to_reduce_latency_); |
| 246 state->SetBoolean("children_need_begin_frames", children_need_begin_frames_); | 246 state->SetBoolean("children_need_begin_frames", children_need_begin_frames_); |
| 247 state->SetBoolean("video_needs_begin_frames", video_needs_begin_frames_); | 247 state->SetBoolean("video_needs_begin_frames", video_needs_begin_frames_); |
| 248 state->SetBoolean("defer_commits", defer_commits_); | 248 state->SetBoolean("defer_commits", defer_commits_); |
| 249 state->SetBoolean("last_commit_had_no_updates", last_commit_had_no_updates_); | 249 state->SetBoolean("last_commit_had_no_updates", last_commit_had_no_updates_); |
| 250 state->SetBoolean("did_request_swap_in_last_frame", | 250 state->SetBoolean("did_request_swap_in_last_frame", |
| 251 did_request_swap_in_last_frame_); | 251 did_request_swap_in_last_frame_); |
| 252 state->SetBoolean("did_perform_swap_in_last_draw", | 252 state->SetBoolean("did_perform_swap_in_last_draw", |
|
sunnyps
2015/11/24 22:42:44
nit: rename did_perform_swap_in_last_draw to did_s
brianderson
2015/11/24 23:19:38
Renamed to did_swap_in_last_frame to be consistent
| |
| 253 did_perform_swap_in_last_draw_); | 253 did_perform_swap_in_last_draw_); |
| 254 state->EndDictionary(); | 254 state->EndDictionary(); |
| 255 } | 255 } |
| 256 | 256 |
| 257 bool SchedulerStateMachine::PendingDrawsShouldBeAborted() const { | 257 bool SchedulerStateMachine::PendingDrawsShouldBeAborted() const { |
| 258 // Normally when |visible_| is false, pending activations will be forced and | 258 // Normally when |visible_| is false, pending activations will be forced and |
| 259 // draws will be aborted. However, when the embedder is Android WebView, | 259 // draws will be aborted. However, when the embedder is Android WebView, |
| 260 // software draws could be scheduled by the Android OS at any time and draws | 260 // software draws could be scheduled by the Android OS at any time and draws |
| 261 // should not be aborted in this case. | 261 // should not be aborted in this case. |
| 262 bool is_output_surface_lost = (output_surface_state_ == OUTPUT_SURFACE_NONE); | 262 bool is_output_surface_lost = (output_surface_state_ == OUTPUT_SURFACE_NONE); |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 641 | 641 |
| 642 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION) | 642 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION) |
| 643 forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_DRAW; | 643 forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_DRAW; |
| 644 | 644 |
| 645 has_pending_tree_ = false; | 645 has_pending_tree_ = false; |
| 646 pending_tree_is_ready_for_activation_ = false; | 646 pending_tree_is_ready_for_activation_ = false; |
| 647 active_tree_needs_first_draw_ = true; | 647 active_tree_needs_first_draw_ = true; |
| 648 needs_redraw_ = true; | 648 needs_redraw_ = true; |
| 649 } | 649 } |
| 650 | 650 |
| 651 void SchedulerStateMachine::WillDraw(bool did_request_swap) { | 651 void SchedulerStateMachine::WillDraw() { |
| 652 // We need to reset needs_redraw_ before we draw since the | |
| 653 // draw itself might request another draw. | |
| 654 needs_redraw_ = false; | |
| 655 } | |
| 656 | |
| 657 void SchedulerStateMachine::DidDraw(bool did_request_swap, | |
| 658 DrawResult draw_result) { | |
| 659 active_tree_needs_first_draw_ = false; | |
| 660 | |
| 652 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) | 661 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) |
| 653 forced_redraw_state_ = FORCED_REDRAW_STATE_IDLE; | 662 forced_redraw_state_ = FORCED_REDRAW_STATE_IDLE; |
| 654 | 663 |
| 655 if (begin_main_frame_state_ == BEGIN_MAIN_FRAME_STATE_WAITING_FOR_DRAW) | 664 if (begin_main_frame_state_ == BEGIN_MAIN_FRAME_STATE_WAITING_FOR_DRAW) |
| 656 begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_IDLE; | 665 begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_IDLE; |
| 657 | 666 |
| 658 needs_redraw_ = false; | |
| 659 active_tree_needs_first_draw_ = false; | |
| 660 | |
| 661 if (did_request_swap) { | 667 if (did_request_swap) { |
|
sunnyps
2015/11/20 23:34:07
Doesn't draw_result != DRAW_SUCCESS imply that did
brianderson
2015/11/21 00:31:33
It's a bit confusing, and probably deserves some c
| |
| 662 DCHECK(!request_swap_funnel_); | 668 DCHECK(!request_swap_funnel_); |
| 663 request_swap_funnel_ = true; | 669 request_swap_funnel_ = true; |
| 664 did_request_swap_in_last_frame_ = true; | 670 did_request_swap_in_last_frame_ = true; |
| 665 last_frame_number_swap_requested_ = current_frame_number_; | 671 last_frame_number_swap_requested_ = current_frame_number_; |
| 666 } | 672 } |
| 673 | |
| 674 switch (draw_result) { | |
| 675 case INVALID_RESULT: | |
| 676 NOTREACHED() << "Uninitialized DrawResult."; | |
| 677 break; | |
| 678 case DRAW_ABORTED_CANT_DRAW: | |
| 679 case DRAW_ABORTED_CONTEXT_LOST: | |
| 680 NOTREACHED() << "Invalid return value from DrawAndSwapIfPossible:" | |
| 681 << draw_result; | |
| 682 break; | |
| 683 case DRAW_SUCCESS: | |
| 684 consecutive_checkerboard_animations_ = 0; | |
| 685 forced_redraw_state_ = FORCED_REDRAW_STATE_IDLE; | |
| 686 break; | |
| 687 case DRAW_ABORTED_CHECKERBOARD_ANIMATIONS: | |
| 688 needs_redraw_ = true; | |
| 689 | |
| 690 // If we're already in the middle of a redraw, we don't need to | |
| 691 // restart it. | |
| 692 if (forced_redraw_state_ != FORCED_REDRAW_STATE_IDLE) | |
| 693 return; | |
| 694 | |
| 695 needs_begin_main_frame_ = true; | |
| 696 consecutive_checkerboard_animations_++; | |
|
sunnyps
2015/11/20 23:34:07
nit: needs_begin_main_frame should be inside the i
brianderson
2015/11/21 00:31:33
Sg.
| |
| 697 if (settings_.timeout_and_draw_when_animation_checkerboards && | |
| 698 consecutive_checkerboard_animations_ >= | |
| 699 settings_.maximum_number_of_failed_draws_before_draw_is_forced) { | |
| 700 consecutive_checkerboard_animations_ = 0; | |
|
sunnyps
2015/11/20 23:34:07
nit: We shouldn't have to set consecutive_checkerb
brianderson
2015/11/21 00:31:33
Also sg.
| |
| 701 // We need to force a draw, but it doesn't make sense to do this until | |
| 702 // we've committed and have new textures. | |
| 703 forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT; | |
| 704 } | |
| 705 break; | |
| 706 case DRAW_ABORTED_MISSING_HIGH_RES_CONTENT: | |
| 707 // It's not clear whether this missing content is because of missing | |
| 708 // pictures (which requires a commit) or because of memory pressure | |
| 709 // removing textures (which might not). To be safe, request a commit | |
| 710 // anyway. | |
| 711 needs_begin_main_frame_ = true; | |
| 712 break; | |
| 713 } | |
| 667 } | 714 } |
| 668 | 715 |
| 669 void SchedulerStateMachine::WillPrepareTiles() { | 716 void SchedulerStateMachine::WillPrepareTiles() { |
| 670 needs_prepare_tiles_ = false; | 717 needs_prepare_tiles_ = false; |
| 671 } | 718 } |
| 672 | 719 |
| 673 void SchedulerStateMachine::WillBeginOutputSurfaceCreation() { | 720 void SchedulerStateMachine::WillBeginOutputSurfaceCreation() { |
| 674 DCHECK_EQ(output_surface_state_, OUTPUT_SURFACE_NONE); | 721 DCHECK_EQ(output_surface_state_, OUTPUT_SURFACE_NONE); |
| 675 output_surface_state_ = OUTPUT_SURFACE_CREATING; | 722 output_surface_state_ = OUTPUT_SURFACE_CREATING; |
| 676 | 723 |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 976 void SchedulerStateMachine::DidSwapBuffersComplete() { | 1023 void SchedulerStateMachine::DidSwapBuffersComplete() { |
| 977 TRACE_EVENT_ASYNC_END0("cc", "Scheduler:pending_swaps", this); | 1024 TRACE_EVENT_ASYNC_END0("cc", "Scheduler:pending_swaps", this); |
| 978 pending_swaps_--; | 1025 pending_swaps_--; |
| 979 } | 1026 } |
| 980 | 1027 |
| 981 void SchedulerStateMachine::SetImplLatencyTakesPriority( | 1028 void SchedulerStateMachine::SetImplLatencyTakesPriority( |
| 982 bool impl_latency_takes_priority) { | 1029 bool impl_latency_takes_priority) { |
| 983 impl_latency_takes_priority_ = impl_latency_takes_priority; | 1030 impl_latency_takes_priority_ = impl_latency_takes_priority; |
| 984 } | 1031 } |
| 985 | 1032 |
| 986 void SchedulerStateMachine::DidDrawIfPossibleCompleted(DrawResult result) { | |
| 987 switch (result) { | |
| 988 case INVALID_RESULT: | |
| 989 NOTREACHED() << "Uninitialized DrawResult."; | |
| 990 break; | |
| 991 case DRAW_ABORTED_CANT_DRAW: | |
| 992 case DRAW_ABORTED_CONTEXT_LOST: | |
| 993 NOTREACHED() << "Invalid return value from DrawAndSwapIfPossible:" | |
| 994 << result; | |
| 995 break; | |
| 996 case DRAW_SUCCESS: | |
| 997 consecutive_checkerboard_animations_ = 0; | |
| 998 forced_redraw_state_ = FORCED_REDRAW_STATE_IDLE; | |
| 999 break; | |
| 1000 case DRAW_ABORTED_CHECKERBOARD_ANIMATIONS: | |
| 1001 needs_redraw_ = true; | |
| 1002 | |
| 1003 // If we're already in the middle of a redraw, we don't need to | |
| 1004 // restart it. | |
| 1005 if (forced_redraw_state_ != FORCED_REDRAW_STATE_IDLE) | |
| 1006 return; | |
| 1007 | |
| 1008 needs_begin_main_frame_ = true; | |
| 1009 consecutive_checkerboard_animations_++; | |
| 1010 if (settings_.timeout_and_draw_when_animation_checkerboards && | |
| 1011 consecutive_checkerboard_animations_ >= | |
| 1012 settings_.maximum_number_of_failed_draws_before_draw_is_forced) { | |
| 1013 consecutive_checkerboard_animations_ = 0; | |
| 1014 // We need to force a draw, but it doesn't make sense to do this until | |
| 1015 // we've committed and have new textures. | |
| 1016 forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT; | |
| 1017 } | |
| 1018 break; | |
| 1019 case DRAW_ABORTED_MISSING_HIGH_RES_CONTENT: | |
| 1020 // It's not clear whether this missing content is because of missing | |
| 1021 // pictures (which requires a commit) or because of memory pressure | |
| 1022 // removing textures (which might not). To be safe, request a commit | |
| 1023 // anyway. | |
| 1024 needs_begin_main_frame_ = true; | |
| 1025 break; | |
| 1026 } | |
| 1027 } | |
| 1028 | |
| 1029 void SchedulerStateMachine::SetNeedsBeginMainFrame() { | 1033 void SchedulerStateMachine::SetNeedsBeginMainFrame() { |
| 1030 needs_begin_main_frame_ = true; | 1034 needs_begin_main_frame_ = true; |
| 1031 } | 1035 } |
| 1032 | 1036 |
| 1033 void SchedulerStateMachine::SetNeedsOneBeginImplFrame() { | 1037 void SchedulerStateMachine::SetNeedsOneBeginImplFrame() { |
| 1034 needs_one_begin_impl_frame_ = true; | 1038 needs_one_begin_impl_frame_ = true; |
| 1035 } | 1039 } |
| 1036 | 1040 |
| 1037 void SchedulerStateMachine::NotifyReadyToCommit() { | 1041 void SchedulerStateMachine::NotifyReadyToCommit() { |
| 1038 DCHECK_EQ(begin_main_frame_state_, BEGIN_MAIN_FRAME_STATE_STARTED) | 1042 DCHECK_EQ(begin_main_frame_state_, BEGIN_MAIN_FRAME_STATE_STARTED) |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1114 case OUTPUT_SURFACE_ACTIVE: | 1118 case OUTPUT_SURFACE_ACTIVE: |
| 1115 case OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT: | 1119 case OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT: |
| 1116 case OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION: | 1120 case OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION: |
| 1117 return true; | 1121 return true; |
| 1118 } | 1122 } |
| 1119 NOTREACHED(); | 1123 NOTREACHED(); |
| 1120 return false; | 1124 return false; |
| 1121 } | 1125 } |
| 1122 | 1126 |
| 1123 } // namespace cc | 1127 } // namespace cc |
| OLD | NEW |