Chromium Code Reviews| Index: cc/scheduler/scheduler.cc |
| diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc |
| index 143c3ff54489573b1e22bf3a2a35ee17fecb1d95..1cd2e0f697fd9e94f6f1b7da5cc6aca3b216b05a 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() |
|
brianderson
2014/12/18 02:01:38
Why don't you need the check anymore?
mithro-old
2014/12/18 17:22:41
begin_impl_frame_args is now a BeginFrameTracker o
|
| - ? 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(adjusted_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 { |