Index: cc/scheduler/scheduler.cc |
diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc |
index 6d6ab2ac544fc86060f40b115870858a5a2e6de2..06d7aa1115bd7dbb0d3a51dff0bb246231d2c70a 100644 |
--- a/cc/scheduler/scheduler.cc |
+++ b/cc/scheduler/scheduler.cc |
@@ -14,6 +14,7 @@ |
#include "base/trace_event/trace_event_argument.h" |
#include "cc/debug/devtools_instrumentation.h" |
#include "cc/debug/traced_value.h" |
+#include "cc/scheduler/compositor_timing_history.h" |
#include "cc/scheduler/delay_based_time_source.h" |
namespace cc { |
@@ -23,7 +24,8 @@ scoped_ptr<Scheduler> Scheduler::Create( |
const SchedulerSettings& settings, |
int layer_tree_host_id, |
base::SingleThreadTaskRunner* task_runner, |
- BeginFrameSource* external_frame_source) { |
+ BeginFrameSource* external_frame_source, |
+ scoped_ptr<CompositorTimingHistory> compositor_timing_history) { |
scoped_ptr<SyntheticBeginFrameSource> synthetic_frame_source; |
if (!settings.use_external_begin_frame_source) { |
synthetic_frame_source = SyntheticBeginFrameSource::Create( |
@@ -33,7 +35,8 @@ scoped_ptr<Scheduler> Scheduler::Create( |
BackToBackBeginFrameSource::Create(task_runner); |
return make_scoped_ptr(new Scheduler( |
client, settings, layer_tree_host_id, task_runner, external_frame_source, |
- synthetic_frame_source.Pass(), unthrottled_frame_source.Pass())); |
+ synthetic_frame_source.Pass(), unthrottled_frame_source.Pass(), |
+ compositor_timing_history.Pass())); |
} |
Scheduler::Scheduler( |
@@ -43,7 +46,8 @@ Scheduler::Scheduler( |
base::SingleThreadTaskRunner* task_runner, |
BeginFrameSource* external_frame_source, |
scoped_ptr<SyntheticBeginFrameSource> synthetic_frame_source, |
- scoped_ptr<BackToBackBeginFrameSource> unthrottled_frame_source) |
+ scoped_ptr<BackToBackBeginFrameSource> unthrottled_frame_source, |
+ scoped_ptr<CompositorTimingHistory> compositor_timing_history) |
: settings_(settings), |
client_(client), |
layer_tree_host_id_(layer_tree_host_id), |
@@ -53,6 +57,7 @@ Scheduler::Scheduler( |
unthrottled_frame_source_(unthrottled_frame_source.Pass()), |
frame_source_(BeginFrameSourceMultiplexer::Create()), |
throttle_frame_production_(false), |
+ compositor_timing_history_(compositor_timing_history.Pass()), |
begin_impl_frame_deadline_mode_( |
SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_NONE), |
begin_impl_frame_tracker_(BEGINFRAMETRACKER_FROM_HERE), |
@@ -439,7 +444,7 @@ void Scheduler::BeginImplFrameWithDeadline(const BeginFrameArgs& args) { |
"MainThreadLatency", main_thread_is_in_high_latency_mode); |
BeginFrameArgs adjusted_args = args; |
- adjusted_args.deadline -= client_->DrawDurationEstimate(); |
+ adjusted_args.deadline -= compositor_timing_history_->DrawDurationEstimate(); |
if (!state_machine_.impl_latency_takes_priority() && |
main_thread_is_in_high_latency_mode && |
@@ -574,8 +579,16 @@ void Scheduler::OnBeginImplFrameDeadline() { |
} |
void Scheduler::DrawAndSwapIfPossible() { |
+ compositor_timing_history_->DidStartDrawing(); |
DrawResult result = client_->ScheduledActionDrawAndSwapIfPossible(); |
state_machine_.DidDrawIfPossibleCompleted(result); |
+ compositor_timing_history_->DidFinishDrawing(); |
+} |
+ |
+void Scheduler::DrawAndSwapForced() { |
+ compositor_timing_history_->DidStartDrawing(); |
+ client_->ScheduledActionDrawAndSwapForced(); |
+ compositor_timing_history_->DidFinishDrawing(); |
} |
void Scheduler::SetDeferCommits(bool defer_commits) { |
@@ -614,6 +627,7 @@ void Scheduler::ProcessScheduledActions() { |
client_->ScheduledActionAnimate(); |
break; |
case SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME: |
+ compositor_timing_history_->WillBeginMainFrame(); |
client_->ScheduledActionSendBeginMainFrame(); |
break; |
case SchedulerStateMachine::ACTION_COMMIT: { |
@@ -623,10 +637,12 @@ void Scheduler::ProcessScheduledActions() { |
FROM_HERE_WITH_EXPLICIT_FUNCTION( |
"461509 Scheduler::ProcessScheduledActions4")); |
client_->ScheduledActionCommit(); |
+ compositor_timing_history_->DidCommit(); |
break; |
} |
case SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE: |
client_->ScheduledActionActivateSyncTree(); |
+ compositor_timing_history_->DidActivateSyncTree(); |
break; |
case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE: { |
// TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is |
@@ -638,7 +654,7 @@ void Scheduler::ProcessScheduledActions() { |
break; |
} |
case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED: |
- client_->ScheduledActionDrawAndSwapForced(); |
+ DrawAndSwapForced(); |
break; |
case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT: |
// No action is actually performed, but this allows the state machine to |
@@ -703,15 +719,8 @@ void Scheduler::AsValueInto(base::trace_event::TracedValue* state) const { |
state->EndDictionary(); |
state->EndDictionary(); |
- state->BeginDictionary("client_state"); |
- state->SetDouble("draw_duration_estimate_ms", |
- client_->DrawDurationEstimate().InMillisecondsF()); |
- state->SetDouble( |
- "begin_main_frame_to_commit_duration_estimate_ms", |
- client_->BeginMainFrameToCommitDurationEstimate().InMillisecondsF()); |
- state->SetDouble( |
- "commit_to_activate_duration_estimate_ms", |
- client_->CommitToActivateDurationEstimate().InMillisecondsF()); |
+ state->BeginDictionary("compositor_timing_history"); |
+ compositor_timing_history_->AsValueInto(state); |
state->EndDictionary(); |
} |
@@ -722,8 +731,9 @@ bool Scheduler::CanCommitAndActivateBeforeDeadline() const { |
// Check if the main thread computation and commit can be finished before the |
// impl thread's deadline. |
base::TimeTicks estimated_draw_time = |
- args.frame_time + client_->BeginMainFrameToCommitDurationEstimate() + |
- client_->CommitToActivateDurationEstimate(); |
+ args.frame_time + |
+ compositor_timing_history_->BeginMainFrameToCommitDurationEstimate() + |
+ compositor_timing_history_->CommitToActivateDurationEstimate(); |
TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"), |
"CanCommitAndActivateBeforeDeadline", |