Index: cc/scheduler/scheduler_state_machine.cc |
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc |
index 7d8fcd721a32059e07c9167647ea8b22aa7fc167..334c8480c19b8c26978a02ff6bb913f95a7d543f 100644 |
--- a/cc/scheduler/scheduler_state_machine.cc |
+++ b/cc/scheduler/scheduler_state_machine.cc |
@@ -26,7 +26,7 @@ SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings) |
last_frame_number_swap_performed_(-1), |
last_frame_number_begin_main_frame_sent_(-1), |
last_frame_number_update_visible_tiles_was_called_(-1), |
- last_frame_number_manage_tiles_called_(-1), |
+ manage_tiles_funnel_(0), |
consecutive_failed_draws_(0), |
needs_redraw_(false), |
needs_manage_tiles_(false), |
@@ -239,6 +239,7 @@ scoped_ptr<base::Value> SchedulerStateMachine::AsValue() const { |
"last_frame_number_update_visible_tiles_was_called", |
last_frame_number_update_visible_tiles_was_called_); |
+ minor_state->SetInteger("manage_tiles_funnel", manage_tiles_funnel_); |
minor_state->SetInteger("consecutive_failed_draws", |
consecutive_failed_draws_); |
minor_state->SetBoolean("needs_redraw", needs_redraw_); |
@@ -270,6 +271,14 @@ scoped_ptr<base::Value> SchedulerStateMachine::AsValue() const { |
return state.PassAs<base::Value>(); |
} |
+void SchedulerStateMachine::AdvanceCurrentFrameNumber() { |
+ current_frame_number_++; |
+ |
+ // "Drain" the ManageTiles funnel. |
+ if (manage_tiles_funnel_ > 0) |
+ manage_tiles_funnel_--; |
+} |
+ |
bool SchedulerStateMachine::HasSentBeginMainFrameThisFrame() const { |
return current_frame_number_ == |
last_frame_number_begin_main_frame_sent_; |
@@ -507,9 +516,9 @@ bool SchedulerStateMachine::IsCommitStateWaiting() const { |
bool SchedulerStateMachine::ShouldManageTiles() const { |
// ManageTiles only really needs to be called immediately after commit |
- // and then periodically after that. Limiting to once per frame prevents |
- // post-commit and post-draw ManageTiles on the same frame. |
- if (last_frame_number_manage_tiles_called_ == current_frame_number_) |
+ // and then periodically after that. Use a funnel to make sure we average |
+ // one ManageTiles per BeginImplFrame in the long run. |
+ if (manage_tiles_funnel_ > 0) |
return false; |
// Limiting to once per-frame is not enough, since we only want to |
@@ -885,7 +894,7 @@ bool SchedulerStateMachine::ProactiveBeginImplFrameWanted() const { |
} |
void SchedulerStateMachine::OnBeginImplFrame(const BeginFrameArgs& args) { |
- current_frame_number_++; |
+ AdvanceCurrentFrameNumber(); |
last_begin_impl_frame_args_ = args; |
DCHECK_EQ(begin_impl_frame_state_, BEGIN_IMPL_FRAME_STATE_IDLE) << *AsValue(); |
begin_impl_frame_state_ = BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING; |
@@ -981,7 +990,7 @@ bool SchedulerStateMachine::MainThreadIsInHighLatencyMode() const { |
} |
void SchedulerStateMachine::DidEnterPollForAnticipatedDrawTriggers() { |
- current_frame_number_++; |
+ AdvanceCurrentFrameNumber(); |
inside_poll_for_anticipated_draw_triggers_ = true; |
} |
@@ -1081,7 +1090,8 @@ void SchedulerStateMachine::BeginMainFrameAborted(bool did_handle) { |
void SchedulerStateMachine::DidManageTiles() { |
needs_manage_tiles_ = false; |
- last_frame_number_manage_tiles_called_ = current_frame_number_; |
+ // "Fill" the ManageTiles funnel. |
+ manage_tiles_funnel_++; |
} |
void SchedulerStateMachine::DidLoseOutputSurface() { |