diff options
-rw-r--r-- | cc/debug/benchmark_instrumentation.cc | 12 | ||||
-rw-r--r-- | cc/debug/benchmark_instrumentation.h | 2 | ||||
-rw-r--r-- | cc/debug/rendering_stats.cc | 4 | ||||
-rw-r--r-- | cc/debug/rendering_stats.h | 1 | ||||
-rw-r--r-- | cc/debug/rendering_stats_instrumentation.cc | 8 | ||||
-rw-r--r-- | cc/debug/rendering_stats_instrumentation.h | 2 | ||||
-rw-r--r-- | cc/surfaces/display.cc | 2 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_impl.cc | 4 | ||||
-rw-r--r-- | tools/telemetry/telemetry/web_perf/metrics/rendering_stats.py | 25 | ||||
-rw-r--r-- | tools/telemetry/telemetry/web_perf/metrics/rendering_stats_unittest.py | 105 |
10 files changed, 117 insertions, 48 deletions
diff --git a/cc/debug/benchmark_instrumentation.cc b/cc/debug/benchmark_instrumentation.cc index adc969b..74caae8 100644 --- a/cc/debug/benchmark_instrumentation.cc +++ b/cc/debug/benchmark_instrumentation.cc @@ -28,5 +28,17 @@ void IssueImplThreadRenderingStatsEvent( "data", stats.AsTraceableData()); } +void IssueDisplayRenderingStatsEvent() { + scoped_refptr<base::debug::TracedValue> record_data = + new base::debug::TracedValue(); + record_data->SetInteger("frame_count", 1); + TRACE_EVENT_INSTANT1( + "benchmark", + "BenchmarkInstrumentation::DisplayRenderingStats", + TRACE_EVENT_SCOPE_THREAD, + "data", + scoped_refptr<base::debug::ConvertableToTraceFormat>(record_data)); +} + } // namespace benchmark_instrumentation } // namespace cc diff --git a/cc/debug/benchmark_instrumentation.h b/cc/debug/benchmark_instrumentation.h index 3a6b03d8..bd524b9 100644 --- a/cc/debug/benchmark_instrumentation.h +++ b/cc/debug/benchmark_instrumentation.h @@ -5,6 +5,7 @@ #ifndef CC_DEBUG_BENCHMARK_INSTRUMENTATION_H_ #define CC_DEBUG_BENCHMARK_INSTRUMENTATION_H_ +#include "cc/base/cc_export.h" #include "cc/debug/rendering_stats.h" namespace cc { @@ -45,6 +46,7 @@ void IssueMainThreadRenderingStatsEvent( const RenderingStats::MainThreadRenderingStats& stats); void IssueImplThreadRenderingStatsEvent( const RenderingStats::ImplThreadRenderingStats& stats); +void CC_EXPORT IssueDisplayRenderingStatsEvent(); } // namespace benchmark_instrumentation } // namespace cc diff --git a/cc/debug/rendering_stats.cc b/cc/debug/rendering_stats.cc index b5989fc..d0668da 100644 --- a/cc/debug/rendering_stats.cc +++ b/cc/debug/rendering_stats.cc @@ -29,7 +29,7 @@ void RenderingStats::TimeDeltaList::Add(const TimeDeltaList& other) { } RenderingStats::MainThreadRenderingStats::MainThreadRenderingStats() - : frame_count(0), painted_pixel_count(0), recorded_pixel_count(0) { + : painted_pixel_count(0), recorded_pixel_count(0) { } RenderingStats::MainThreadRenderingStats::~MainThreadRenderingStats() { @@ -39,7 +39,6 @@ scoped_refptr<base::debug::ConvertableToTraceFormat> RenderingStats::MainThreadRenderingStats::AsTraceableData() const { scoped_refptr<base::debug::TracedValue> record_data = new base::debug::TracedValue(); - record_data->SetInteger("frame_count", frame_count); record_data->SetDouble("paint_time", paint_time.InSecondsF()); record_data->SetInteger("painted_pixel_count", painted_pixel_count); record_data->SetDouble("record_time", record_time.InSecondsF()); @@ -49,7 +48,6 @@ RenderingStats::MainThreadRenderingStats::AsTraceableData() const { void RenderingStats::MainThreadRenderingStats::Add( const MainThreadRenderingStats& other) { - frame_count += other.frame_count; paint_time += other.paint_time; painted_pixel_count += other.painted_pixel_count; record_time += other.record_time; diff --git a/cc/debug/rendering_stats.h b/cc/debug/rendering_stats.h index 73ca9c4..52560e2 100644 --- a/cc/debug/rendering_stats.h +++ b/cc/debug/rendering_stats.h @@ -36,7 +36,6 @@ struct CC_EXPORT RenderingStats { // Note: when adding new members, please remember to update Add in // rendering_stats.cc. - int64 frame_count; base::TimeDelta paint_time; int64 painted_pixel_count; base::TimeDelta record_time; diff --git a/cc/debug/rendering_stats_instrumentation.cc b/cc/debug/rendering_stats_instrumentation.cc index 01499d2..fb7ec52 100644 --- a/cc/debug/rendering_stats_instrumentation.cc +++ b/cc/debug/rendering_stats_instrumentation.cc @@ -71,16 +71,12 @@ base::TimeDelta RenderingStatsInstrumentation::EndRecording( return base::TimeDelta(); } -void RenderingStatsInstrumentation::IncrementFrameCount(int64 count, - bool main_thread) { +void RenderingStatsInstrumentation::IncrementFrameCount(int64 count) { if (!record_rendering_stats_) return; base::AutoLock scoped_lock(lock_); - if (main_thread) - main_thread_rendering_stats_.frame_count += count; - else - impl_thread_rendering_stats_.frame_count += count; + impl_thread_rendering_stats_.frame_count += count; } void RenderingStatsInstrumentation::AddPaint(base::TimeDelta duration, diff --git a/cc/debug/rendering_stats_instrumentation.h b/cc/debug/rendering_stats_instrumentation.h index 208c1a3..fd7f5c9 100644 --- a/cc/debug/rendering_stats_instrumentation.h +++ b/cc/debug/rendering_stats_instrumentation.h @@ -47,7 +47,7 @@ class CC_EXPORT RenderingStatsInstrumentation { base::TimeTicks StartRecording() const; base::TimeDelta EndRecording(base::TimeTicks start_time) const; - void IncrementFrameCount(int64 count, bool main_thread); + void IncrementFrameCount(int64 count); void AddPaint(base::TimeDelta duration, int64 pixels); void AddRecord(base::TimeDelta duration, int64 pixels); void AddRaster(base::TimeDelta duration, int64 pixels); diff --git a/cc/surfaces/display.cc b/cc/surfaces/display.cc index e206eb8..cf317b4 100644 --- a/cc/surfaces/display.cc +++ b/cc/surfaces/display.cc @@ -6,6 +6,7 @@ #include "base/debug/trace_event.h" #include "base/message_loop/message_loop.h" +#include "cc/debug/benchmark_instrumentation.h" #include "cc/output/compositor_frame.h" #include "cc/output/compositor_frame_ack.h" #include "cc/output/direct_renderer.h" @@ -110,6 +111,7 @@ bool Display::Draw() { return false; TRACE_EVENT0("cc", "Display::Draw"); + benchmark_instrumentation::IssueDisplayRenderingStatsEvent(); DelegatedFrameData* frame_data = frame->delegated_frame_data.get(); // Only reshape when we know we are going to draw. Otherwise, the reshape diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index b7b7f0e..e1a19ff 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc @@ -1478,9 +1478,7 @@ void LayerTreeHostImpl::DrawLayers(FrameData* frame, fps_counter_->SaveTimeStamp(frame_begin_time, !output_surface_->context_provider()); - bool on_main_thread = false; - rendering_stats_instrumentation_->IncrementFrameCount( - 1, on_main_thread); + rendering_stats_instrumentation_->IncrementFrameCount(1); if (tile_manager_) { memory_history_->SaveEntry( diff --git a/tools/telemetry/telemetry/web_perf/metrics/rendering_stats.py b/tools/telemetry/telemetry/web_perf/metrics/rendering_stats.py index 492b4f6..3bb7973 100644 --- a/tools/telemetry/telemetry/web_perf/metrics/rendering_stats.py +++ b/tools/telemetry/telemetry/web_perf/metrics/rendering_stats.py @@ -97,7 +97,7 @@ def HasRenderingStats(process): if not process: return False for event in process.IterAllSlicesOfName( - 'BenchmarkInstrumentation::MainThreadRenderingStats'): + 'BenchmarkInstrumentation::DisplayRenderingStats'): if 'data' in event.args and event.args['data']['frame_count'] == 1: return True for event in process.IterAllSlicesOfName( @@ -106,6 +106,13 @@ def HasRenderingStats(process): return True return False +def GetTimestampEventName(process): + """ Returns the name of the events used to count frame timestamps. """ + event_name = 'BenchmarkInstrumentation::DisplayRenderingStats' + for event in process.IterAllSlicesOfName(event_name): + if 'data' in event.args and event.args['data']['frame_count'] == 1: + return event_name + return 'BenchmarkInstrumentation::ImplThreadRenderingStats' class RenderingStats(object): def __init__(self, renderer_process, browser_process, timeline_ranges): @@ -126,6 +133,8 @@ class RenderingStats(object): else: timestamp_process = renderer_process + timestamp_event_name = GetTimestampEventName(timestamp_process) + # A lookup from list names below to any errors or exceptions encountered # in attempting to generate that list. self.errors = {} @@ -165,7 +174,8 @@ class RenderingStats(object): if timeline_range.is_empty: continue - self._InitFrameTimestampsFromTimeline(timestamp_process, timeline_range) + self._InitFrameTimestampsFromTimeline( + timestamp_process, timestamp_event_name, timeline_range) self._InitMainThreadRenderingStatsFromTimeline( renderer_process, timeline_range) self._InitImplThreadRenderingStatsFromTimeline( @@ -216,13 +226,10 @@ class RenderingStats(object): self.frame_times[-1].append(round(self.frame_timestamps[-1][-1] - self.frame_timestamps[-1][-2], 2)) - def _InitFrameTimestampsFromTimeline(self, process, timeline_range): - event_name = 'BenchmarkInstrumentation::MainThreadRenderingStats' - for event in self._GatherEvents(event_name, process, timeline_range): - self._AddFrameTimestamp(event) - - event_name = 'BenchmarkInstrumentation::ImplThreadRenderingStats' - for event in self._GatherEvents(event_name, process, timeline_range): + def _InitFrameTimestampsFromTimeline( + self, process, timestamp_event_name, timeline_range): + for event in self._GatherEvents( + timestamp_event_name, process, timeline_range): self._AddFrameTimestamp(event) def _InitMainThreadRenderingStatsFromTimeline(self, process, timeline_range): diff --git a/tools/telemetry/telemetry/web_perf/metrics/rendering_stats_unittest.py b/tools/telemetry/telemetry/web_perf/metrics/rendering_stats_unittest.py index 2875703..039fbf3 100644 --- a/tools/telemetry/telemetry/web_perf/metrics/rendering_stats_unittest.py +++ b/tools/telemetry/telemetry/web_perf/metrics/rendering_stats_unittest.py @@ -75,8 +75,7 @@ class ReferenceInputLatencyStats(object): self.input_event_latency = [] self.input_event = [] -def AddMainThreadRenderingStats(mock_timer, thread, first_frame, - ref_stats = None): +def AddMainThreadRenderingStats(mock_timer, thread, ref_stats = None): """ Adds a random main thread rendering stats event. thread: The timeline model thread to which the event will be added. @@ -84,8 +83,7 @@ def AddMainThreadRenderingStats(mock_timer, thread, first_frame, ref_stats: A ReferenceRenderingStats object to record expected values. """ # Create randonm data and timestap for main thread rendering stats. - data = { 'frame_count': 0, - 'paint_time': 0.0, + data = { 'paint_time': 0.0, 'painted_pixel_count': 0, 'record_time': mock_timer.Advance(2, 4) / 1000.0, 'recorded_pixel_count': 3000*3000 } @@ -100,21 +98,42 @@ def AddMainThreadRenderingStats(mock_timer, thread, first_frame, if not ref_stats: return - # Add timestamp only if a frame was output - if data['frame_count'] == 1: - if not first_frame: - # Add frame_time if this is not the first frame in within the bounds of an - # action. - prev_timestamp = ref_stats.frame_timestamps[-1][-1] - ref_stats.frame_times[-1].append(round(timestamp - prev_timestamp, 2)) - ref_stats.frame_timestamps[-1].append(timestamp) - ref_stats.paint_times[-1].append(data['paint_time'] * 1000.0) ref_stats.painted_pixel_counts[-1].append(data['painted_pixel_count']) ref_stats.record_times[-1].append(data['record_time'] * 1000.0) ref_stats.recorded_pixel_counts[-1].append(data['recorded_pixel_count']) +def AddDisplayRenderingStats(mock_timer, thread, first_frame, + ref_stats = None): + """ Adds a random display rendering stats event. + + thread: The timeline model thread to which the event will be added. + first_frame: Is this the first frame within the bounds of an action? + ref_stats: A ReferenceRenderingStats object to record expected values. + """ + # Create randonm data and timestap for main thread rendering stats. + data = { 'frame_count': 1 } + timestamp = mock_timer.Get() + + # Add a slice with the event data to the given thread. + thread.PushCompleteSlice( + 'benchmark', 'BenchmarkInstrumentation::DisplayRenderingStats', + timestamp, duration=0.0, thread_timestamp=None, thread_duration=None, + args={'data': data}) + + if not ref_stats: + return + + # Add timestamp only if a frame was output + if not first_frame: + # Add frame_time if this is not the first frame in within the bounds of an + # action. + prev_timestamp = ref_stats.frame_timestamps[-1][-1] + ref_stats.frame_times[-1].append(round(timestamp - prev_timestamp, 2)) + ref_stats.frame_timestamps[-1].append(timestamp) + + def AddImplThreadRenderingStats(mock_timer, thread, first_frame, ref_stats = None): """ Adds a random impl thread rendering stats event. @@ -221,7 +240,7 @@ def AddInputLatencyStats(mock_timer, start_thread, end_thread, # Also add some dummy frame statistics so we can feed the resulting timeline # to RenderingStats. - AddMainThreadRenderingStats(mock_timer, start_thread, False) + AddMainThreadRenderingStats(mock_timer, start_thread) AddImplThreadRenderingStats(mock_timer, end_thread, False) if not ref_latency_stats: @@ -253,7 +272,7 @@ class RenderingStatsUnitTest(unittest.TestCase): # A process with rendering stats, but no frames in them process_without_frames = timeline.GetOrCreateProcess(pid = 2) thread_without_frames = process_without_frames.GetOrCreateThread(tid = 21) - AddMainThreadRenderingStats(timer, thread_without_frames, True, None) + AddMainThreadRenderingStats(timer, thread_without_frames, None) process_without_frames.FinalizeImport() self.assertFalse(HasRenderingStats(thread_without_frames)) @@ -264,6 +283,42 @@ class RenderingStatsUnitTest(unittest.TestCase): process_with_frames.FinalizeImport() self.assertTrue(HasRenderingStats(thread_with_frames)) + def testBothDisplayAndImplStats(self): + timeline = model.TimelineModel() + timer = MockTimer() + + ref_stats = ReferenceRenderingStats() + ref_stats.AppendNewRange() + renderer = timeline.GetOrCreateProcess(pid = 2) + browser = timeline.GetOrCreateProcess(pid = 3) + browser_main = browser.GetOrCreateThread(tid = 31) + browser_main.BeginSlice('webkit.console', 'ActionA', timer.Get(), '') + + # Create main, impl, and display rendering stats. + for i in xrange(0, 10): + first = (i == 0) + AddMainThreadRenderingStats(timer, browser_main, ref_stats) + AddImplThreadRenderingStats(timer, browser_main, first, None) + timer.Advance(2, 4) + + for i in xrange(0, 10): + first = (i == 0) + AddDisplayRenderingStats(timer, browser_main, first, ref_stats) + timer.Advance(5, 10) + + browser_main.EndSlice(timer.Get()) + + browser.FinalizeImport() + renderer.FinalizeImport() + timeline_markers = timeline.FindTimelineMarkers(['ActionA']) + timeline_ranges = [ timeline_bounds.Bounds.CreateFromEvent(marker) + for marker in timeline_markers ] + stats = RenderingStats(renderer, browser, timeline_ranges) + + # Compare rendering stats to reference - Only display stats should count + self.assertEquals(stats.frame_timestamps, ref_stats.frame_timestamps) + self.assertEquals(stats.frame_times, ref_stats.frame_times) + def testRangeWithoutFrames(self): timer = MockTimer() timeline = model.TimelineModel() @@ -278,7 +333,7 @@ class RenderingStatsUnitTest(unittest.TestCase): renderer_main.BeginSlice('webkit.console', 'ActionA', timer.Get(), '') for i in xrange(0, 10): first = (i == 0) - AddMainThreadRenderingStats(timer, renderer_main, first, None) + AddMainThreadRenderingStats(timer, renderer_main, None) AddImplThreadRenderingStats(timer, renderer_compositor, first, None) timer.Advance(2, 4) renderer_main.EndSlice(timer.Get()) @@ -286,7 +341,7 @@ class RenderingStatsUnitTest(unittest.TestCase): # Create 5 main and impl rendering stats events not within any action. for i in xrange(0, 5): first = (i == 0) - AddMainThreadRenderingStats(timer, renderer_main, first, None) + AddMainThreadRenderingStats(timer, renderer_main, None) AddImplThreadRenderingStats(timer, renderer_compositor, first, None) # Create Action B without any frames. This should trigger @@ -330,11 +385,11 @@ class RenderingStatsUnitTest(unittest.TestCase): for i in xrange(0, 10): first = (i == 0) AddMainThreadRenderingStats( - timer, renderer_main, first, renderer_ref_stats) + timer, renderer_main, renderer_ref_stats) AddImplThreadRenderingStats( timer, renderer_compositor, first, renderer_ref_stats) AddMainThreadRenderingStats( - timer, browser_main, first, browser_ref_stats) + timer, browser_main, browser_ref_stats) AddImplThreadRenderingStats( timer, browser_compositor, first, browser_ref_stats) timer.Advance(2, 4) @@ -343,9 +398,9 @@ class RenderingStatsUnitTest(unittest.TestCase): # Create 5 main and impl rendering stats events not within any action. for i in xrange(0, 5): first = (i == 0) - AddMainThreadRenderingStats(timer, renderer_main, first, None) + AddMainThreadRenderingStats(timer, renderer_main, None) AddImplThreadRenderingStats(timer, renderer_compositor, first, None) - AddMainThreadRenderingStats(timer, browser_main, first, None) + AddMainThreadRenderingStats(timer, browser_main, None) AddImplThreadRenderingStats(timer, browser_compositor, first, None) # Create 10 main and impl rendering stats events for Action B. @@ -356,11 +411,11 @@ class RenderingStatsUnitTest(unittest.TestCase): for i in xrange(0, 10): first = (i == 0) AddMainThreadRenderingStats( - timer, renderer_main, first, renderer_ref_stats) + timer, renderer_main, renderer_ref_stats) AddImplThreadRenderingStats( timer, renderer_compositor, first, renderer_ref_stats) AddMainThreadRenderingStats( - timer, browser_main, first, browser_ref_stats) + timer, browser_main, browser_ref_stats) AddImplThreadRenderingStats( timer, browser_compositor, first, browser_ref_stats) timer.Advance(2, 4) @@ -374,11 +429,11 @@ class RenderingStatsUnitTest(unittest.TestCase): for i in xrange(0, 10): first = (i == 0) AddMainThreadRenderingStats( - timer, renderer_main, first, renderer_ref_stats) + timer, renderer_main, renderer_ref_stats) AddImplThreadRenderingStats( timer, renderer_compositor, first, renderer_ref_stats) AddMainThreadRenderingStats( - timer, browser_main, first, browser_ref_stats) + timer, browser_main, browser_ref_stats) AddImplThreadRenderingStats( timer, browser_compositor, first, browser_ref_stats) timer.Advance(2, 4) |