xref: /aosp_15_r20/external/skia/infra/bots/recipes/perf.py (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2016 The Chromium Authors. All rights reserved.
2*c8dee2aaSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*c8dee2aaSAndroid Build Coastguard Worker# found in the LICENSE file.
4*c8dee2aaSAndroid Build Coastguard Worker
5*c8dee2aaSAndroid Build Coastguard Worker
6*c8dee2aaSAndroid Build Coastguard Worker# Recipe module for Skia Swarming perf.
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker
9*c8dee2aaSAndroid Build Coastguard Workerimport calendar
10*c8dee2aaSAndroid Build Coastguard Workerimport json
11*c8dee2aaSAndroid Build Coastguard Workerimport os
12*c8dee2aaSAndroid Build Coastguard Worker
13*c8dee2aaSAndroid Build Coastguard WorkerPYTHON_VERSION_COMPATIBILITY = "PY3"
14*c8dee2aaSAndroid Build Coastguard Worker
15*c8dee2aaSAndroid Build Coastguard WorkerDEPS = [
16*c8dee2aaSAndroid Build Coastguard Worker  'env',
17*c8dee2aaSAndroid Build Coastguard Worker  'flavor',
18*c8dee2aaSAndroid Build Coastguard Worker  'recipe_engine/file',
19*c8dee2aaSAndroid Build Coastguard Worker  'recipe_engine/json',
20*c8dee2aaSAndroid Build Coastguard Worker  'recipe_engine/path',
21*c8dee2aaSAndroid Build Coastguard Worker  'recipe_engine/platform',
22*c8dee2aaSAndroid Build Coastguard Worker  'recipe_engine/properties',
23*c8dee2aaSAndroid Build Coastguard Worker  'recipe_engine/raw_io',
24*c8dee2aaSAndroid Build Coastguard Worker  'recipe_engine/step',
25*c8dee2aaSAndroid Build Coastguard Worker  'recipe_engine/time',
26*c8dee2aaSAndroid Build Coastguard Worker  'run',
27*c8dee2aaSAndroid Build Coastguard Worker  'vars',
28*c8dee2aaSAndroid Build Coastguard Worker]
29*c8dee2aaSAndroid Build Coastguard Worker
30*c8dee2aaSAndroid Build Coastguard Worker
31*c8dee2aaSAndroid Build Coastguard Workerdef perf_steps(api):
32*c8dee2aaSAndroid Build Coastguard Worker  """Run Skia benchmarks."""
33*c8dee2aaSAndroid Build Coastguard Worker  do_upload = api.properties.get('do_upload') == 'true'
34*c8dee2aaSAndroid Build Coastguard Worker  images = api.properties.get('images') == 'true'
35*c8dee2aaSAndroid Build Coastguard Worker  resources = api.properties.get('resources') == 'true'
36*c8dee2aaSAndroid Build Coastguard Worker  skps = api.properties.get('skps') == 'true'
37*c8dee2aaSAndroid Build Coastguard Worker  svgs = api.properties.get('svgs') == 'true'
38*c8dee2aaSAndroid Build Coastguard Worker  texttraces = api.properties.get('texttraces') == 'true'
39*c8dee2aaSAndroid Build Coastguard Worker
40*c8dee2aaSAndroid Build Coastguard Worker  api.flavor.install(
41*c8dee2aaSAndroid Build Coastguard Worker      resources=resources,
42*c8dee2aaSAndroid Build Coastguard Worker      skps=skps,
43*c8dee2aaSAndroid Build Coastguard Worker      images=images,
44*c8dee2aaSAndroid Build Coastguard Worker      svgs=svgs,
45*c8dee2aaSAndroid Build Coastguard Worker      texttraces=texttraces,
46*c8dee2aaSAndroid Build Coastguard Worker  )
47*c8dee2aaSAndroid Build Coastguard Worker
48*c8dee2aaSAndroid Build Coastguard Worker  if do_upload:
49*c8dee2aaSAndroid Build Coastguard Worker    api.flavor.create_clean_device_dir(
50*c8dee2aaSAndroid Build Coastguard Worker        api.flavor.device_dirs.perf_data_dir)
51*c8dee2aaSAndroid Build Coastguard Worker
52*c8dee2aaSAndroid Build Coastguard Worker  # Find nanobench flags.
53*c8dee2aaSAndroid Build Coastguard Worker  args = json.loads(api.properties['nanobench_flags'])
54*c8dee2aaSAndroid Build Coastguard Worker  props = json.loads(api.properties['nanobench_properties'])
55*c8dee2aaSAndroid Build Coastguard Worker  swarming_bot_id = api.vars.swarming_bot_id
56*c8dee2aaSAndroid Build Coastguard Worker  swarming_task_id = api.vars.swarming_task_id
57*c8dee2aaSAndroid Build Coastguard Worker  if do_upload:
58*c8dee2aaSAndroid Build Coastguard Worker    args.append('--properties')
59*c8dee2aaSAndroid Build Coastguard Worker    # Map iteration order is arbitrary; in order to maintain a consistent step
60*c8dee2aaSAndroid Build Coastguard Worker    # ordering, sort by key.
61*c8dee2aaSAndroid Build Coastguard Worker    for k in sorted(props.keys()):
62*c8dee2aaSAndroid Build Coastguard Worker      v = props[k]
63*c8dee2aaSAndroid Build Coastguard Worker      if v == '${SWARMING_BOT_ID}':
64*c8dee2aaSAndroid Build Coastguard Worker        v = swarming_bot_id
65*c8dee2aaSAndroid Build Coastguard Worker      elif v == '${SWARMING_TASK_ID}':
66*c8dee2aaSAndroid Build Coastguard Worker        v = swarming_task_id
67*c8dee2aaSAndroid Build Coastguard Worker      if v != '':
68*c8dee2aaSAndroid Build Coastguard Worker        args.extend([k, v])
69*c8dee2aaSAndroid Build Coastguard Worker
70*c8dee2aaSAndroid Build Coastguard Worker  # Paths to required resources.
71*c8dee2aaSAndroid Build Coastguard Worker  if resources:
72*c8dee2aaSAndroid Build Coastguard Worker    args.extend(['-i', api.flavor.device_dirs.resource_dir])
73*c8dee2aaSAndroid Build Coastguard Worker  if skps:
74*c8dee2aaSAndroid Build Coastguard Worker    args.extend(['--skps', api.flavor.device_dirs.skp_dir]),
75*c8dee2aaSAndroid Build Coastguard Worker  if images:
76*c8dee2aaSAndroid Build Coastguard Worker    args.extend(['--images', api.flavor.device_path_join(
77*c8dee2aaSAndroid Build Coastguard Worker        api.flavor.device_dirs.images_dir, 'nanobench')])
78*c8dee2aaSAndroid Build Coastguard Worker  if texttraces:
79*c8dee2aaSAndroid Build Coastguard Worker    assert api.flavor.device_dirs.texttraces_dir
80*c8dee2aaSAndroid Build Coastguard Worker    args.extend(['--texttraces', api.flavor.device_dirs.texttraces_dir])
81*c8dee2aaSAndroid Build Coastguard Worker  if svgs:
82*c8dee2aaSAndroid Build Coastguard Worker    args.extend(['--svgs',  api.flavor.device_dirs.svg_dir])
83*c8dee2aaSAndroid Build Coastguard Worker  if do_upload:
84*c8dee2aaSAndroid Build Coastguard Worker    now = api.time.utcnow()
85*c8dee2aaSAndroid Build Coastguard Worker    ts = int(calendar.timegm(now.utctimetuple()))
86*c8dee2aaSAndroid Build Coastguard Worker    json_path = api.flavor.device_path_join(
87*c8dee2aaSAndroid Build Coastguard Worker        api.flavor.device_dirs.perf_data_dir,
88*c8dee2aaSAndroid Build Coastguard Worker        'nanobench_%s_%d.json' % (api.properties['revision'], ts))
89*c8dee2aaSAndroid Build Coastguard Worker    args.extend(['--outResultsFile', json_path])
90*c8dee2aaSAndroid Build Coastguard Worker
91*c8dee2aaSAndroid Build Coastguard Worker  api.run(api.flavor.step, 'nanobench', cmd=args,
92*c8dee2aaSAndroid Build Coastguard Worker          abort_on_failure=False)
93*c8dee2aaSAndroid Build Coastguard Worker
94*c8dee2aaSAndroid Build Coastguard Worker  # Copy results to swarming out dir.
95*c8dee2aaSAndroid Build Coastguard Worker  if do_upload:
96*c8dee2aaSAndroid Build Coastguard Worker    api.file.ensure_directory(
97*c8dee2aaSAndroid Build Coastguard Worker        'makedirs perf_dir',
98*c8dee2aaSAndroid Build Coastguard Worker        api.flavor.host_dirs.perf_data_dir)
99*c8dee2aaSAndroid Build Coastguard Worker    api.flavor.copy_directory_contents_to_host(
100*c8dee2aaSAndroid Build Coastguard Worker        api.flavor.device_dirs.perf_data_dir,
101*c8dee2aaSAndroid Build Coastguard Worker        api.flavor.host_dirs.perf_data_dir)
102*c8dee2aaSAndroid Build Coastguard Worker
103*c8dee2aaSAndroid Build Coastguard Worker
104*c8dee2aaSAndroid Build Coastguard Workerdef RunSteps(api):
105*c8dee2aaSAndroid Build Coastguard Worker  api.vars.setup()
106*c8dee2aaSAndroid Build Coastguard Worker  api.file.ensure_directory('makedirs tmp_dir', api.vars.tmp_dir)
107*c8dee2aaSAndroid Build Coastguard Worker  api.flavor.setup('nanobench')
108*c8dee2aaSAndroid Build Coastguard Worker
109*c8dee2aaSAndroid Build Coastguard Worker  try:
110*c8dee2aaSAndroid Build Coastguard Worker    perf_steps(api)
111*c8dee2aaSAndroid Build Coastguard Worker  finally:
112*c8dee2aaSAndroid Build Coastguard Worker    api.flavor.cleanup_steps()
113*c8dee2aaSAndroid Build Coastguard Worker  api.run.check_failure()
114*c8dee2aaSAndroid Build Coastguard Worker
115*c8dee2aaSAndroid Build Coastguard Worker
116*c8dee2aaSAndroid Build Coastguard WorkerTEST_BUILDERS = [
117*c8dee2aaSAndroid Build Coastguard Worker  'Perf-Android-Clang-Nexus7-CPU-Tegra3-arm-Debug-All-Android',
118*c8dee2aaSAndroid Build Coastguard Worker  ('Perf-Ubuntu18-Clang-Golo-GPU-QuadroP400-x86_64-Release-All'
119*c8dee2aaSAndroid Build Coastguard Worker   '-Valgrind_SK_CPU_LIMIT_SSE41'),
120*c8dee2aaSAndroid Build Coastguard Worker  'Perf-Win10-Clang-Golo-GPU-QuadroP400-x86_64-Release-All-ANGLE',
121*c8dee2aaSAndroid Build Coastguard Worker]
122*c8dee2aaSAndroid Build Coastguard Worker
123*c8dee2aaSAndroid Build Coastguard Worker
124*c8dee2aaSAndroid Build Coastguard Workerdef GenTests(api):
125*c8dee2aaSAndroid Build Coastguard Worker  for builder in TEST_BUILDERS:
126*c8dee2aaSAndroid Build Coastguard Worker    props = dict(
127*c8dee2aaSAndroid Build Coastguard Worker      buildername=builder,
128*c8dee2aaSAndroid Build Coastguard Worker      nanobench_flags='["nanobench","--example","--flags"]',
129*c8dee2aaSAndroid Build Coastguard Worker      nanobench_properties=('{"key1":"value1","key2":"",'
130*c8dee2aaSAndroid Build Coastguard Worker                            '"bot":"${SWARMING_BOT_ID}",'
131*c8dee2aaSAndroid Build Coastguard Worker                            '"task":"${SWARMING_TASK_ID}"}'),
132*c8dee2aaSAndroid Build Coastguard Worker      path_config='kitchen',
133*c8dee2aaSAndroid Build Coastguard Worker      resources='true',
134*c8dee2aaSAndroid Build Coastguard Worker      revision='abc123',
135*c8dee2aaSAndroid Build Coastguard Worker      swarm_out_dir='[SWARM_OUT_DIR]'
136*c8dee2aaSAndroid Build Coastguard Worker    )
137*c8dee2aaSAndroid Build Coastguard Worker    if 'Valgrind' not in builder and 'Debug' not in builder:
138*c8dee2aaSAndroid Build Coastguard Worker      props['do_upload'] = 'true'
139*c8dee2aaSAndroid Build Coastguard Worker    if 'GPU' not in builder:
140*c8dee2aaSAndroid Build Coastguard Worker      props['images'] = 'true'
141*c8dee2aaSAndroid Build Coastguard Worker    if 'iOS' not in builder:
142*c8dee2aaSAndroid Build Coastguard Worker      props['skps'] = 'true'
143*c8dee2aaSAndroid Build Coastguard Worker    if 'Valgrind' not in builder:
144*c8dee2aaSAndroid Build Coastguard Worker      props['svgs'] = 'true'
145*c8dee2aaSAndroid Build Coastguard Worker    if 'Android' in builder and 'CPU' in builder:
146*c8dee2aaSAndroid Build Coastguard Worker      props['texttraces'] = 'true'
147*c8dee2aaSAndroid Build Coastguard Worker    test = (
148*c8dee2aaSAndroid Build Coastguard Worker      api.test(builder) +
149*c8dee2aaSAndroid Build Coastguard Worker      api.properties(**props) +
150*c8dee2aaSAndroid Build Coastguard Worker      api.path.exists(
151*c8dee2aaSAndroid Build Coastguard Worker          api.path.start_dir.joinpath('skia'),
152*c8dee2aaSAndroid Build Coastguard Worker          api.path.start_dir.joinpath('skia', 'infra', 'bots', 'assets',
153*c8dee2aaSAndroid Build Coastguard Worker                                      'skimage', 'VERSION'),
154*c8dee2aaSAndroid Build Coastguard Worker          api.path.start_dir.joinpath('skia', 'infra', 'bots', 'assets',
155*c8dee2aaSAndroid Build Coastguard Worker                                      'skp', 'VERSION'),
156*c8dee2aaSAndroid Build Coastguard Worker      ) +
157*c8dee2aaSAndroid Build Coastguard Worker      api.step_data('get swarming bot id',
158*c8dee2aaSAndroid Build Coastguard Worker          stdout=api.raw_io.output('skia-bot-123')) +
159*c8dee2aaSAndroid Build Coastguard Worker      api.step_data('get swarming task id',
160*c8dee2aaSAndroid Build Coastguard Worker          stdout=api.raw_io.output('123456'))
161*c8dee2aaSAndroid Build Coastguard Worker    )
162*c8dee2aaSAndroid Build Coastguard Worker    if 'Win' in builder:
163*c8dee2aaSAndroid Build Coastguard Worker      test += api.platform('win', 64)
164*c8dee2aaSAndroid Build Coastguard Worker
165*c8dee2aaSAndroid Build Coastguard Worker    yield test
166