| Index: cc/scheduler/scheduler_state_machine.cc
|
| diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc
|
| index dbc026ca9f2e6be8403ec95fc7509ed13adcd6d6..df0ad9b0134d1801854a84f4c26247d5fad1c32c 100644
|
| --- a/cc/scheduler/scheduler_state_machine.cc
|
| +++ b/cc/scheduler/scheduler_state_machine.cc
|
| @@ -223,6 +223,7 @@ bool SchedulerStateMachine::ShouldDraw() const {
|
| return !active_tree_has_been_drawn_ &&
|
| (commit_state_ == COMMIT_STATE_WAITING_FOR_FIRST_DRAW ||
|
| commit_state_ == COMMIT_STATE_WAITING_FOR_ACTIVATION ||
|
| + commit_state_ == COMMIT_STATE_WAITING_FOR_ACTIVATION_AND_FRAME_IN_PROGRESS ||
|
| (output_surface_state_ != OUTPUT_SURFACE_ACTIVE &&
|
| !active_tree_is_null_));
|
| }
|
| @@ -306,12 +307,13 @@ bool SchedulerStateMachine::ShouldSendBeginFrameToMainThread() const {
|
| return false;
|
|
|
| // Only send BeginFrame to the main thread when idle.
|
| - if (commit_state_ != COMMIT_STATE_IDLE)
|
| + if (commit_state_ != COMMIT_STATE_IDLE &&
|
| + commit_state_ != COMMIT_STATE_WAITING_FOR_ACTIVATION)
|
| return false;
|
|
|
| // We can't accept a commit if we have a pending tree.
|
| - if (has_pending_tree_)
|
| - return false;
|
| + //if (has_pending_tree_)
|
| + // return false;
|
|
|
| // We want to handle readback commits ASAP.
|
| if (readback_state_ == READBACK_STATE_FORCED_COMMIT_REQUESTED)
|
| @@ -381,6 +383,7 @@ SchedulerStateMachine::Action SchedulerStateMachine::NextAction() const {
|
| return ACTION_NONE;
|
|
|
| case COMMIT_STATE_FRAME_IN_PROGRESS:
|
| + case COMMIT_STATE_WAITING_FOR_ACTIVATION_AND_FRAME_IN_PROGRESS:
|
| if (ShouldUpdateVisibleTiles())
|
| return ACTION_UPDATE_VISIBLE_TILES;
|
| if (ShouldActivatePendingTree())
|
| @@ -398,6 +401,8 @@ SchedulerStateMachine::Action SchedulerStateMachine::NextAction() const {
|
| return ACTION_COMMIT;
|
|
|
| case COMMIT_STATE_WAITING_FOR_ACTIVATION: {
|
| + if (ShouldSendBeginFrameToMainThread())
|
| + return ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD;
|
| if (ShouldUpdateVisibleTiles())
|
| return ACTION_UPDATE_VISIBLE_TILES;
|
| if (ShouldActivatePendingTree())
|
| @@ -452,12 +457,15 @@ void SchedulerStateMachine::UpdateState(Action action) {
|
| return;
|
|
|
| case ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD:
|
| - DCHECK(!has_pending_tree_);
|
| + //DCHECK(!has_pending_tree_);
|
| DCHECK(visible_ ||
|
| readback_state_ == READBACK_STATE_FORCED_COMMIT_REQUESTED ||
|
| forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_COMMIT ||
|
| output_surface_state_ == OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT);
|
| - commit_state_ = COMMIT_STATE_FRAME_IN_PROGRESS;
|
| + if (commit_state_ == COMMIT_STATE_WAITING_FOR_ACTIVATION)
|
| + commit_state_ = COMMIT_STATE_WAITING_FOR_ACTIVATION_AND_FRAME_IN_PROGRESS;
|
| + else
|
| + commit_state_ = COMMIT_STATE_FRAME_IN_PROGRESS;
|
| needs_commit_ = false;
|
| if (readback_state_ == READBACK_STATE_FORCED_COMMIT_REQUESTED)
|
| readback_state_ = READBACK_STATE_FORCED_COMMIT_PENDING;
|
| @@ -632,7 +640,8 @@ void SchedulerStateMachine::SetNeedsCommit() { needs_commit_ = true; }
|
| void SchedulerStateMachine::SetNeedsForcedCommitForReadback() {
|
| DCHECK(readback_state_ == READBACK_STATE_IDLE ||
|
| readback_state_ == READBACK_STATE_REPLACEMENT_COMMIT_PENDING);
|
| - if (commit_state_ == COMMIT_STATE_FRAME_IN_PROGRESS)
|
| + if (commit_state_ == COMMIT_STATE_FRAME_IN_PROGRESS ||
|
| + commit_state_ == COMMIT_STATE_WAITING_FOR_ACTIVATION_AND_FRAME_IN_PROGRESS)
|
| readback_state_ = READBACK_STATE_FORCED_COMMIT_PENDING;
|
| else
|
| readback_state_ = READBACK_STATE_FORCED_COMMIT_REQUESTED;
|
| @@ -640,13 +649,15 @@ void SchedulerStateMachine::SetNeedsForcedCommitForReadback() {
|
|
|
| void SchedulerStateMachine::FinishCommit() {
|
| DCHECK(commit_state_ == COMMIT_STATE_FRAME_IN_PROGRESS ||
|
| + commit_state_ == COMMIT_STATE_WAITING_FOR_ACTIVATION_AND_FRAME_IN_PROGRESS ||
|
| readback_state_ == READBACK_STATE_FORCED_COMMIT_PENDING)
|
| << ToString();
|
| commit_state_ = COMMIT_STATE_READY_TO_COMMIT;
|
| }
|
|
|
| void SchedulerStateMachine::BeginFrameAbortedByMainThread(bool did_handle) {
|
| - DCHECK_EQ(commit_state_, COMMIT_STATE_FRAME_IN_PROGRESS);
|
| + DCHECK(commit_state_ == COMMIT_STATE_FRAME_IN_PROGRESS ||
|
| + commit_state_ == COMMIT_STATE_WAITING_FOR_ACTIVATION_AND_FRAME_IN_PROGRESS);
|
| if (readback_state_ == READBACK_STATE_FORCED_COMMIT_REQUESTED) {
|
| readback_state_ = READBACK_STATE_IDLE;
|
| } else if (did_handle) {
|
| @@ -688,7 +699,8 @@ void SchedulerStateMachine::SetHasTrees(bool has_pending_tree,
|
| if (output_surface_state_ == OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION)
|
| output_surface_state_ = OUTPUT_SURFACE_ACTIVE;
|
|
|
| - DCHECK_EQ(COMMIT_STATE_WAITING_FOR_ACTIVATION, commit_state_);
|
| + DCHECK(commit_state_ == COMMIT_STATE_WAITING_FOR_ACTIVATION ||
|
| + commit_state_ == COMMIT_STATE_WAITING_FOR_ACTIVATION_AND_FRAME_IN_PROGRESS);
|
| if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION) {
|
| commit_state_ = COMMIT_STATE_WAITING_FOR_FIRST_DRAW;
|
| forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_DRAW;
|
| @@ -696,7 +708,10 @@ void SchedulerStateMachine::SetHasTrees(bool has_pending_tree,
|
| commit_state_ = COMMIT_STATE_WAITING_FOR_FIRST_DRAW;
|
| readback_state_ = READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK;
|
| } else {
|
| - commit_state_ = COMMIT_STATE_IDLE;
|
| + if (commit_state_ == COMMIT_STATE_WAITING_FOR_ACTIVATION_AND_FRAME_IN_PROGRESS)
|
| + commit_state_ = COMMIT_STATE_FRAME_IN_PROGRESS;
|
| + else
|
| + commit_state_ = COMMIT_STATE_IDLE;
|
| if (readback_state_ == READBACK_STATE_REPLACEMENT_COMMIT_ACTIVATING)
|
| readback_state_ = READBACK_STATE_IDLE;
|
| }
|
|
|