Index: cc/scheduler/scheduler_state_machine.cc |
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc |
index 0661e48ef50cea3dc9dd486875e45f8e5c669915..85b566e2ac543ea5a2cdbfe702788341009e0fd2 100644 |
--- a/cc/scheduler/scheduler_state_machine.cc |
+++ b/cc/scheduler/scheduler_state_machine.cc |
@@ -36,6 +36,7 @@ SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings) |
pending_swaps_(0), |
swaps_with_current_output_surface_(0), |
needs_redraw_(false), |
+ last_draw_result_(DRAW_SUCCESS), |
needs_animate_(false), |
needs_prepare_tiles_(false), |
needs_begin_main_frame_(false), |
@@ -584,28 +585,63 @@ void SchedulerStateMachine::WillAction(Action action) { |
} |
case ACTION_DRAW_AND_SWAP_FORCED: |
+ case ACTION_DRAW_AND_SWAP_IF_POSSIBLE: |
+ case ACTION_DRAW_AND_SWAP_ABORT: |
+ WillDraw(); |
+ return; |
+ |
+ case ACTION_BEGIN_OUTPUT_SURFACE_CREATION: |
+ WillBeginOutputSurfaceCreation(); |
+ return; |
+ |
+ case ACTION_PREPARE_TILES: |
+ WillPrepareTiles(); |
+ return; |
+ |
+ case ACTION_INVALIDATE_OUTPUT_SURFACE: |
+ WillInvalidateOutputSurface(); |
+ return; |
+ } |
+} |
+ |
+void SchedulerStateMachine::DidAction(Action action) { |
+ switch (action) { |
+ case ACTION_NONE: |
+ return; |
+ |
+ case ACTION_ACTIVATE_SYNC_TREE: |
+ return; |
+ |
+ case ACTION_ANIMATE: |
+ return; |
+ |
+ case ACTION_SEND_BEGIN_MAIN_FRAME: |
+ return; |
+ |
+ case ACTION_COMMIT: { |
+ return; |
+ } |
+ |
+ case ACTION_DRAW_AND_SWAP_FORCED: |
case ACTION_DRAW_AND_SWAP_IF_POSSIBLE: { |
bool did_request_swap = true; |
- WillDraw(did_request_swap); |
+ DidDraw(did_request_swap); |
return; |
} |
case ACTION_DRAW_AND_SWAP_ABORT: { |
bool did_request_swap = false; |
- WillDraw(did_request_swap); |
+ DidDraw(did_request_swap); |
return; |
} |
case ACTION_BEGIN_OUTPUT_SURFACE_CREATION: |
- WillBeginOutputSurfaceCreation(); |
return; |
case ACTION_PREPARE_TILES: |
- WillPrepareTiles(); |
return; |
case ACTION_INVALIDATE_OUTPUT_SURFACE: |
- WillInvalidateOutputSurface(); |
return; |
} |
} |
@@ -703,22 +739,70 @@ void SchedulerStateMachine::WillActivate() { |
needs_redraw_ = true; |
} |
-void SchedulerStateMachine::WillDraw(bool did_request_swap) { |
+void SchedulerStateMachine::WillDraw() { |
+ // We need to reset needs_redraw_ before we draw since the |
+ // draw itself might request another draw. |
+ needs_redraw_ = false; |
+} |
+ |
+void SchedulerStateMachine::DidDraw(bool did_request_swap) { |
+ active_tree_needs_first_draw_ = false; |
+ |
if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) |
forced_redraw_state_ = FORCED_REDRAW_STATE_IDLE; |
if (begin_main_frame_state_ == BEGIN_MAIN_FRAME_STATE_WAITING_FOR_DRAW) |
begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_IDLE; |
- needs_redraw_ = false; |
- active_tree_needs_first_draw_ = false; |
- |
if (did_request_swap) { |
DCHECK(!request_swap_funnel_); |
request_swap_funnel_ = true; |
did_request_swap_in_last_frame_ = true; |
last_frame_number_swap_requested_ = current_frame_number_; |
} |
+ |
+ switch (last_draw_result_) { |
+ case INVALID_RESULT: |
+ NOTREACHED() << "Uninitialized DrawResult."; |
+ break; |
+ case DRAW_ABORTED_CANT_DRAW: |
+ case DRAW_ABORTED_CONTEXT_LOST: |
+ NOTREACHED() << "Invalid return value from DrawAndSwapIfPossible:" |
+ << last_draw_result_; |
+ break; |
+ case DRAW_SUCCESS: |
+ consecutive_checkerboard_animations_ = 0; |
+ forced_redraw_state_ = FORCED_REDRAW_STATE_IDLE; |
+ break; |
+ case DRAW_ABORTED_CHECKERBOARD_ANIMATIONS: |
+ needs_redraw_ = true; |
+ |
+ // If we're already in the middle of a redraw, we don't need to |
+ // restart it. |
+ if (forced_redraw_state_ != FORCED_REDRAW_STATE_IDLE) |
+ return; |
+ |
+ needs_begin_main_frame_ = true; |
+ consecutive_checkerboard_animations_++; |
+ if (settings_.timeout_and_draw_when_animation_checkerboards && |
+ consecutive_checkerboard_animations_ >= |
+ settings_.maximum_number_of_failed_draws_before_draw_is_forced) { |
+ consecutive_checkerboard_animations_ = 0; |
+ // We need to force a draw, but it doesn't make sense to do this until |
+ // we've committed and have new textures. |
+ forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT; |
+ } |
+ break; |
+ 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 |
+ // anyway. |
+ needs_begin_main_frame_ = true; |
+ break; |
+ } |
+ |
+ last_draw_result_ = DRAW_SUCCESS; |
} |
void SchedulerStateMachine::WillPrepareTiles() { |
@@ -1032,47 +1116,8 @@ void SchedulerStateMachine::SetImplLatencyTakesPriority( |
impl_latency_takes_priority_ = impl_latency_takes_priority; |
} |
-void SchedulerStateMachine::DidDrawIfPossibleCompleted(DrawResult result) { |
- switch (result) { |
- case INVALID_RESULT: |
- NOTREACHED() << "Uninitialized DrawResult."; |
- break; |
- case DRAW_ABORTED_CANT_DRAW: |
- case DRAW_ABORTED_CONTEXT_LOST: |
- NOTREACHED() << "Invalid return value from DrawAndSwapIfPossible:" |
- << result; |
- break; |
- case DRAW_SUCCESS: |
- consecutive_checkerboard_animations_ = 0; |
- forced_redraw_state_ = FORCED_REDRAW_STATE_IDLE; |
- break; |
- case DRAW_ABORTED_CHECKERBOARD_ANIMATIONS: |
- needs_redraw_ = true; |
- |
- // If we're already in the middle of a redraw, we don't need to |
- // restart it. |
- if (forced_redraw_state_ != FORCED_REDRAW_STATE_IDLE) |
- return; |
- |
- needs_begin_main_frame_ = true; |
- consecutive_checkerboard_animations_++; |
- if (settings_.timeout_and_draw_when_animation_checkerboards && |
- consecutive_checkerboard_animations_ >= |
- settings_.maximum_number_of_failed_draws_before_draw_is_forced) { |
- consecutive_checkerboard_animations_ = 0; |
- // We need to force a draw, but it doesn't make sense to do this until |
- // we've committed and have new textures. |
- forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT; |
- } |
- break; |
- 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 |
- // anyway. |
- needs_begin_main_frame_ = true; |
- break; |
- } |
+void SchedulerStateMachine::SetDrawResult(DrawResult result) { |
+ last_draw_result_ = result; |
} |
void SchedulerStateMachine::SetNeedsBeginMainFrame() { |