summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cc/debug/benchmark_instrumentation.cc12
-rw-r--r--cc/debug/benchmark_instrumentation.h2
-rw-r--r--cc/debug/rendering_stats.cc4
-rw-r--r--cc/debug/rendering_stats.h1
-rw-r--r--cc/debug/rendering_stats_instrumentation.cc8
-rw-r--r--cc/debug/rendering_stats_instrumentation.h2
-rw-r--r--cc/surfaces/display.cc2
-rw-r--r--cc/trees/layer_tree_host_impl.cc4
-rw-r--r--tools/telemetry/telemetry/web_perf/metrics/rendering_stats.py25
-rw-r--r--tools/telemetry/telemetry/web_perf/metrics/rendering_stats_unittest.py105
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)