Index: cc/scheduler/scheduler_state_machine.cc |
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc |
index 3ed18f68fa3c60c182eff5346b2afa8800347e5e..84a6185c4709c43c8912c183be37ddabf4d1ef1c 100644 |
--- a/cc/scheduler/scheduler_state_machine.cc |
+++ b/cc/scheduler/scheduler_state_machine.cc |
@@ -24,6 +24,7 @@ SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings) |
current_frame_number_(0), |
last_frame_number_animate_performed_(-1), |
last_frame_number_swap_performed_(-1), |
+ last_frame_number_swap_requested_(-1), |
last_frame_number_begin_main_frame_sent_(-1), |
last_frame_number_update_visible_tiles_was_called_(-1), |
manage_tiles_funnel_(0), |
@@ -224,6 +225,8 @@ scoped_ptr<base::Value> SchedulerStateMachine::AsValue() const { |
last_frame_number_animate_performed_); |
minor_state->SetInteger("last_frame_number_swap_performed", |
last_frame_number_swap_performed_); |
+ minor_state->SetInteger("last_frame_number_swap_requested", |
+ last_frame_number_swap_requested_); |
minor_state->SetInteger( |
"last_frame_number_begin_main_frame_sent", |
last_frame_number_begin_main_frame_sent_); |
@@ -292,6 +295,10 @@ bool SchedulerStateMachine::HasSwappedThisFrame() const { |
return current_frame_number_ == last_frame_number_swap_performed_; |
} |
+bool SchedulerStateMachine::HasRequestedSwapThisFrame() const { |
+ return current_frame_number_ == last_frame_number_swap_requested_; |
+} |
+ |
bool SchedulerStateMachine::PendingDrawsShouldBeAborted() const { |
// These are all the cases where we normally cannot or do not want to draw |
// but, if needs_redraw_ is true and we do not draw to make forward progress, |
@@ -370,8 +377,8 @@ bool SchedulerStateMachine::ShouldDraw() const { |
if (PendingDrawsShouldBeAborted()) |
return active_tree_needs_first_draw_; |
- // After this line, we only want to swap once per frame. |
- if (HasSwappedThisFrame()) |
+ // After this line, we only want to send a swap request once per frame. |
+ if (HasRequestedSwapThisFrame()) |
return false; |
// Do not queue too many swaps. |
@@ -793,7 +800,7 @@ void SchedulerStateMachine::UpdateStateOnDraw(bool did_request_swap) { |
active_tree_needs_first_draw_ = false; |
if (did_request_swap) |
- last_frame_number_swap_performed_ = current_frame_number_; |
+ last_frame_number_swap_requested_ = current_frame_number_; |
} |
void SchedulerStateMachine::UpdateStateOnManageTiles() { |
@@ -901,12 +908,12 @@ bool SchedulerStateMachine::ProactiveBeginFrameWanted() const { |
if (needs_manage_tiles_) |
return true; |
- // If we just swapped, it's likely that we are going to produce another |
- // frame soon. This helps avoid negative glitches in our |
+ // If we just sent a swap request, it's likely that we are going to produce |
+ // another frame soon. This helps avoid negative glitches in our |
// SetNeedsBeginFrame requests, which may propagate to the BeginImplFrame |
// provider and get sampled at an inopportune time, delaying the next |
// BeginImplFrame. |
- if (last_frame_number_swap_performed_ == current_frame_number_) |
+ if (HasRequestedSwapThisFrame()) |
return true; |
return false; |
@@ -987,7 +994,7 @@ bool SchedulerStateMachine::MainThreadIsInHighLatencyMode() const { |
// If we just sent a BeginMainFrame and haven't hit the deadline yet, the main |
// thread is in a low latency mode. |
- if (last_frame_number_begin_main_frame_sent_ == current_frame_number_ && |
+ if (HasSentBeginMainFrameThisFrame() && |
(begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING || |
begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME)) |
return false; |
@@ -995,9 +1002,7 @@ bool SchedulerStateMachine::MainThreadIsInHighLatencyMode() const { |
// If there's a commit in progress it must either be from the previous frame |
// or it started after the impl thread's deadline. In either case the main |
// thread is in high latency mode. |
- if (commit_state_ == COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || |
- commit_state_ == COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED || |
- commit_state_ == COMMIT_STATE_READY_TO_COMMIT) |
+ if (CommitPending()) |
return true; |
// Similarly, if there's a pending tree the main thread is in high latency |
@@ -1011,11 +1016,10 @@ bool SchedulerStateMachine::MainThreadIsInHighLatencyMode() const { |
if (begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) { |
// Even if there's a new active tree to draw at the deadline or we've just |
- // drawn it, it may have been triggered by a previous BeginImplFrame, in |
+ // swapped it, it may have been triggered by a previous BeginImplFrame, in |
// which case the main thread is in a high latency mode. |
- return (active_tree_needs_first_draw_ || |
- last_frame_number_swap_performed_ == current_frame_number_) && |
- last_frame_number_begin_main_frame_sent_ != current_frame_number_; |
+ return (active_tree_needs_first_draw_ || HasSwappedThisFrame()) && |
+ !HasSentBeginMainFrameThisFrame(); |
} |
// If the active tree needs its first draw in any other state, we know the |
@@ -1057,6 +1061,8 @@ void SchedulerStateMachine::SetMaxSwapsPending(int max) { |
void SchedulerStateMachine::DidSwapBuffers() { |
pending_swaps_++; |
DCHECK_LE(pending_swaps_, max_pending_swaps_); |
+ |
+ last_frame_number_swap_performed_ = current_frame_number_; |
} |
void SchedulerStateMachine::SetSwapUsedIncompleteTile( |
@@ -1074,23 +1080,22 @@ void SchedulerStateMachine::SetSmoothnessTakesPriority( |
smoothness_takes_priority_ = smoothness_takes_priority; |
} |
-void SchedulerStateMachine::DidDrawIfPossibleCompleted( |
- DrawSwapReadbackResult::DrawResult result) { |
+void SchedulerStateMachine::DidDrawIfPossibleCompleted(DrawResult result) { |
switch (result) { |
- case DrawSwapReadbackResult::INVALID_RESULT: |
- NOTREACHED() << "Uninitialized DrawSwapReadbackResult."; |
+ case INVALID_RESULT: |
+ NOTREACHED() << "Uninitialized DrawResult."; |
break; |
- case DrawSwapReadbackResult::DRAW_ABORTED_CANT_DRAW: |
- case DrawSwapReadbackResult::DRAW_ABORTED_CANT_READBACK: |
- case DrawSwapReadbackResult::DRAW_ABORTED_CONTEXT_LOST: |
+ case DRAW_ABORTED_CANT_DRAW: |
+ case DRAW_ABORTED_CANT_READBACK: |
+ case DRAW_ABORTED_CONTEXT_LOST: |
NOTREACHED() << "Invalid return value from DrawAndSwapIfPossible:" |
<< result; |
break; |
- case DrawSwapReadbackResult::DRAW_SUCCESS: |
+ case DRAW_SUCCESS: |
consecutive_checkerboard_animations_ = 0; |
forced_redraw_state_ = FORCED_REDRAW_STATE_IDLE; |
break; |
- case DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS: |
+ case DRAW_ABORTED_CHECKERBOARD_ANIMATIONS: |
needs_redraw_ = true; |
// If we're already in the middle of a redraw, we don't need to |
@@ -1109,7 +1114,7 @@ void SchedulerStateMachine::DidDrawIfPossibleCompleted( |
forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT; |
} |
break; |
- case DrawSwapReadbackResult::DRAW_ABORTED_MISSING_HIGH_RES_CONTENT: |
+ case DRAW_ABORTED_MISSING_HIGH_RES_CONTENT: |
// It's not clear whether this missing content is because of missing |
// pictures (which requires a commit) or because of memory pressure |
// removing textures (which might not). To be safe, request a commit |