aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsetrofim <setrofim@gmail.com>2017-08-17 11:00:02 +0100
committerGitHub <noreply@github.com>2017-08-17 11:00:02 +0100
commit2f683e59d2cbebd4d24d8e87d474f6b320f8d021 (patch)
tree4df1384c60c2059b89ab79bde84ac63f93a0aab0
parent6915de98f1ef3495c05f58450d591ff44d6597b4 (diff)
parent081358769d2ca323f3f19cf6076f016739030a19 (diff)
Merge pull request #465 from marcbonnici/FPS_Fix
Fps fix
-rwxr-xr-xwlauto/instrumentation/fps/__init__.py64
-rw-r--r--wlauto/workloads/manual/__init__.py14
2 files changed, 47 insertions, 31 deletions
diff --git a/wlauto/instrumentation/fps/__init__.py b/wlauto/instrumentation/fps/__init__.py
index 65fb0620..ad630bdb 100755
--- a/wlauto/instrumentation/fps/__init__.py
+++ b/wlauto/instrumentation/fps/__init__.py
@@ -158,37 +158,43 @@ class FpsInstrument(Instrument):
def setup(self, context):
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 '',
- self.keep_raw, self.logger, self.dumpsys_period,
- runcmd, lstcmd, self.fps_method)
- else:
+
+ use_gfxinfo = not self.force_surfaceflinger and (self.device.get_sdk_version() >= 23)
+ if use_gfxinfo and not hasattr(workload, 'package'):
+ self.logger.debug('Workload does not contain a package; falling back to SurfaceFlinger...')
+ use_gfxinfo = False
+ if not use_gfxinfo and not hasattr(workload, 'view'):
self.logger.debug('Workload does not contain a view; disabling...')
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):
if self.is_enabled:
diff --git a/wlauto/workloads/manual/__init__.py b/wlauto/workloads/manual/__init__.py
index 05e91f97..190f0163 100644
--- a/wlauto/workloads/manual/__init__.py
+++ b/wlauto/workloads/manual/__init__.py
@@ -29,11 +29,13 @@ class ManualWorkloadConfig(object):
duration=None, # Seconds
user_triggered=None,
view=None,
+ package=None,
enable_logcat=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.view = view
+ self.package = package
self.enable_logcat = enable_logcat
@@ -56,8 +58,16 @@ class ManualWorkload(Workload):
is not specified, and ``False`` otherwise.
"""),
Parameter('view', default='SurfaceView',
- description="""Specifies the View of the workload. This enables instruments that require a
- View to be specified, such as the ``fps`` instrument."""),
+ description="""Specifies the View of the workload. This enables instruments that
+ 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,
description='If ``True``, ``manual`` workload will collect logcat as part of the results.'),
]