| Index: cc/scheduler/scheduler.cc
|
| diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc
|
| index 143c3ff54489573b1e22bf3a2a35ee17fecb1d95..12f7646590df02cc257bafbb0c9ad149202aa5b8 100644
|
| --- a/cc/scheduler/scheduler.cc
|
| +++ b/cc/scheduler/scheduler.cc
|
| @@ -91,6 +91,7 @@ Scheduler::Scheduler(
|
| task_runner_(task_runner),
|
| power_monitor_(power_monitor),
|
| begin_retro_frame_posted_(false),
|
| + begin_impl_frame_args_(BEGINFRAMETRACKER_FROM_HERE),
|
| state_machine_(scheduler_settings),
|
| inside_process_scheduled_actions_(false),
|
| inside_action_(SchedulerStateMachine::ACTION_NONE),
|
| @@ -293,19 +294,18 @@ void Scheduler::NotifyBeginMainFrameStarted() {
|
| }
|
|
|
| base::TimeTicks Scheduler::AnticipatedDrawTime() const {
|
| - if (!frame_source_->NeedsBeginFrames() ||
|
| - begin_impl_frame_args_.interval <= base::TimeDelta())
|
| + if (!frame_source_->NeedsBeginFrames())
|
| return base::TimeTicks();
|
|
|
| base::TimeTicks now = Now();
|
| - base::TimeTicks timebase = std::max(begin_impl_frame_args_.frame_time,
|
| - begin_impl_frame_args_.deadline);
|
| - int64 intervals = 1 + ((now - timebase) / begin_impl_frame_args_.interval);
|
| - return timebase + (begin_impl_frame_args_.interval * intervals);
|
| + BeginFrameArgs args = begin_impl_frame_args_.Get();
|
| + base::TimeTicks timebase = std::max(args.frame_time, args.deadline);
|
| + int64 intervals = 1 + ((now - timebase) / begin_impl_frame_args_.Interval());
|
| + return timebase + (begin_impl_frame_args_.Interval() * intervals);
|
| }
|
|
|
| base::TimeTicks Scheduler::LastBeginImplFrameTime() {
|
| - return begin_impl_frame_args_.frame_time;
|
| + return begin_impl_frame_args_.Get().frame_time;
|
| }
|
|
|
| void Scheduler::SetupNextBeginFrameIfNeeded() {
|
| @@ -349,9 +349,7 @@ void Scheduler::SetupPollingMechanisms(bool needs_begin_frame) {
|
| DCHECK(!needs_begin_frame);
|
| if (poll_for_draw_triggers_task_.IsCancelled()) {
|
| poll_for_draw_triggers_task_.Reset(poll_for_draw_triggers_closure_);
|
| - base::TimeDelta delay = begin_impl_frame_args_.IsValid()
|
| - ? begin_impl_frame_args_.interval
|
| - : BeginFrameArgs::DefaultInterval();
|
| + base::TimeDelta delay = begin_impl_frame_args_.Interval();
|
| task_runner_->PostDelayedTask(
|
| FROM_HERE, poll_for_draw_triggers_task_.callback(), delay);
|
| }
|
| @@ -373,13 +371,13 @@ void Scheduler::SetupPollingMechanisms(bool needs_begin_frame) {
|
|
|
| if (needs_advance_commit_state_timer) {
|
| if (advance_commit_state_task_.IsCancelled() &&
|
| - begin_impl_frame_args_.IsValid()) {
|
| + begin_impl_frame_args_.Get().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_task_.Reset(advance_commit_state_closure_);
|
| task_runner_->PostDelayedTask(FROM_HERE,
|
| advance_commit_state_task_.callback(),
|
| - begin_impl_frame_args_.interval * 2);
|
| + begin_impl_frame_args_.Interval() * 2);
|
| }
|
| } else {
|
| advance_commit_state_task_.Cancel();
|
| @@ -393,6 +391,11 @@ void Scheduler::SetupPollingMechanisms(bool needs_begin_frame) {
|
| bool Scheduler::OnBeginFrameMixInDelegate(const BeginFrameArgs& args) {
|
| TRACE_EVENT1("cc", "Scheduler::BeginFrame", "args", args.AsValue());
|
|
|
| + // Trace this begin frame time through the Chrome stack
|
| + TRACE_EVENT_FLOW_BEGIN0(
|
| + TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.frames"), "BeginFrameArgs",
|
| + args.frame_time.ToInternalValue());
|
| +
|
| // Deliver BeginFrames to children.
|
| if (settings_.forward_begin_frames_to_children &&
|
| state_machine_.children_need_begin_frames()) {
|
| @@ -543,8 +546,8 @@ void Scheduler::BeginImplFrame(const BeginFrameArgs& args) {
|
|
|
| advance_commit_state_task_.Cancel();
|
|
|
| - begin_impl_frame_args_ = args;
|
| - begin_impl_frame_args_.deadline -= client_->DrawDurationEstimate();
|
| + BeginFrameArgs adjusted_args = args;
|
| + adjusted_args.deadline -= client_->DrawDurationEstimate();
|
|
|
| if (!state_machine_.impl_latency_takes_priority() &&
|
| main_thread_is_in_high_latency_mode &&
|
| @@ -552,8 +555,9 @@ void Scheduler::BeginImplFrame(const BeginFrameArgs& args) {
|
| state_machine_.SetSkipNextBeginMainFrameToReduceLatency();
|
| }
|
|
|
| - client_->WillBeginImplFrame(begin_impl_frame_args_);
|
| - state_machine_.OnBeginImplFrame(begin_impl_frame_args_);
|
| + begin_impl_frame_args_.Start(args);
|
| + client_->WillBeginImplFrame(begin_impl_frame_args_.Get());
|
| + state_machine_.OnBeginImplFrame(begin_impl_frame_args_.Get());
|
| devtools_instrumentation::DidBeginFrame(layer_tree_host_id_);
|
|
|
| ProcessScheduledActions();
|
| @@ -591,14 +595,14 @@ void Scheduler::ScheduleBeginImplFrameDeadline() {
|
| break;
|
| case SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_REGULAR:
|
| // We are animating on the impl thread but we can wait for some time.
|
| - deadline = begin_impl_frame_args_.deadline;
|
| + deadline = begin_impl_frame_args_.Get().deadline;
|
| break;
|
| case SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_LATE:
|
| // We are blocked for one reason or another and we should wait.
|
| // TODO(brianderson): Handle long deadlines (that are past the next
|
| // frame's frame time) properly instead of using this hack.
|
| - deadline =
|
| - begin_impl_frame_args_.frame_time + begin_impl_frame_args_.interval;
|
| + deadline = begin_impl_frame_args_.Get().frame_time +
|
| + begin_impl_frame_args_.Get().interval;
|
| break;
|
| }
|
|
|
| @@ -640,6 +644,7 @@ void Scheduler::OnBeginImplFrameDeadline() {
|
| state_machine_.OnBeginImplFrameIdle();
|
| ProcessScheduledActions();
|
|
|
| + begin_impl_frame_args_.Finish();
|
| client_->DidBeginImplFrameDeadline();
|
| }
|
|
|
| @@ -763,7 +768,7 @@ void Scheduler::AsValueInto(base::debug::TracedValue* state) const {
|
| state->SetBoolean("advance_commit_state_task_",
|
| !advance_commit_state_task_.IsCancelled());
|
| state->BeginDictionary("begin_impl_frame_args");
|
| - begin_impl_frame_args_.AsValueInto(state);
|
| + begin_impl_frame_args_.Get().AsValueInto(state);
|
| state->EndDictionary();
|
|
|
| state->EndDictionary();
|
| @@ -781,22 +786,21 @@ void Scheduler::AsValueInto(base::debug::TracedValue* state) const {
|
| }
|
|
|
| bool Scheduler::CanCommitAndActivateBeforeDeadline() const {
|
| + BeginFrameArgs args = begin_impl_frame_args_.Get();
|
| +
|
| // Check if the main thread computation and commit can be finished before the
|
| // impl thread's deadline.
|
| base::TimeTicks estimated_draw_time =
|
| - begin_impl_frame_args_.frame_time +
|
| - client_->BeginMainFrameToCommitDurationEstimate() +
|
| + args.frame_time + client_->BeginMainFrameToCommitDurationEstimate() +
|
| client_->CommitToActivateDurationEstimate();
|
|
|
| - TRACE_EVENT2(
|
| - TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"),
|
| - "CanCommitAndActivateBeforeDeadline",
|
| - "time_left_after_drawing_ms",
|
| - (begin_impl_frame_args_.deadline - estimated_draw_time).InMillisecondsF(),
|
| - "state",
|
| - AsValue());
|
| + TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"),
|
| + "CanCommitAndActivateBeforeDeadline",
|
| + "time_left_after_drawing_ms",
|
| + (args.deadline - estimated_draw_time).InMillisecondsF(), "state",
|
| + AsValue());
|
|
|
| - return estimated_draw_time < begin_impl_frame_args_.deadline;
|
| + return estimated_draw_time < args.deadline;
|
| }
|
|
|
| bool Scheduler::IsBeginMainFrameSentOrStarted() const {
|
|
|