| 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" |
| 11 #include "base/trace_event/trace_event_argument.h" | 11 #include "base/trace_event/trace_event_argument.h" |
| 12 #include "base/values.h" | 12 #include "base/values.h" |
| 13 | 13 |
| 14 namespace cc { | 14 namespace cc { |
| 15 | 15 |
| 16 namespace { |
| 17 // Surfaces and CompositorTimingHistory don't support more than 1 pending swap. |
| 18 const int kMaxPendingSwaps = 1; |
| 19 } // namespace |
| 20 |
| 16 SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings) | 21 SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings) |
| 17 : settings_(settings), | 22 : settings_(settings), |
| 18 output_surface_state_(OUTPUT_SURFACE_NONE), | 23 output_surface_state_(OUTPUT_SURFACE_NONE), |
| 19 begin_impl_frame_state_(BEGIN_IMPL_FRAME_STATE_IDLE), | 24 begin_impl_frame_state_(BEGIN_IMPL_FRAME_STATE_IDLE), |
| 20 begin_main_frame_state_(BEGIN_MAIN_FRAME_STATE_IDLE), | 25 begin_main_frame_state_(BEGIN_MAIN_FRAME_STATE_IDLE), |
| 21 forced_redraw_state_(FORCED_REDRAW_STATE_IDLE), | 26 forced_redraw_state_(FORCED_REDRAW_STATE_IDLE), |
| 22 commit_count_(0), | 27 commit_count_(0), |
| 23 current_frame_number_(0), | 28 current_frame_number_(0), |
| 24 last_frame_number_animate_performed_(-1), | 29 last_frame_number_animate_performed_(-1), |
| 25 last_frame_number_swap_performed_(-1), | 30 last_frame_number_swap_performed_(-1), |
| 26 last_frame_number_swap_requested_(-1), | 31 last_frame_number_swap_requested_(-1), |
| 27 last_frame_number_begin_main_frame_sent_(-1), | 32 last_frame_number_begin_main_frame_sent_(-1), |
| 28 last_frame_number_invalidate_output_surface_performed_(-1), | 33 last_frame_number_invalidate_output_surface_performed_(-1), |
| 29 animate_funnel_(false), | 34 animate_funnel_(false), |
| 30 request_swap_funnel_(false), | 35 request_swap_funnel_(false), |
| 31 send_begin_main_frame_funnel_(true), | 36 send_begin_main_frame_funnel_(true), |
| 32 invalidate_output_surface_funnel_(false), | 37 invalidate_output_surface_funnel_(false), |
| 33 prepare_tiles_funnel_(0), | 38 prepare_tiles_funnel_(0), |
| 34 consecutive_checkerboard_animations_(0), | 39 consecutive_checkerboard_animations_(0), |
| 35 max_pending_swaps_(1), | |
| 36 pending_swaps_(0), | 40 pending_swaps_(0), |
| 37 swaps_with_current_output_surface_(0), | 41 swaps_with_current_output_surface_(0), |
| 38 needs_redraw_(false), | 42 needs_redraw_(false), |
| 39 needs_animate_(false), | 43 needs_animate_(false), |
| 40 needs_prepare_tiles_(false), | 44 needs_prepare_tiles_(false), |
| 41 needs_begin_main_frame_(false), | 45 needs_begin_main_frame_(false), |
| 42 needs_one_begin_impl_frame_(false), | 46 needs_one_begin_impl_frame_(false), |
| 43 visible_(false), | 47 visible_(false), |
| 44 resourceless_draw_(false), | 48 resourceless_draw_(false), |
| 45 can_draw_(false), | 49 can_draw_(false), |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 last_frame_number_begin_main_frame_sent_); | 214 last_frame_number_begin_main_frame_sent_); |
| 211 state->SetBoolean("funnel: animate_funnel", animate_funnel_); | 215 state->SetBoolean("funnel: animate_funnel", animate_funnel_); |
| 212 state->SetBoolean("funnel: request_swap_funnel", request_swap_funnel_); | 216 state->SetBoolean("funnel: request_swap_funnel", request_swap_funnel_); |
| 213 state->SetBoolean("funnel: send_begin_main_frame_funnel", | 217 state->SetBoolean("funnel: send_begin_main_frame_funnel", |
| 214 send_begin_main_frame_funnel_); | 218 send_begin_main_frame_funnel_); |
| 215 state->SetInteger("funnel: prepare_tiles_funnel", prepare_tiles_funnel_); | 219 state->SetInteger("funnel: prepare_tiles_funnel", prepare_tiles_funnel_); |
| 216 state->SetBoolean("funnel: invalidate_output_surface_funnel", | 220 state->SetBoolean("funnel: invalidate_output_surface_funnel", |
| 217 invalidate_output_surface_funnel_); | 221 invalidate_output_surface_funnel_); |
| 218 state->SetInteger("consecutive_checkerboard_animations", | 222 state->SetInteger("consecutive_checkerboard_animations", |
| 219 consecutive_checkerboard_animations_); | 223 consecutive_checkerboard_animations_); |
| 220 state->SetInteger("max_pending_swaps_", max_pending_swaps_); | |
| 221 state->SetInteger("pending_swaps_", pending_swaps_); | 224 state->SetInteger("pending_swaps_", pending_swaps_); |
| 222 state->SetInteger("swaps_with_current_output_surface", | 225 state->SetInteger("swaps_with_current_output_surface", |
| 223 swaps_with_current_output_surface_); | 226 swaps_with_current_output_surface_); |
| 224 state->SetBoolean("needs_redraw", needs_redraw_); | 227 state->SetBoolean("needs_redraw", needs_redraw_); |
| 225 state->SetBoolean("needs_animate_", needs_animate_); | 228 state->SetBoolean("needs_animate_", needs_animate_); |
| 226 state->SetBoolean("needs_prepare_tiles", needs_prepare_tiles_); | 229 state->SetBoolean("needs_prepare_tiles", needs_prepare_tiles_); |
| 227 state->SetBoolean("needs_begin_main_frame", needs_begin_main_frame_); | 230 state->SetBoolean("needs_begin_main_frame", needs_begin_main_frame_); |
| 228 state->SetBoolean("needs_one_begin_impl_frame", needs_one_begin_impl_frame_); | 231 state->SetBoolean("needs_one_begin_impl_frame", needs_one_begin_impl_frame_); |
| 229 state->SetBoolean("visible", visible_); | 232 state->SetBoolean("visible", visible_); |
| 230 state->SetBoolean("can_draw", can_draw_); | 233 state->SetBoolean("can_draw", can_draw_); |
| (...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 905 return true; | 908 return true; |
| 906 | 909 |
| 907 return false; | 910 return false; |
| 908 } | 911 } |
| 909 | 912 |
| 910 bool SchedulerStateMachine::main_thread_missed_last_deadline() const { | 913 bool SchedulerStateMachine::main_thread_missed_last_deadline() const { |
| 911 return main_thread_missed_last_deadline_; | 914 return main_thread_missed_last_deadline_; |
| 912 } | 915 } |
| 913 | 916 |
| 914 bool SchedulerStateMachine::SwapThrottled() const { | 917 bool SchedulerStateMachine::SwapThrottled() const { |
| 915 return pending_swaps_ >= max_pending_swaps_; | 918 return pending_swaps_ >= kMaxPendingSwaps; |
| 916 } | 919 } |
| 917 | 920 |
| 918 void SchedulerStateMachine::SetVisible(bool visible) { | 921 void SchedulerStateMachine::SetVisible(bool visible) { |
| 919 if (visible_ == visible) | 922 if (visible_ == visible) |
| 920 return; | 923 return; |
| 921 | 924 |
| 922 visible_ = visible; | 925 visible_ = visible; |
| 923 | 926 |
| 924 if (visible) | 927 if (visible) |
| 925 main_thread_missed_last_deadline_ = false; | 928 main_thread_missed_last_deadline_ = false; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 950 has_pending_tree_; | 953 has_pending_tree_; |
| 951 return has_impl_updates && !main_updates_expected; | 954 return has_impl_updates && !main_updates_expected; |
| 952 } | 955 } |
| 953 | 956 |
| 954 void SchedulerStateMachine::SetNeedsPrepareTiles() { | 957 void SchedulerStateMachine::SetNeedsPrepareTiles() { |
| 955 if (!needs_prepare_tiles_) { | 958 if (!needs_prepare_tiles_) { |
| 956 TRACE_EVENT0("cc", "SchedulerStateMachine::SetNeedsPrepareTiles"); | 959 TRACE_EVENT0("cc", "SchedulerStateMachine::SetNeedsPrepareTiles"); |
| 957 needs_prepare_tiles_ = true; | 960 needs_prepare_tiles_ = true; |
| 958 } | 961 } |
| 959 } | 962 } |
| 960 | |
| 961 void SchedulerStateMachine::SetMaxSwapsPending(int max) { | |
| 962 max_pending_swaps_ = max; | |
| 963 } | |
| 964 | |
| 965 void SchedulerStateMachine::DidSwapBuffers() { | 963 void SchedulerStateMachine::DidSwapBuffers() { |
| 966 TRACE_EVENT_ASYNC_BEGIN0("cc", "Scheduler:pending_swaps", this); | 964 TRACE_EVENT_ASYNC_BEGIN0("cc", "Scheduler:pending_swaps", this); |
| 967 pending_swaps_++; | 965 pending_swaps_++; |
| 968 swaps_with_current_output_surface_++; | 966 swaps_with_current_output_surface_++; |
| 969 | 967 |
| 970 DCHECK_LE(pending_swaps_, max_pending_swaps_); | 968 DCHECK_LE(pending_swaps_, kMaxPendingSwaps); |
| 971 | 969 |
| 972 did_perform_swap_in_last_draw_ = true; | 970 did_perform_swap_in_last_draw_ = true; |
| 973 last_frame_number_swap_performed_ = current_frame_number_; | 971 last_frame_number_swap_performed_ = current_frame_number_; |
| 974 } | 972 } |
| 975 | 973 |
| 976 void SchedulerStateMachine::DidSwapBuffersComplete() { | 974 void SchedulerStateMachine::DidSwapBuffersComplete() { |
| 977 TRACE_EVENT_ASYNC_END0("cc", "Scheduler:pending_swaps", this); | 975 TRACE_EVENT_ASYNC_END0("cc", "Scheduler:pending_swaps", this); |
| 978 pending_swaps_--; | 976 pending_swaps_--; |
| 979 } | 977 } |
| 980 | 978 |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1114 case OUTPUT_SURFACE_ACTIVE: | 1112 case OUTPUT_SURFACE_ACTIVE: |
| 1115 case OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT: | 1113 case OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT: |
| 1116 case OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION: | 1114 case OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION: |
| 1117 return true; | 1115 return true; |
| 1118 } | 1116 } |
| 1119 NOTREACHED(); | 1117 NOTREACHED(); |
| 1120 return false; | 1118 return false; |
| 1121 } | 1119 } |
| 1122 | 1120 |
| 1123 } // namespace cc | 1121 } // namespace cc |
| OLD | NEW |