| Index: cc/scheduler/scheduler.cc
|
| diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc
|
| index 535d1056bd382eb5d31c23b736787b2cb7db7672..1664896cc8588c538567d7e9c26127529f792276 100644
|
| --- a/cc/scheduler/scheduler.cc
|
| +++ b/cc/scheduler/scheduler.cc
|
| @@ -168,6 +168,11 @@ void Scheduler::NotifyReadyToActivate() {
|
| ProcessScheduledActions();
|
| }
|
|
|
| +void Scheduler::SetRequiresHighResToDraw(bool required) {
|
| + state_machine_.SetRequiresHighResToDraw(required);
|
| + ProcessScheduledActions();
|
| +}
|
| +
|
| void Scheduler::NotifyReadyToDraw() {
|
| // Future work might still needed for crbug.com/352894.
|
| state_machine_.NotifyReadyToDraw();
|
| @@ -199,9 +204,8 @@ void Scheduler::SetNeedsAnimate() {
|
| ProcessScheduledActions();
|
| }
|
|
|
| -void Scheduler::SetNeedsPrepareTiles() {
|
| - DCHECK(!IsInsideAction(SchedulerStateMachine::ACTION_PREPARE_TILES));
|
| - state_machine_.SetNeedsPrepareTiles();
|
| +void Scheduler::SetNeedsPrepareTiles(bool for_commit) {
|
| + state_machine_.SetNeedsPrepareTiles(for_commit);
|
| ProcessScheduledActions();
|
| }
|
|
|
| @@ -247,10 +251,6 @@ void Scheduler::BeginMainFrameAborted(CommitEarlyOutReason reason) {
|
| ProcessScheduledActions();
|
| }
|
|
|
| -void Scheduler::DidPrepareTiles() {
|
| - state_machine_.DidPrepareTiles();
|
| -}
|
| -
|
| void Scheduler::DidLoseOutputSurface() {
|
| TRACE_EVENT0("cc", "Scheduler::DidLoseOutputSurface");
|
| begin_retro_frame_args_.clear();
|
| @@ -291,8 +291,9 @@ base::TimeTicks Scheduler::LastBeginImplFrameTime() {
|
| void Scheduler::SetupNextBeginFrameIfNeeded() {
|
| // Never call SetNeedsBeginFrames if the frame source already has the right
|
| // value.
|
| - if (frame_source_->NeedsBeginFrames() != state_machine_.BeginFrameNeeded()) {
|
| - if (state_machine_.BeginFrameNeeded()) {
|
| + bool begin_frames_needed = state_machine_.BeginFrameNeeded();
|
| + if (frame_source_->NeedsBeginFrames() != begin_frames_needed) {
|
| + if (begin_frames_needed) {
|
| // Call SetNeedsBeginFrames(true) as soon as possible.
|
| frame_source_->SetNeedsBeginFrames(true);
|
| } else if (state_machine_.begin_impl_frame_state() ==
|
| @@ -301,6 +302,7 @@ void Scheduler::SetupNextBeginFrameIfNeeded() {
|
| frame_source_->SetNeedsBeginFrames(false);
|
| client_->SendBeginMainFrameNotExpectedSoon();
|
| }
|
| + state_machine_.NotifyBeginFrameSourceActive(begin_frames_needed);
|
| }
|
|
|
| PostBeginRetroFrameIfNeeded();
|
| @@ -518,6 +520,30 @@ void Scheduler::BeginImplFrameSynchronous(const BeginFrameArgs& args) {
|
| FinishImplFrame();
|
| }
|
|
|
| +// Retry the BeginImplFrame if the draw aborted due to checkerboards and
|
| +// we need a new commit to get a new RasterSource.
|
| +void Scheduler::RetryBeginImplFrameWithDeadline() {
|
| + TRACE_EVENT0("cc", "Scheduler::RetryBeginImplFrameWithDeadline");
|
| + state_machine_.ResetRetryBeginImplFrame();
|
| +
|
| + BeginImplFrame();
|
| +
|
| + // The deadline will be scheduled in ProcessScheduledActions.
|
| + state_machine_.OnBeginImplFrameDeadlinePending();
|
| + ProcessScheduledActions();
|
| +}
|
| +
|
| +// Retry the deadline if the draw aborted due to checkerboards, but we
|
| +// do not need a new commit to get a new RasterSource.
|
| +void Scheduler::RetryBeginImplFrameDeadline() {
|
| + TRACE_EVENT0("cc", "Scheduler::RetryImplFrameDeadline");
|
| + state_machine_.ResetRetryBeginImplFrame();
|
| +
|
| + // The deadline will be scheduled in ProcessScheduledActions.
|
| + state_machine_.OnBeginImplFrameDeadlinePending();
|
| + ProcessScheduledActions();
|
| +}
|
| +
|
| void Scheduler::FinishImplFrame() {
|
| state_machine_.OnBeginImplFrameIdle();
|
| ProcessScheduledActions();
|
| @@ -575,6 +601,13 @@ void Scheduler::ScheduleBeginImplFrameDeadline() {
|
| begin_impl_frame_args_.frame_time + begin_impl_frame_args_.interval;
|
| break;
|
| case SchedulerStateMachine::
|
| + BEGIN_IMPL_FRAME_DEADLINE_MODE_TRY_TO_AVOID_CHECKERBOARD:
|
| + // We will wait up until this deadline for the ReadyToDraw signal.
|
| + // TODO(brianderson): Use a different timeout for touch vs. mouse wheel.
|
| + deadline = begin_impl_frame_args_.frame_time +
|
| + (5 * begin_impl_frame_args_.interval);
|
| + break;
|
| + case SchedulerStateMachine::
|
| BEGIN_IMPL_FRAME_DEADLINE_MODE_BLOCKED_ON_READY_TO_DRAW:
|
| // We are blocked because we are waiting for ReadyToDraw signal. We would
|
| // post deadline after we received ReadyToDraw singal.
|
| @@ -626,7 +659,14 @@ void Scheduler::OnBeginImplFrameDeadline() {
|
| "461509 Scheduler::OnBeginImplFrameDeadline1"));
|
| state_machine_.OnBeginImplFrameDeadline();
|
| ProcessScheduledActions();
|
| - FinishImplFrame();
|
| +
|
| + if (state_machine_.retry_begin_impl_frame()) {
|
| + RetryBeginImplFrameWithDeadline();
|
| + } else if (state_machine_.retry_begin_impl_frame_deadline()) {
|
| + RetryBeginImplFrameDeadline();
|
| + } else {
|
| + FinishImplFrame();
|
| + }
|
| }
|
|
|
|
|
| @@ -638,7 +678,12 @@ void Scheduler::PollToAdvanceCommitState() {
|
|
|
| void Scheduler::DrawAndSwapIfPossible() {
|
| DrawResult result = client_->ScheduledActionDrawAndSwapIfPossible();
|
| - state_machine_.DidDrawIfPossibleCompleted(result);
|
| + state_machine_.SetDrawResult(result);
|
| +}
|
| +
|
| +void Scheduler::DrawAndSwapForced() {
|
| + DrawResult result = client_->ScheduledActionDrawAndSwapForced();
|
| + state_machine_.SetDrawResult(result);
|
| }
|
|
|
| void Scheduler::SetDeferCommits(bool defer_commits) {
|
| @@ -667,9 +712,9 @@ void Scheduler::ProcessScheduledActions() {
|
| DVLOG(2) << "Scheduler::ProcessScheduledActions: "
|
| << SchedulerStateMachine::ActionToString(action) << " "
|
| << state_machine_.GetStatesForDebugging();
|
| - state_machine_.UpdateState(action);
|
| base::AutoReset<SchedulerStateMachine::Action>
|
| mark_inside_action(&inside_action_, action);
|
| + state_machine_.WillAction(action);
|
| switch (action) {
|
| case SchedulerStateMachine::ACTION_NONE:
|
| break;
|
| @@ -718,6 +763,7 @@ void Scheduler::ProcessScheduledActions() {
|
| break;
|
| }
|
| }
|
| + state_machine_.DidAction(action);
|
| } while (action != SchedulerStateMachine::ACTION_NONE);
|
|
|
| SetupPollingMechanisms();
|
|
|