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 |