Chromium Code Reviews| Index: cc/scheduler/scheduler.cc |
| diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc |
| index cd0d37ea2a81c32d1d37d6698b3cf04c296d6e47..647340af077e7b4e3185e5b13175f92dfaa79f19 100644 |
| --- a/cc/scheduler/scheduler.cc |
| +++ b/cc/scheduler/scheduler.cc |
| @@ -460,10 +460,15 @@ void Scheduler::BeginImplFrameWithDeadline(const BeginFrameArgs& args) { |
| BeginFrameArgs adjusted_args = args; |
| adjusted_args.deadline -= compositor_timing_history_->DrawDurationEstimate(); |
| - if (!state_machine_.impl_latency_takes_priority() && |
| - main_thread_is_in_high_latency_mode && |
| - CanCommitAndActivateBeforeDeadline()) { |
| + if (ShouldRecoverMainLatency(adjusted_args)) { |
| + TRACE_EVENT_INSTANT0("cc", "SkipBeginMainFrameToReduceLatency", |
| + TRACE_EVENT_SCOPE_THREAD); |
| state_machine_.SetSkipNextBeginMainFrameToReduceLatency(); |
| + } else if (ShouldRecoverImplLatency(adjusted_args)) { |
| + TRACE_EVENT_INSTANT0("cc", "SkipBeginImplFrameToReduceLatency", |
| + TRACE_EVENT_SCOPE_THREAD); |
| + frame_source_->DidFinishFrame(begin_retro_frame_args_.size()); |
| + return; |
| } |
| BeginImplFrame(adjusted_args); |
| @@ -515,7 +520,6 @@ void Scheduler::ScheduleBeginImplFrameDeadline() { |
| begin_impl_frame_deadline_mode_ = |
| state_machine_.CurrentBeginImplFrameDeadlineMode(); |
| - |
| base::TimeTicks deadline; |
| switch (begin_impl_frame_deadline_mode_) { |
| case SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_NONE: |
| @@ -697,6 +701,8 @@ scoped_refptr<base::trace_event::ConvertableToTraceFormat> Scheduler::AsValue() |
| } |
| void Scheduler::AsValueInto(base::trace_event::TracedValue* state) const { |
| + base::TimeTicks now = Now(); |
| + |
| state->BeginDictionary("state_machine"); |
| state_machine_.AsValueInto(state); |
| state->EndDictionary(); |
| @@ -725,9 +731,14 @@ void Scheduler::AsValueInto(base::trace_event::TracedValue* state) const { |
| !begin_impl_frame_deadline_task_.IsCancelled()); |
| state->SetString("inside_action", |
| SchedulerStateMachine::ActionToString(inside_action_)); |
| + |
| state->BeginDictionary("begin_impl_frame_args"); |
| - begin_impl_frame_tracker_.AsValueInto(Now(), state); |
| + begin_impl_frame_tracker_.AsValueInto(now, state); |
| state->EndDictionary(); |
| + |
| + state->SetString("begin_impl_frame_deadline_mode_", |
| + SchedulerStateMachine::BeginImplFrameDeadlineModeToString( |
| + begin_impl_frame_deadline_mode_)); |
| state->EndDictionary(); |
| state->BeginDictionary("compositor_timing_history"); |
| @@ -740,10 +751,45 @@ void Scheduler::UpdateCompositorTimingHistoryRecordingEnabled() { |
| state_machine_.HasInitializedOutputSurface() && state_machine_.visible()); |
| } |
| -bool Scheduler::CanCommitAndActivateBeforeDeadline() const { |
| - BeginFrameArgs args = |
| - begin_impl_frame_tracker_.DangerousMethodCurrentOrLast(); |
| +bool Scheduler::ShouldRecoverMainLatency(const BeginFrameArgs& args) const { |
| + if (!state_machine_.MainThreadIsInHighLatencyMode()) |
| + return false; |
| + |
| + if (state_machine_.impl_latency_takes_priority()) |
|
sunnyps
2015/07/08 22:37:12
Might be better to check if deadline mode != LATE.
sunnyps
2015/07/08 22:40:07
I should clarify what I mean here: we should check
brianderson
2015/07/09 01:28:11
We might not wait for the commit because active_tr
|
| + return false; |
| + |
| + return CanCommitAndActivateBeforeDeadline(args); |
| +} |
| + |
| +bool Scheduler::ShouldRecoverImplLatency(const BeginFrameArgs& args) const { |
| + if (!state_machine_.SwapThrottled()) |
| + return false; |
| + // The deadline may be in the past if our draw time is too long. |
| + bool frame_time_is_before_deadline = args.frame_time < args.deadline; |
| + |
| + SchedulerStateMachine::BeginImplFrameDeadlineMode |
| + next_begin_impl_frame_deadline_mode = |
| + state_machine_.CurrentBeginImplFrameDeadlineMode(); |
| + switch (next_begin_impl_frame_deadline_mode) { |
| + case SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_NONE: |
| + return false; |
| + case SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_IMMEDIATE: |
| + return frame_time_is_before_deadline; |
| + case SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_REGULAR: |
| + return frame_time_is_before_deadline; |
| + case SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_LATE: |
| + return CanCommitAndActivateBeforeDeadline(args); |
| + case SchedulerStateMachine:: |
| + BEGIN_IMPL_FRAME_DEADLINE_MODE_BLOCKED_ON_READY_TO_DRAW: |
|
sunnyps
2015/07/08 22:37:12
Would be great if we had comments explaining each
brianderson
2015/07/09 01:28:11
In writing the comments, I realized I can't rely d
sunnyps
2015/07/09 23:44:30
Oh yeah! Nice catch.
|
| + return false; |
| + } |
| + NOTREACHED(); |
| + return false; |
| +} |
| + |
| +bool Scheduler::CanCommitAndActivateBeforeDeadline( |
| + const BeginFrameArgs& args) const { |
| // Check if the main thread computation and commit can be finished before the |
| // impl thread's deadline. |
| base::TimeTicks estimated_draw_time = |
| @@ -752,12 +798,6 @@ bool Scheduler::CanCommitAndActivateBeforeDeadline() const { |
| compositor_timing_history_->CommitToReadyToActivateDurationEstimate() + |
| compositor_timing_history_->ActivateDurationEstimate(); |
| - 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 < args.deadline; |
| } |