blob: 906137247bb1dd8f21b764f2a6d2a3e901b08940 [file] [log] [blame]
borenet1e37d172015-03-27 05:42:18 -07001#
2# Copyright 2015 Google Inc.
3#
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6#
7
mtkleinf73e5892015-02-24 11:45:11 -08008#!/usr/bin/env python
9
10usage = '''
11Write extra flags to outfile for nanobench based on the bot name:
borenet1e37d172015-03-27 05:42:18 -070012 $ python nanobench_flags.py outfile Perf-Android-GCC-GalaxyS3-GPU-Mali400-Arm7-Release
mtkleinf73e5892015-02-24 11:45:11 -080013Or run self-tests:
14 $ python nanobench_flags.py test
15'''
16
17import inspect
18import json
19import os
20import sys
21
22
23def lineno():
24 caller = inspect.stack()[1] # Up one level to our caller.
25 return inspect.getframeinfo(caller[0]).lineno
26
27
28cov_start = lineno()+1 # We care about coverage starting just past this def.
29def get_args(bot):
30 args = []
31
scroggo860e8a62015-10-15 07:51:28 -070032 if 'GPU' in bot:
33 args.append('--images')
joshualitt3b8c0a92015-12-02 11:04:51 -080034 args.extend(['--gpuStatsDump', 'true'])
scroggo0a3cac82015-10-08 14:44:51 -070035
borenetd34d9472015-09-03 12:31:26 -070036 if 'Appurify' not in bot:
37 args.extend(['--scales', '1.0', '1.1'])
mtkleinf73e5892015-02-24 11:45:11 -080038
stephana18b72db2015-05-21 13:59:36 -070039 if 'iOS' in bot:
40 args.extend(['--skps', 'ignore_skps'])
41
borenetd34d9472015-09-03 12:31:26 -070042 if 'Appurify' not in bot:
43 config = ['565', '8888', 'gpu', 'nonrendering', 'angle', 'hwui']
44 # The S4 crashes and the NP produces a long error stream when we run with
45 # MSAA.
46 if ('GalaxyS4' not in bot and
47 'NexusPlayer' not in bot):
48 if 'Android' in bot:
49 config.extend(['msaa4', 'nvprmsaa4'])
50 else:
51 config.extend(['msaa16', 'nvprmsaa16'])
52 args.append('--config')
53 args.extend(config)
bsalomonbdff1fc2015-02-28 16:56:31 -080054
mtkleinf73e5892015-02-24 11:45:11 -080055 if 'Valgrind' in bot:
56 # Don't care about Valgrind performance.
57 args.extend(['--loops', '1'])
58 args.extend(['--samples', '1'])
msarettc149f0e2016-01-04 11:35:43 -080059 # Ensure that the bot framework does not think we have timed out.
60 args.extend(['--keepAlive', 'true'])
mtkleinf73e5892015-02-24 11:45:11 -080061
egdaniel9a0f6292015-03-20 07:03:52 -070062 if 'HD2000' in bot:
mtkleinbf9e6002015-06-16 10:41:27 -070063 args.extend(['--GPUbenchTileW', '256'])
64 args.extend(['--GPUbenchTileH', '256'])
egdaniel9a0f6292015-03-20 07:03:52 -070065
mtkleinf73e5892015-02-24 11:45:11 -080066 match = []
67 if 'Android' in bot:
68 # Segfaults when run as GPU bench. Very large texture?
69 match.append('~blurroundrect')
70 match.append('~patch_grid') # skia:2847
71 match.append('~desk_carsvg')
72 if 'HD2000' in bot:
73 match.extend(['~gradient', '~etc1bitmap']) # skia:2895
borenete1d7e0f2015-04-23 12:44:31 -070074 if 'NexusPlayer' in bot:
75 match.append('~desk_unicodetable')
benjaminwagnera1a8a602015-09-23 11:41:04 -070076 if 'GalaxyS4' in bot:
77 match.append('~GLInstancedArraysBench') # skia:4371
borenete1d7e0f2015-04-23 12:44:31 -070078
stephana18b72db2015-05-21 13:59:36 -070079 if 'iOS' in bot:
80 match.append('~blurroundrect')
81 match.append('~patch_grid') # skia:2847
82 match.append('~desk_carsvg')
83 match.append('~keymobi')
stephana340cd842015-05-26 06:19:11 -070084 match.append('~path_hairline')
joshualitt431dded2015-12-16 10:38:35 -080085 match.append('~GLInstancedArraysBench') # skia:4714
stephana18b72db2015-05-21 13:59:36 -070086
scroggo860e8a62015-10-15 07:51:28 -070087 # the 32-bit GCE bots run out of memory in DM when running these large images
88 # so defensively disable them in nanobench, too.
89 # FIXME (scroggo): This may have just been due to SkImageDecoder's
halcanary6950de62015-11-07 05:29:00 -080090 # buildTileIndex leaking memory (https://bug.skia.org/4360). That is
91 # disabled by default for nanobench, so we may not need this.
scroggo860e8a62015-10-15 07:51:28 -070092 # FIXME (scroggo): Share image blacklists between dm and nanobench?
93 if 'x86' in bot and not 'x86-64' in bot:
94 match.append('~interlaced1.png')
95 match.append('~interlaced2.png')
96 match.append('~interlaced3.png')
97
msaretta7a21cf2015-11-16 08:43:23 -080098 # We do not need or want to benchmark the decodes of incomplete images.
99 # In fact, in nanobench we assert that the full image decode succeeds.
100 match.append('~inc0.gif')
101 match.append('~inc1.gif')
102 match.append('~incInterlaced.gif')
103 match.append('~inc0.jpg')
104 match.append('~incGray.jpg')
105 match.append('~inc0.wbmp')
106 match.append('~inc1.wbmp')
107 match.append('~inc0.webp')
108 match.append('~inc1.webp')
109 match.append('~inc0.ico')
110 match.append('~inc1.ico')
111 match.append('~inc0.png')
112 match.append('~inc1.png')
113 match.append('~inc2.png')
114 match.append('~inc12.png')
115 match.append('~inc13.png')
116 match.append('~inc14.png')
117 match.append('~inc0.webp')
118 match.append('~inc1.webp')
119
mtkleinf73e5892015-02-24 11:45:11 -0800120 if match:
121 args.append('--match')
122 args.extend(match)
mtklein7e78f3d2015-03-10 08:03:26 -0700123
mtkleinf73e5892015-02-24 11:45:11 -0800124 return args
125cov_end = lineno() # Don't care about code coverage past here.
126
127
128def self_test():
129 import coverage # This way the bots don't need coverage.py to be installed.
130 args = {}
131 cases = [
mtkleinf73e5892015-02-24 11:45:11 -0800132 'Perf-Android-Nexus7-Tegra3-Arm7-Release',
borenete1d7e0f2015-04-23 12:44:31 -0700133 'Perf-Android-GCC-NexusPlayer-GPU-PowerVR-x86-Release',
borenet1e37d172015-03-27 05:42:18 -0700134 'Test-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind',
135 'Test-Win7-MSVC-ShuttleA-GPU-HD2000-x86-Debug-ANGLE',
stephana18b72db2015-05-21 13:59:36 -0700136 'Test-iOS-Clang-iPad4-GPU-SGX554-Arm7-Debug',
benjaminwagnera1a8a602015-09-23 11:41:04 -0700137 'Test-Android-GCC-GalaxyS4-GPU-SGX544-Arm7-Release',
mtkleinf73e5892015-02-24 11:45:11 -0800138 ]
139
140 cov = coverage.coverage()
141 cov.start()
142 for case in cases:
143 args[case] = get_args(case)
144 cov.stop()
145
146 this_file = os.path.basename(__file__)
147 _, _, not_run, _ = cov.analysis(this_file)
148 filtered = [line for line in not_run if line > cov_start and line < cov_end]
149 if filtered:
150 print 'Lines not covered by test cases: ', filtered
151 sys.exit(1)
152
153 golden = this_file.replace('.py', '.json')
154 with open(os.path.join(os.path.dirname(__file__), golden), 'w') as f:
155 json.dump(args, f, indent=2, sort_keys=True)
156
157
158if __name__ == '__main__':
159 if len(sys.argv) == 2 and sys.argv[1] == 'test':
160 self_test()
161 sys.exit(0)
162
163 if len(sys.argv) != 3:
164 print usage
165 sys.exit(1)
166
167 with open(sys.argv[1], 'w') as out:
168 json.dump(get_args(sys.argv[2]), out)