Index: cc/scheduler/scheduler_state_machine.cc |
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc |
index 40e3918b3779d209ae0e0031b8e93875cdd399e6..d83599c8c71908af2b5b426fd30106fb60f82184 100644 |
--- a/cc/scheduler/scheduler_state_machine.cc |
+++ b/cc/scheduler/scheduler_state_machine.cc |
@@ -28,7 +28,7 @@ SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings) |
last_frame_number_invalidate_output_surface_performed_(-1), |
animate_funnel_(false), |
request_swap_funnel_(false), |
- send_begin_main_frame_funnel_(false), |
+ send_begin_main_frame_funnel_(true), |
invalidate_output_surface_funnel_(false), |
prepare_tiles_funnel_(0), |
consecutive_checkerboard_animations_(0), |
@@ -417,7 +417,8 @@ bool SchedulerStateMachine::ShouldSendBeginMainFrame() const { |
if (!CouldSendBeginMainFrame()) |
return false; |
- // Do not send begin main frame too many times in a single frame. |
+ // Do not send begin main frame too many times in a single frame or before |
+ // the first BeginFrame. |
if (send_begin_main_frame_funnel_) |
return false; |
@@ -435,14 +436,16 @@ bool SchedulerStateMachine::ShouldSendBeginMainFrame() const { |
return false; |
} |
- // We should not send BeginMainFrame while we are in |
- // BEGIN_IMPL_FRAME_STATE_IDLE since we might have new |
- // user input arriving soon. |
+ // We should not send BeginMainFrame while we are in the idle state since we |
+ // might have new user input arriving soon. It's okay to send BeginMainFrame |
+ // for the synchronous compositor because the main thread is always high |
+ // latency in that case. |
// TODO(brianderson): Allow sending BeginMainFrame while idle when the main |
- // thread isn't consuming user input. |
- if (begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_IDLE && |
- BeginFrameNeeded()) |
+ // thread isn't consuming user input for non-synchronous compositor. |
+ if (!settings_.using_synchronous_renderer_compositor && |
+ begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_IDLE) { |
return false; |
+ } |
// We need a new commit for the forced redraw. This honors the |
// single commit per interval because the result will be swapped to screen. |
@@ -879,6 +882,11 @@ void SchedulerStateMachine::OnBeginImplFrameIdle() { |
begin_impl_frame_state_ = BEGIN_IMPL_FRAME_STATE_IDLE; |
skip_next_begin_main_frame_to_reduce_latency_ = false; |
+ |
+ // If we're entering a state where we won't get BeginFrames set all the |
+ // funnels so that we don't perform any actions that we shouldn't. |
+ if (!BeginFrameNeeded()) |
+ send_begin_main_frame_funnel_ = true; |
} |
SchedulerStateMachine::BeginImplFrameDeadlineMode |