smoothness.py revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
1558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch# Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# found in the LICENSE file. 468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)from metrics import smoothness 61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)from metrics import timeline 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from telemetry.page import page_measurement 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class MissingDisplayFrameRateError(page_measurement.MeasurementFailure): 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch def __init__(self, name): 128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) super(MissingDisplayFrameRateError, self).__init__( 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 'Missing display frame rate metrics: ' + name) 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass Smoothness(page_measurement.PageMeasurement): 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) def __init__(self): 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch super(Smoothness, self).__init__('smoothness') 191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) self._metric = None 201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) def AddCommandLineOptions(self, parser): 221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) metric_choices = ['smoothness', 'timeline'] 231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) parser.add_option('--metric', dest='metric', type='choice', 241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) choices=metric_choices, 251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) default='smoothness', 261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) help=('Metric to use in the measurement. ' + 271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 'Supported values: ' + ', '.join(metric_choices))) 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) def CustomizeBrowserOptions(self, options): 308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) options.AppendExtraBrowserArgs('--enable-gpu-benchmarking') 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) def CanRunForPage(self, page): 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return hasattr(page, 'smoothness') 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def WillRunActions(self, page, tab): 361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if self.options.metric == 'smoothness': 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self._metric = smoothness.SmoothnessMetric() 381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) elif self.options.metric == 'timeline': 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self._metric = timeline.ThreadTimesTimelineMetric() 401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) self._metric.Start(page, tab) 421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if tab.browser.platform.IsRawDisplayFrameRateSupported(): 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tab.browser.platform.StartRawDisplayFrameRateMeasurement() 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) def DidRunAction(self, page, tab, action): 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timeline_marker_name = action.GetTimelineMarkerName() 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if self.options.metric == 'smoothness' and timeline_marker_name: 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self._metric.AddTimelineMarkerNameToIncludeInMetric(timeline_marker_name) 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def DidRunActions(self, page, tab): 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if tab.browser.platform.IsRawDisplayFrameRateSupported(): 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tab.browser.platform.StopRawDisplayFrameRateMeasurement() 541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) self._metric.Stop(page, tab) 55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) def MeasurePage(self, page, tab, results): 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) self._metric.AddResults(tab, results) 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if tab.browser.platform.IsRawDisplayFrameRateSupported(): 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for r in tab.browser.platform.GetRawDisplayFrameRateMeasurements(): 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if r.value is None: 628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) raise MissingDisplayFrameRateError(r.name) 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) results.Add(r.name, r.unit, r.value) 64