| Index: cc/scheduler/scheduler_state_machine.cc
|
| diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc
|
| index 3747c0b4a534096bc566e58dc4635e54ce396659..ed9c15f43f9d13af92e585dbf9ed58c608e99ecc 100644
|
| --- a/cc/scheduler/scheduler_state_machine.cc
|
| +++ b/cc/scheduler/scheduler_state_machine.cc
|
| @@ -15,6 +15,7 @@ SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings)
|
| commit_state_(COMMIT_STATE_IDLE),
|
| commit_count_(0),
|
| current_frame_number_(0),
|
| + last_frame_number_where_begin_frame_sent_to_main_thread_(-1),
|
| last_frame_number_where_draw_was_called_(-1),
|
| last_frame_number_where_tree_activation_attempted_(-1),
|
| last_frame_number_where_update_visible_tiles_was_called_(-1),
|
| @@ -24,6 +25,7 @@ SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings)
|
| swap_used_incomplete_tile_(false),
|
| needs_forced_redraw_(false),
|
| needs_forced_redraw_after_next_commit_(false),
|
| + needs_redraw_after_next_commit_(false),
|
| needs_commit_(false),
|
| needs_forced_commit_(false),
|
| expect_immediate_begin_frame_for_main_thread_(false),
|
| @@ -116,6 +118,19 @@ bool SchedulerStateMachine::HasUpdatedVisibleTilesThisFrame() const {
|
| last_frame_number_where_update_visible_tiles_was_called_;
|
| }
|
|
|
| +void SchedulerStateMachine::SetPostCommitFlags() {
|
| + // This post-commit work is common to both completed and aborted commits.
|
| + if (needs_forced_redraw_after_next_commit_) {
|
| + needs_forced_redraw_after_next_commit_ = false;
|
| + needs_forced_redraw_ = true;
|
| + }
|
| + if (needs_redraw_after_next_commit_) {
|
| + needs_redraw_after_next_commit_ = false;
|
| + needs_redraw_ = true;
|
| + }
|
| + texture_state_ = LAYER_TEXTURE_STATE_ACQUIRED_BY_IMPL_THREAD;
|
| +}
|
| +
|
| bool SchedulerStateMachine::DrawSuspendedUntilCommit() const {
|
| if (!can_draw_)
|
| return true;
|
| @@ -184,7 +199,7 @@ SchedulerStateMachine::Action SchedulerStateMachine::NextAction() const {
|
| return ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD;
|
|
|
| switch (commit_state_) {
|
| - case COMMIT_STATE_IDLE:
|
| + case COMMIT_STATE_IDLE: {
|
| if (output_surface_state_ != OUTPUT_SURFACE_ACTIVE &&
|
| needs_forced_redraw_)
|
| return ACTION_DRAW_FORCED;
|
| @@ -205,14 +220,18 @@ SchedulerStateMachine::Action SchedulerStateMachine::NextAction() const {
|
| return needs_forced_redraw_ ? ACTION_DRAW_FORCED
|
| : ACTION_DRAW_IF_POSSIBLE;
|
| }
|
| - if (needs_commit_ &&
|
| - ((visible_ && output_surface_state_ == OUTPUT_SURFACE_ACTIVE)
|
| - || needs_forced_commit_))
|
| + bool can_commit_this_frame =
|
| + visible_ &&
|
| + current_frame_number_ >
|
| + last_frame_number_where_begin_frame_sent_to_main_thread_;
|
| + if (needs_commit_ && ((can_commit_this_frame &&
|
| + output_surface_state_ == OUTPUT_SURFACE_ACTIVE) ||
|
| + needs_forced_commit_))
|
| // TODO(enne): Should probably drop the active tree on force commit.
|
| return has_pending_tree_ ? ACTION_NONE
|
| : ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD;
|
| return ACTION_NONE;
|
| -
|
| + }
|
| case COMMIT_STATE_FRAME_IN_PROGRESS:
|
| if (ShouldUpdateVisibleTiles())
|
| return ACTION_UPDATE_VISIBLE_TILES;
|
| @@ -239,7 +258,11 @@ SchedulerStateMachine::Action SchedulerStateMachine::NextAction() const {
|
| // COMMIT_STATE_WAITING_FOR_FIRST_DRAW wants to enforce a draw. If
|
| // can_draw_ is false or textures are not available, proceed to the next
|
| // step (similar as in COMMIT_STATE_IDLE).
|
| - bool can_commit = visible_ || needs_forced_commit_;
|
| + bool can_commit =
|
| + needs_forced_commit_ ||
|
| + (visible_ &&
|
| + current_frame_number_ >
|
| + last_frame_number_where_begin_frame_sent_to_main_thread_);
|
| if (needs_commit_ && can_commit && DrawSuspendedUntilCommit())
|
| return has_pending_tree_ ? ACTION_NONE
|
| : ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD;
|
| @@ -276,10 +299,16 @@ void SchedulerStateMachine::UpdateState(Action action) {
|
|
|
| case ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD:
|
| DCHECK(!has_pending_tree_);
|
| - DCHECK(visible_ || needs_forced_commit_);
|
| + if (!needs_forced_commit_) {
|
| + DCHECK(visible_);
|
| + DCHECK_GT(current_frame_number_,
|
| + last_frame_number_where_begin_frame_sent_to_main_thread_);
|
| + }
|
| commit_state_ = COMMIT_STATE_FRAME_IN_PROGRESS;
|
| needs_commit_ = false;
|
| needs_forced_commit_ = false;
|
| + last_frame_number_where_begin_frame_sent_to_main_thread_ =
|
| + current_frame_number_;
|
| return;
|
|
|
| case ACTION_COMMIT:
|
| @@ -293,13 +322,7 @@ void SchedulerStateMachine::UpdateState(Action action) {
|
| needs_redraw_ = true;
|
| if (draw_if_possible_failed_)
|
| last_frame_number_where_draw_was_called_ = -1;
|
| -
|
| - if (needs_forced_redraw_after_next_commit_) {
|
| - needs_forced_redraw_after_next_commit_ = false;
|
| - needs_forced_redraw_ = true;
|
| - }
|
| -
|
| - texture_state_ = LAYER_TEXTURE_STATE_ACQUIRED_BY_IMPL_THREAD;
|
| + SetPostCommitFlags();
|
| return;
|
|
|
| case ACTION_DRAW_FORCED:
|
| @@ -367,12 +390,12 @@ bool SchedulerStateMachine::ProactiveBeginFrameWantedByImplThread() const {
|
| }
|
|
|
| void SchedulerStateMachine::DidEnterBeginFrame(const BeginFrameArgs& args) {
|
| + current_frame_number_++;
|
| inside_begin_frame_ = true;
|
| last_begin_frame_args_ = args;
|
| }
|
|
|
| void SchedulerStateMachine::DidLeaveBeginFrame() {
|
| - current_frame_number_++;
|
| inside_begin_frame_ = false;
|
| }
|
|
|
| @@ -422,10 +445,13 @@ void SchedulerStateMachine::FinishCommit() {
|
| commit_state_ = COMMIT_STATE_READY_TO_COMMIT;
|
| }
|
|
|
| -void SchedulerStateMachine::BeginFrameAbortedByMainThread() {
|
| +void SchedulerStateMachine::BeginFrameAbortedByMainThread(bool did_handle) {
|
| DCHECK_EQ(commit_state_, COMMIT_STATE_FRAME_IN_PROGRESS);
|
| if (expect_immediate_begin_frame_for_main_thread_) {
|
| expect_immediate_begin_frame_for_main_thread_ = false;
|
| + } else if (did_handle) {
|
| + commit_state_ = COMMIT_STATE_IDLE;
|
| + SetPostCommitFlags();
|
| } else {
|
| commit_state_ = COMMIT_STATE_IDLE;
|
| SetNeedsCommit();
|
| @@ -458,6 +484,7 @@ void SchedulerStateMachine::DidCreateAndInitializeOutputSurface() {
|
| // sort themselves out with a commit.
|
| needs_redraw_ = false;
|
| }
|
| + needs_redraw_after_next_commit_ = true;
|
| did_create_and_initialize_first_output_surface_ = true;
|
| }
|
|
|
|
|