| Index: cc/scheduler/scheduler_state_machine.cc
 | 
| diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc
 | 
| index 8be7ec77e1c0d5d68d524deaf1cb6456385a1cbe..350752606dcd5b1484636e4efc5dfeaceec75f9f 100644
 | 
| --- a/cc/scheduler/scheduler_state_machine.cc
 | 
| +++ b/cc/scheduler/scheduler_state_machine.cc
 | 
| @@ -54,7 +54,7 @@ SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings)
 | 
|        defer_commits_(false),
 | 
|        video_needs_begin_frames_(false),
 | 
|        last_commit_had_no_updates_(false),
 | 
| -      wait_for_active_tree_ready_to_draw_(false),
 | 
| +      wait_for_ready_to_draw_(false),
 | 
|        did_request_swap_in_last_frame_(false),
 | 
|        did_perform_swap_in_last_draw_(false) {}
 | 
|  
 | 
| @@ -231,8 +231,7 @@ void SchedulerStateMachine::AsValueInto(
 | 
|                      pending_tree_is_ready_for_activation_);
 | 
|    state->SetBoolean("active_tree_needs_first_draw",
 | 
|                      active_tree_needs_first_draw_);
 | 
| -  state->SetBoolean("wait_for_active_tree_ready_to_draw",
 | 
| -                    wait_for_active_tree_ready_to_draw_);
 | 
| +  state->SetBoolean("wait_for_ready_to_draw", wait_for_ready_to_draw_);
 | 
|    state->SetBoolean("did_create_and_initialize_first_output_surface",
 | 
|                      did_create_and_initialize_first_output_surface_);
 | 
|    state->SetBoolean("impl_latency_takes_priority",
 | 
| @@ -644,6 +643,9 @@ void SchedulerStateMachine::UpdateStateOnCommit(bool commit_has_no_updates) {
 | 
|    // If the commit was aborted, then there is no pending tree.
 | 
|    has_pending_tree_ = !commit_has_no_updates;
 | 
|  
 | 
| +  wait_for_ready_to_draw_ =
 | 
| +      !commit_has_no_updates && settings_.commit_to_active_tree;
 | 
| +
 | 
|    // Update state related to forced draws.
 | 
|    if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_COMMIT) {
 | 
|      forced_redraw_state_ = has_pending_tree_
 | 
| @@ -754,6 +756,7 @@ void SchedulerStateMachine::SetSkipNextBeginMainFrameToReduceLatency() {
 | 
|  bool SchedulerStateMachine::BeginFrameRequiredForChildren() const {
 | 
|    return children_need_begin_frames_;
 | 
|  }
 | 
| +
 | 
|  bool SchedulerStateMachine::BeginFrameNeededForVideo() const {
 | 
|    return video_needs_begin_frames_;
 | 
|  }
 | 
| @@ -899,12 +902,12 @@ SchedulerStateMachine::CurrentBeginImplFrameDeadlineMode() const {
 | 
|    if (settings_.using_synchronous_renderer_compositor) {
 | 
|      // No deadline for synchronous compositor.
 | 
|      return BEGIN_IMPL_FRAME_DEADLINE_MODE_NONE;
 | 
| -  } else if (wait_for_active_tree_ready_to_draw_) {
 | 
| +  } else if (ShouldTriggerBeginImplFrameDeadlineImmediately()) {
 | 
| +    return BEGIN_IMPL_FRAME_DEADLINE_MODE_IMMEDIATE;
 | 
| +  } else if (wait_for_ready_to_draw_) {
 | 
|      // When we are waiting for ready to draw signal, we do not wait to post a
 | 
|      // deadline yet.
 | 
|      return BEGIN_IMPL_FRAME_DEADLINE_MODE_BLOCKED_ON_READY_TO_DRAW;
 | 
| -  } else if (ShouldTriggerBeginImplFrameDeadlineImmediately()) {
 | 
| -    return BEGIN_IMPL_FRAME_DEADLINE_MODE_IMMEDIATE;
 | 
|    } else if (needs_redraw_ && !SwapThrottled()) {
 | 
|      // We have an animation or fast input path on the impl thread that wants
 | 
|      // to draw, so don't wait too long for a new active tree.
 | 
| @@ -920,13 +923,15 @@ SchedulerStateMachine::CurrentBeginImplFrameDeadlineMode() const {
 | 
|  
 | 
|  bool SchedulerStateMachine::ShouldTriggerBeginImplFrameDeadlineImmediately()
 | 
|      const {
 | 
| -  if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME)
 | 
| -    return false;
 | 
| -
 | 
|    // If we just forced activation, we should end the deadline right now.
 | 
|    if (PendingActivationsShouldBeForced() && !has_pending_tree_)
 | 
|      return true;
 | 
|  
 | 
| +  // Do not trigger deadline immediately if we're waiting for READY_TO_DRAW
 | 
| +  // unless it's one of the forced cases.
 | 
| +  if (wait_for_ready_to_draw_)
 | 
| +    return false;
 | 
| +
 | 
|    // SwapAck throttle the deadline since we wont draw and swap anyway.
 | 
|    if (SwapThrottled())
 | 
|      return false;
 | 
| @@ -971,6 +976,7 @@ void SchedulerStateMachine::SetVisible(bool visible) {
 | 
|  
 | 
|    // TODO(sunnyps): Change the funnel to a bool to avoid hacks like this.
 | 
|    prepare_tiles_funnel_ = 0;
 | 
| +  wait_for_ready_to_draw_ = false;
 | 
|  }
 | 
|  
 | 
|  void SchedulerStateMachine::SetCanDraw(bool can_draw) { can_draw_ = can_draw; }
 | 
| @@ -981,10 +987,6 @@ void SchedulerStateMachine::SetNeedsAnimate() {
 | 
|    needs_animate_ = true;
 | 
|  }
 | 
|  
 | 
| -void SchedulerStateMachine::SetWaitForReadyToDraw() {
 | 
| -  wait_for_active_tree_ready_to_draw_ = true;
 | 
| -}
 | 
| -
 | 
|  bool SchedulerStateMachine::OnlyImplSideUpdatesExpected() const {
 | 
|    bool has_impl_updates = needs_redraw_ || needs_animate_;
 | 
|    bool main_updates_expected =
 | 
| @@ -1108,7 +1110,7 @@ void SchedulerStateMachine::DidLoseOutputSurface() {
 | 
|      return;
 | 
|    output_surface_state_ = OUTPUT_SURFACE_LOST;
 | 
|    needs_redraw_ = false;
 | 
| -  wait_for_active_tree_ready_to_draw_ = false;
 | 
| +  wait_for_ready_to_draw_ = false;
 | 
|  }
 | 
|  
 | 
|  void SchedulerStateMachine::NotifyReadyToActivate() {
 | 
| @@ -1117,7 +1119,7 @@ void SchedulerStateMachine::NotifyReadyToActivate() {
 | 
|  }
 | 
|  
 | 
|  void SchedulerStateMachine::NotifyReadyToDraw() {
 | 
| -  wait_for_active_tree_ready_to_draw_ = false;
 | 
| +  wait_for_ready_to_draw_ = false;
 | 
|  }
 | 
|  
 | 
|  void SchedulerStateMachine::DidCreateAndInitializeOutputSurface() {
 | 
| 
 |