Index: cc/scheduler/compositor_timing_history.cc |
diff --git a/cc/scheduler/compositor_timing_history.cc b/cc/scheduler/compositor_timing_history.cc |
index f3ac0670525bd31d389c2008aebfd5c743649364..7f6e92563c46333ea287543a9925b085b39f573b 100644 |
--- a/cc/scheduler/compositor_timing_history.cc |
+++ b/cc/scheduler/compositor_timing_history.cc |
@@ -50,6 +50,9 @@ class CompositorTimingHistory::UMAReporter { |
base::TimeDelta estimate, |
bool affects_estimate) = 0; |
virtual void AddSwapToAckLatency(base::TimeDelta duration) = 0; |
+ |
+ // Synchronization measurements |
+ virtual void AddMainAndImplFrameTimeDelta(base::TimeDelta delta) = 0; |
}; |
namespace { |
@@ -216,6 +219,11 @@ class RendererUMAReporter : public CompositorTimingHistory::UMAReporter { |
UMA_HISTOGRAM_CUSTOM_TIMES_MICROS("Scheduling.Renderer.SwapToAckLatency", |
duration); |
} |
+ |
+ void AddMainAndImplFrameTimeDelta(base::TimeDelta delta) override { |
+ UMA_HISTOGRAM_CUSTOM_TIMES_MICROS( |
+ "Scheduling.Renderer.MainAndImplFrameTimeDelta", delta); |
+ } |
}; |
class BrowserUMAReporter : public CompositorTimingHistory::UMAReporter { |
@@ -297,6 +305,11 @@ class BrowserUMAReporter : public CompositorTimingHistory::UMAReporter { |
UMA_HISTOGRAM_CUSTOM_TIMES_MICROS("Scheduling.Browser.SwapToAckLatency", |
duration); |
} |
+ |
+ void AddMainAndImplFrameTimeDelta(base::TimeDelta delta) override { |
+ UMA_HISTOGRAM_CUSTOM_TIMES_MICROS( |
+ "Scheduling.Browser.MainAndImplFrameTimeDelta", delta); |
+ } |
}; |
class NullUMAReporter : public CompositorTimingHistory::UMAReporter { |
@@ -331,6 +344,7 @@ class NullUMAReporter : public CompositorTimingHistory::UMAReporter { |
base::TimeDelta estimate, |
bool affects_estimate) override {} |
void AddSwapToAckLatency(base::TimeDelta duration) override {} |
+ void AddMainAndImplFrameTimeDelta(base::TimeDelta delta) override {} |
}; |
} // namespace |
@@ -491,10 +505,14 @@ void CompositorTimingHistory::BeginImplFrameNotExpectedSoon() { |
SetCompositorDrawingContinuously(false); |
} |
-void CompositorTimingHistory::WillBeginMainFrame(bool on_critical_path) { |
+void CompositorTimingHistory::WillBeginMainFrame( |
+ bool on_critical_path, |
+ base::TimeTicks main_frame_time) { |
DCHECK_EQ(base::TimeTicks(), begin_main_frame_sent_time_); |
+ DCHECK_EQ(base::TimeTicks(), begin_main_frame_frame_time_); |
begin_main_frame_on_critical_path_ = on_critical_path; |
begin_main_frame_sent_time_ = Now(); |
+ begin_main_frame_frame_time_ = main_frame_time; |
did_send_begin_main_frame_ = true; |
SetBeginMainFrameNeededContinuously(true); |
@@ -510,11 +528,15 @@ void CompositorTimingHistory::BeginMainFrameStarted( |
void CompositorTimingHistory::BeginMainFrameAborted() { |
SetBeginMainFrameCommittingContinuously(false); |
DidBeginMainFrame(); |
+ begin_main_frame_frame_time_ = base::TimeTicks(); |
} |
void CompositorTimingHistory::DidCommit() { |
+ DCHECK_EQ(base::TimeTicks(), pending_tree_main_frame_time_); |
SetBeginMainFrameCommittingContinuously(true); |
DidBeginMainFrame(); |
+ pending_tree_main_frame_time_ = begin_main_frame_frame_time_; |
+ begin_main_frame_frame_time_ = base::TimeTicks(); |
} |
void CompositorTimingHistory::DidBeginMainFrame() { |
@@ -651,6 +673,10 @@ void CompositorTimingHistory::DidActivate() { |
activate_duration_history_.InsertSample(activate_duration); |
activate_start_time_ = base::TimeTicks(); |
+ |
+ DCHECK_EQ(base::TimeTicks(), active_tree_main_frame_time_); |
+ active_tree_main_frame_time_ = pending_tree_main_frame_time_; |
+ pending_tree_main_frame_time_ = base::TimeTicks(); |
} |
void CompositorTimingHistory::WillDraw() { |
@@ -658,7 +684,9 @@ void CompositorTimingHistory::WillDraw() { |
draw_start_time_ = Now(); |
} |
-void CompositorTimingHistory::DidDraw(bool used_new_active_tree) { |
+void CompositorTimingHistory::DidDraw(bool used_new_active_tree, |
+ bool main_thread_missed_last_deadline, |
+ base::TimeTicks impl_frame_time) { |
DCHECK_NE(base::TimeTicks(), draw_start_time_); |
base::TimeTicks draw_end_time = Now(); |
base::TimeDelta draw_duration = draw_end_time - draw_start_time_; |
@@ -683,13 +711,23 @@ void CompositorTimingHistory::DidDraw(bool used_new_active_tree) { |
} |
draw_end_time_prev_ = draw_end_time; |
- if (begin_main_frame_committing_continuously_ && used_new_active_tree) { |
- if (!new_active_tree_draw_end_time_prev_.is_null()) { |
- base::TimeDelta draw_interval = |
- draw_end_time - new_active_tree_draw_end_time_prev_; |
- uma_reporter_->AddCommitInterval(draw_interval); |
+ if (used_new_active_tree) { |
+ DCHECK_NE(base::TimeTicks(), active_tree_main_frame_time_); |
+ base::TimeDelta main_and_impl_delta = |
+ impl_frame_time - active_tree_main_frame_time_; |
+ DCHECK_GE(main_and_impl_delta, base::TimeDelta()); |
+ DCHECK_EQ(main_thread_missed_last_deadline, !main_and_impl_delta.is_zero()); |
brianderson
2016/02/11 01:43:45
Good thing we tried recording the delta. I added t
|
+ uma_reporter_->AddMainAndImplFrameTimeDelta(main_and_impl_delta); |
+ active_tree_main_frame_time_ = base::TimeTicks(); |
+ |
+ if (begin_main_frame_committing_continuously_) { |
+ if (!new_active_tree_draw_end_time_prev_.is_null()) { |
+ base::TimeDelta draw_interval = |
+ draw_end_time - new_active_tree_draw_end_time_prev_; |
+ uma_reporter_->AddCommitInterval(draw_interval); |
+ } |
+ new_active_tree_draw_end_time_prev_ = draw_end_time; |
} |
- new_active_tree_draw_end_time_prev_ = draw_end_time; |
} |
draw_start_time_ = base::TimeTicks(); |