OLD | NEW |
(Empty) | |
| 1 # Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. |
| 4 |
| 5 class RenderingStats(object): |
| 6 def __init__(self, smoothness_marker, gesture_marker, rendering_stats_deltas, |
| 7 used_gpu_benchmarking): |
| 8 """ |
| 9 Utility class for extracting rendering statistics from the timeline (or |
| 10 other loggin facilities), and providing them in a common format to classes |
| 11 that compute benchmark metrics from this data. |
| 12 |
| 13 Stats can either be numbers, or lists of numbers. Classes that calculate |
| 14 metrics from the stats must be able to handle both cases. The length of |
| 15 different list stats may vary. |
| 16 |
| 17 All *_time values are measured in seconds. |
| 18 """ |
| 19 self.renderer_process = smoothness_marker.start_thread.parent |
| 20 self.start = gesture_marker.start |
| 21 self.end = self.start + gesture_marker.duration |
| 22 |
| 23 self.total_time = (self.end - self.start) / 1000.0 |
| 24 self.frame_count = [] |
| 25 self.frame_timestamps = [] |
| 26 self.paint_time = [] |
| 27 self.painted_pixel_count = [] |
| 28 self.record_time = [] |
| 29 self.recorded_pixel_count = [] |
| 30 self.rasterize_time = [] |
| 31 self.rasterized_pixel_count = [] |
| 32 |
| 33 if used_gpu_benchmarking: |
| 34 self.initMainThreadStatsFromTimeline() |
| 35 self.initImplThreadStatsFromTimeline() |
| 36 else: |
| 37 self.initFrameCountsFromRenderingStats(rendering_stats_deltas) |
| 38 |
| 39 def initFrameCountsFromRenderingStats(self, rs): |
| 40 # TODO(ernstm): remove numFramesSentToScreen when RenderingStats |
| 41 # cleanup CL was picked up by the reference build. |
| 42 if 'frameCount' in rs: |
| 43 self.frame_count = rs.get('frameCount', 0) |
| 44 else: |
| 45 self.frame_count = rs.get('numFramesSentToScreen', 0) |
| 46 |
| 47 def initMainThreadStatsFromTimeline(self): |
| 48 for event in self.renderer_process.IterAllSlicesOfName( |
| 49 'MainThreadRenderingStats::IssueTraceEvent'): |
| 50 if event.start >= self.start and event.end <= self.end: |
| 51 if 'data' not in event.args: |
| 52 continue |
| 53 # TODO(ernstm): remove screen_frame_count when RenderingStats |
| 54 # cleanup CL was picked up by the reference build. |
| 55 if 'frame_count' in event.args['data']: |
| 56 frame_count = event.args['data']['frame_count'] |
| 57 else: |
| 58 frame_count = event.args['data']['screen_frame_count'] |
| 59 self.frame_count.append(frame_count) |
| 60 if frame_count > 1: |
| 61 raise ValueError, 'trace contains multi-frame render stats' |
| 62 if frame_count == 1: |
| 63 self.frame_timestamps.append( |
| 64 event.start) |
| 65 self.paint_time.append( |
| 66 event.args['data']['paint_time']) |
| 67 self.painted_pixel_count.append( |
| 68 event.args['data']['painted_pixel_count']) |
| 69 self.record_time.append( |
| 70 event.args['data']['record_time']) |
| 71 self.recorded_pixel_count.append( |
| 72 event.args['data']['recorded_pixel_count']) |
| 73 |
| 74 def initImplThreadStatsFromTimeline(self): |
| 75 for event in self.renderer_process.IterAllSlicesOfName( |
| 76 'ImplThreadRenderingStats::IssueTraceEvent'): |
| 77 if event.start >= self.start and event.end <= self.end: |
| 78 if 'data' not in event.args: |
| 79 continue |
| 80 # TODO(ernstm): remove screen_frame_count when RenderingStats |
| 81 # cleanup CL was picked up by the reference build. |
| 82 if 'frame_count' in event.args['data']: |
| 83 frame_count = event.args['data']['frame_count'] |
| 84 else: |
| 85 frame_count = event.args['data']['screen_frame_count'] |
| 86 self.frame_count.append(frame_count) |
| 87 if frame_count > 1: |
| 88 raise ValueError, 'trace contains multi-frame render stats' |
| 89 if frame_count == 1: |
| 90 self.frame_timestamps.append( |
| 91 event.start) |
| 92 self.rasterize_time.append( |
| 93 event.args['data']['rasterize_time']) |
| 94 self.rasterized_pixel_count.append( |
| 95 event.args['data']['rasterized_pixel_count']) |
OLD | NEW |