| Index: cc/scheduler/scheduler.cc
|
| diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc
|
| index d80b5355f496c3041c484d59112e87355d68dbb1..b6f92a45205980a2f9d946cb7ad0d56a913362d1 100644
|
| --- a/cc/scheduler/scheduler.cc
|
| +++ b/cc/scheduler/scheduler.cc
|
| @@ -202,20 +202,21 @@ void Scheduler::SetupNextBeginImplFrameIfNeeded() {
|
| needs_advance_commit_state_timer = true;
|
| }
|
| }
|
| - if (needs_advance_commit_state_timer !=
|
| - advance_commit_state_timer_.IsRunning()) {
|
| - if (needs_advance_commit_state_timer &&
|
| +
|
| + if (needs_advance_commit_state_timer) {
|
| + if (advance_commit_state_closure_.IsCancelled() &&
|
| last_begin_impl_frame_args_.IsValid()) {
|
| // Since we'd rather get a BeginImplFrame by the normal mechanism, we
|
| // set the interval to twice the interval from the previous frame.
|
| - advance_commit_state_timer_.Start(
|
| + advance_commit_state_closure_.Reset(base::Bind(
|
| + &Scheduler::PollToAdvanceCommitState, weak_factory_.GetWeakPtr()));
|
| + impl_task_runner_->PostDelayedTask(
|
| FROM_HERE,
|
| - last_begin_impl_frame_args_.interval * 2,
|
| - base::Bind(&Scheduler::ProcessScheduledActions,
|
| - base::Unretained(this)));
|
| - } else {
|
| - advance_commit_state_timer_.Stop();
|
| + advance_commit_state_closure_.callback(),
|
| + last_begin_impl_frame_args_.interval * 2);
|
| }
|
| + } else {
|
| + advance_commit_state_closure_.Cancel();
|
| }
|
| }
|
|
|
| @@ -225,6 +226,8 @@ void Scheduler::BeginImplFrame(const BeginFrameArgs& args) {
|
| SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE);
|
| DCHECK(state_machine_.HasInitializedOutputSurface());
|
|
|
| + advance_commit_state_closure_.Cancel();
|
| +
|
| last_begin_impl_frame_args_ = args;
|
| last_begin_impl_frame_args_.deadline -= client_->DrawDurationEstimate();
|
|
|
| @@ -320,6 +323,12 @@ void Scheduler::PollForAnticipatedDrawTriggers() {
|
| state_machine_.DidLeavePollForAnticipatedDrawTriggers();
|
| }
|
|
|
| +void Scheduler::PollToAdvanceCommitState() {
|
| + TRACE_EVENT0("cc", "Scheduler::PollToAdvanceCommitState");
|
| + advance_commit_state_closure_.Cancel();
|
| + ProcessScheduledActions();
|
| +}
|
| +
|
| bool Scheduler::IsBeginMainFrameSent() const {
|
| return state_machine_.commit_state() ==
|
| SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT;
|
| @@ -427,8 +436,8 @@ scoped_ptr<base::Value> Scheduler::StateAsValue() const {
|
| !begin_impl_frame_deadline_closure_.IsCancelled());
|
| scheduler_state->SetBoolean("poll_for_draw_triggers_closure_",
|
| !poll_for_draw_triggers_closure_.IsCancelled());
|
| - scheduler_state->SetBoolean("advance_commit_state_timer_",
|
| - advance_commit_state_timer_.IsRunning());
|
| + scheduler_state->SetBoolean("advance_commit_state_closure_",
|
| + !advance_commit_state_closure_.IsCancelled());
|
| state->Set("scheduler_state", scheduler_state.release());
|
|
|
| scoped_ptr<base::DictionaryValue> client_state(new base::DictionaryValue);
|
|
|