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