1
0
mirror of https://github.com/ARM-software/workload-automation.git synced 2025-02-21 20:38:57 +00:00

Merge pull request #465 from marcbonnici/FPS_Fix

Fps fix
This commit is contained in:
setrofim 2017-08-17 11:00:02 +01:00 committed by GitHub
commit 2f683e59d2
2 changed files with 46 additions and 30 deletions

View File

@ -158,37 +158,43 @@ class FpsInstrument(Instrument):
def setup(self, context): def setup(self, context):
workload = context.workload workload = context.workload
if hasattr(workload, 'view'):
self.fps_outfile = os.path.join(context.output_directory, 'fps.csv')
self.outfile = os.path.join(context.output_directory, 'frames.csv')
# Android M brings a new method of collecting FPS data
if not self.force_surfaceflinger and (self.device.get_sdk_version() >= 23):
# gfxinfo takes in the package name rather than a single view/activity
# so there is no 'list_command' to run and compare against a list of
# views/activities. Additionally, clearing the stats requires the package
# so we need to clear for every package in the workload.
# Usually there is only one package, but some workloads may run multiple
# packages so each one must be reset before continuing
self.fps_method = 'gfxinfo'
runcmd = 'dumpsys gfxinfo {} framestats'
lstcmd = None
params = workload.package
params = [params] if isinstance(params, basestring) else params
for pkg in params:
self.device.execute('dumpsys gfxinfo {} reset'.format(pkg))
else:
self.fps_method = 'surfaceflinger'
runcmd = 'dumpsys SurfaceFlinger --latency {}'
lstcmd = 'dumpsys SurfaceFlinger --list'
params = workload.view
self.device.execute('dumpsys SurfaceFlinger --latency-clear ')
self.collector = LatencyCollector(self.outfile, self.device, params or '', use_gfxinfo = not self.force_surfaceflinger and (self.device.get_sdk_version() >= 23)
self.keep_raw, self.logger, self.dumpsys_period, if use_gfxinfo and not hasattr(workload, 'package'):
runcmd, lstcmd, self.fps_method) self.logger.debug('Workload does not contain a package; falling back to SurfaceFlinger...')
else: use_gfxinfo = False
if not use_gfxinfo and not hasattr(workload, 'view'):
self.logger.debug('Workload does not contain a view; disabling...') self.logger.debug('Workload does not contain a view; disabling...')
self.is_enabled = False self.is_enabled = False
return
self.fps_outfile = os.path.join(context.output_directory, 'fps.csv')
self.outfile = os.path.join(context.output_directory, 'frames.csv')
# Android M brings a new method of collecting FPS data
if use_gfxinfo:
# gfxinfo takes in the package name rather than a single view/activity
# so there is no 'list_command' to run and compare against a list of
# views/activities. Additionally, clearing the stats requires the package
# so we need to clear for every package in the workload.
# Usually there is only one package, but some workloads may run multiple
# packages so each one must be reset before continuing
self.fps_method = 'gfxinfo'
runcmd = 'dumpsys gfxinfo {} framestats'
lstcmd = None
params = workload.package
params = [params] if isinstance(params, basestring) else params
for pkg in params:
self.device.execute('dumpsys gfxinfo {} reset'.format(pkg))
else:
self.fps_method = 'surfaceflinger'
runcmd = 'dumpsys SurfaceFlinger --latency {}'
lstcmd = 'dumpsys SurfaceFlinger --list'
params = workload.view
self.device.execute('dumpsys SurfaceFlinger --latency-clear ')
self.collector = LatencyCollector(self.outfile, self.device, params or '',
self.keep_raw, self.logger, self.dumpsys_period,
runcmd, lstcmd, self.fps_method)
def start(self, context): def start(self, context):
if self.is_enabled: if self.is_enabled:

View File

@ -29,11 +29,13 @@ class ManualWorkloadConfig(object):
duration=None, # Seconds duration=None, # Seconds
user_triggered=None, user_triggered=None,
view=None, view=None,
package=None,
enable_logcat=True enable_logcat=True
): ):
self.user_triggered = user_triggered if user_triggered is not None else (False if duration else True) self.user_triggered = user_triggered if user_triggered is not None else (False if duration else True)
self.duration = duration or (None if self.user_triggered else self.default_duration) self.duration = duration or (None if self.user_triggered else self.default_duration)
self.view = view self.view = view
self.package = package
self.enable_logcat = enable_logcat self.enable_logcat = enable_logcat
@ -56,8 +58,16 @@ class ManualWorkload(Workload):
is not specified, and ``False`` otherwise. is not specified, and ``False`` otherwise.
"""), """),
Parameter('view', default='SurfaceView', Parameter('view', default='SurfaceView',
description="""Specifies the View of the workload. This enables instruments that require a description="""Specifies the View of the workload. This enables instruments that
View to be specified, such as the ``fps`` instrument."""), require a View to be specified, such as the ``fps`` instrument.
This is required for using "SurfaceFlinger" to collect FPS statistics
and is primarily used on devices pre API level 23"""),
Parameter('package',
description="""Specifies the package name of the workload. This enables
instruments that require a Package to be specified, such
as the ``fps`` instrument. This allows for "gfxinfo" to
be used and is the preferred method of collection for FPS
statistics on devices API level 23+"""),
Parameter('enable_logcat', kind=boolean, Parameter('enable_logcat', kind=boolean,
description='If ``True``, ``manual`` workload will collect logcat as part of the results.'), description='If ``True``, ``manual`` workload will collect logcat as part of the results.'),
] ]