diff options
author | setrofim <setrofim@gmail.com> | 2017-08-17 11:00:02 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-08-17 11:00:02 +0100 |
commit | 2f683e59d2cbebd4d24d8e87d474f6b320f8d021 (patch) | |
tree | 4df1384c60c2059b89ab79bde84ac63f93a0aab0 | |
parent | 6915de98f1ef3495c05f58450d591ff44d6597b4 (diff) | |
parent | 081358769d2ca323f3f19cf6076f016739030a19 (diff) |
Merge pull request #465 from marcbonnici/FPS_Fix
Fps fix
-rwxr-xr-x | wlauto/instrumentation/fps/__init__.py | 64 | ||||
-rw-r--r-- | wlauto/workloads/manual/__init__.py | 14 |
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.'), ] |