blob: d241fdca61893ee2558be321dbb544365c2e7152 [file] [log] [blame]
[
{
"cmd": [
"python",
"-u",
"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
"--json-output",
"/path/to/tmp/json",
"ensure-directory",
"--mode",
"0777",
"[START_DIR]/cache/work"
],
"infra_step": true,
"name": "makedirs checkout_path"
},
{
"cmd": [
"python",
"-u",
"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
"--json-output",
"/path/to/tmp/json",
"remove",
"[START_DIR]/cache/work/.gclient_entries"
],
"infra_step": true,
"name": "remove [START_DIR]/cache/work/.gclient_entries"
},
{
"cmd": [
"python",
"-u",
"RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
"--spec-path",
"cache_dir = '[START_DIR]/cache/git'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]",
"--patch_root",
"skia",
"--revision_mapping_file",
"{\"got_revision\": \"skia\"}",
"--git-cache-dir",
"[START_DIR]/cache/git",
"--cleanup-dir",
"[CLEANUP]/bot_update",
"--output_json",
"/path/to/tmp/json",
"--revision",
"skia@abc123"
],
"cwd": "[START_DIR]/cache/work",
"env_suffixes": {
"PATH": [
"RECIPE_REPO[depot_tools]"
]
},
"infra_step": true,
"name": "bot_update",
"~followup_annotations": [
"@@@STEP_TEXT@Some step text@@@",
"@@@STEP_LOG_LINE@json.output@{@@@",
"@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
"@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
"@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@",
"@@@STEP_LOG_LINE@json.output@ }, @@@",
"@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
"@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
"@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@",
"@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
"@@@STEP_LOG_LINE@json.output@ }@@@",
"@@@STEP_LOG_LINE@json.output@ }, @@@",
"@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
"@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@",
"@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
"@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@",
"@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@",
"@@@STEP_LOG_LINE@json.output@ }, @@@",
"@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@",
"@@@STEP_LOG_LINE@json.output@ \"source_manifest\": {@@@",
"@@@STEP_LOG_LINE@json.output@ \"directories\": {@@@",
"@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@",
"@@@STEP_LOG_LINE@json.output@ \"git_checkout\": {@@@",
"@@@STEP_LOG_LINE@json.output@ \"repo_url\": \"https://fake.org/skia.git\", @@@",
"@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
"@@@STEP_LOG_LINE@json.output@ }@@@",
"@@@STEP_LOG_LINE@json.output@ }@@@",
"@@@STEP_LOG_LINE@json.output@ }, @@@",
"@@@STEP_LOG_LINE@json.output@ \"version\": 0@@@",
"@@@STEP_LOG_LINE@json.output@ }, @@@",
"@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
"@@@STEP_LOG_LINE@json.output@}@@@",
"@@@STEP_LOG_END@json.output@@@",
"@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@",
"@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@"
]
},
{
"cmd": [
"python",
"-u",
"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
"--json-output",
"/path/to/tmp/json",
"listdir",
"[START_DIR]/lottie-samples"
],
"infra_step": true,
"name": "list lottie files",
"~followup_annotations": [
"@@@STEP_LOG_LINE@listdir@[START_DIR]/lottie-samples/LICENSE@@@",
"@@@STEP_LOG_LINE@listdir@[START_DIR]/lottie-samples/lottie1.json@@@",
"@@@STEP_LOG_LINE@listdir@[START_DIR]/lottie-samples/lottie2.json@@@",
"@@@STEP_LOG_LINE@listdir@[START_DIR]/lottie-samples/lottie3.json@@@",
"@@@STEP_LOG_END@listdir@@@"
]
},
{
"cmd": [
"npm",
"install"
],
"cwd": "[START_DIR]/cache/work/skia/tools/lottie-web-perf",
"env_prefixes": {
"PATH": [
"[START_DIR]/node/node/bin"
]
},
"name": "npm install"
},
{
"cmd": [
"[START_DIR]/node/node/bin/node",
"[START_DIR]/cache/work/skia/tools/lottie-web-perf/lottie-web-perf.js",
"--backend",
"svg",
"--input",
"[START_DIR]/lottie-samples/lottie1.json",
"--output",
"[CLEANUP]/g3_try_tmp_1/lottie1.json"
],
"cwd": "[START_DIR]/cache/work/skia/tools/lottie-web-perf",
"env": {
"CHROME_HEADLESS": "1",
"DISPLAY": ":0",
"PATH": "<PATH>:RECIPE_REPO[depot_tools]"
},
"infra_step": true,
"name": "Run perf cmd line app"
},
{
"cmd": [
"python",
"-u",
"\nimport json\nimport sys\n\ntrace_output = sys.argv[1]\nwith open(trace_output, 'r') as f:\n trace_json = json.load(f)\noutput_json_file = sys.argv[2]\nrenderer = sys.argv[3] # Unused for now but might be useful in the future.\n\n# Output data about the GPU that was used.\nprint 'GPU data:'\nprint trace_json['metadata'].get('gpu-gl-renderer')\nprint trace_json['metadata'].get('gpu-driver')\nprint trace_json['metadata'].get('gpu-gl-vendor')\n\nerroneous_termination_statuses = [\n 'replaced_by_new_reporter_at_same_stage',\n 'did_not_produce_frame',\n]\naccepted_termination_statuses = [\n 'missed_frame',\n 'submitted_frame',\n 'main_frame_aborted'\n]\n\ncurrent_frame_duration = 0\ntotal_frames = 0\nframe_id_to_start_ts = {}\n# Will contain tuples of frame_ids and their duration and status.\ncompleted_frame_id_and_duration_status = []\n# Will contain tuples of drawn frame_ids and their duration.\ndrawn_frame_id_and_duration = []\nfor trace in trace_json['traceEvents']:\n if 'PipelineReporter' in trace['name']:\n frame_id = trace['id']\n args = trace.get('args')\n if args and args.get('step') == 'BeginImplFrameToSendBeginMainFrame':\n frame_id_to_start_ts[frame_id] = trace['ts']\n elif args and (args.get('termination_status') in\n accepted_termination_statuses):\n if not frame_id_to_start_ts.get(frame_id):\n print '[No start ts found for %s]' % frame_id\n continue\n current_frame_duration = trace['ts'] - frame_id_to_start_ts[frame_id]\n total_frames += 1\n completed_frame_id_and_duration_status.append(\n (frame_id, current_frame_duration, args['termination_status']))\n if(args['termination_status'] == 'missed_frame' or\n args['termination_status'] == 'submitted_frame'):\n drawn_frame_id_and_duration.append((frame_id, current_frame_duration))\n\n # We are done with this frame_id so remove it from the dict.\n frame_id_to_start_ts.pop(frame_id)\n print '%d (%s with %s): %d' % (\n total_frames, frame_id, args['termination_status'],\n current_frame_duration)\n elif args and (args.get('termination_status') in\n erroneous_termination_statuses):\n # Invalidate previously collected results for this frame_id.\n if frame_id_to_start_ts.get(frame_id):\n print '[Invalidating %s due to %s]' % (\n frame_id, args['termination_status'])\n frame_id_to_start_ts.pop(frame_id)\n\n# Calculate metrics for total completed frames.\ntotal_completed_frames = len(completed_frame_id_and_duration_status)\nif total_completed_frames < 25:\n raise Exception('Even with 3 loops found only %d frames' %\n total_completed_frames)\n# Get frame avg/min/max for the middle 25 frames.\nstart = (total_completed_frames - 25)/2\nprint 'Got %d total completed frames. Using indexes [%d, %d).' % (\n total_completed_frames, start, start+25)\nframe_max = 0\nframe_min = 0\nframe_cumulative = 0\naborted_frames = 0\nfor frame_id, duration, status in (\n completed_frame_id_and_duration_status[start:start+25]):\n frame_max = max(frame_max, duration)\n frame_min = min(frame_min, duration) if frame_min else duration\n frame_cumulative += duration\n if status == 'main_frame_aborted':\n aborted_frames += 1\n\nperf_results = {}\nperf_results['frame_max_us'] = frame_max\nperf_results['frame_min_us'] = frame_min\nperf_results['frame_avg_us'] = frame_cumulative/25\nperf_results['aborted_frames'] = aborted_frames\n\n# Now calculate metrics for only drawn frames.\ndrawn_frame_max = 0\ndrawn_frame_min = 0\ndrawn_frame_cumulative = 0\ntotal_drawn_frames = len(drawn_frame_id_and_duration)\nif total_drawn_frames < 25:\n raise Exception('Even with 3 loops found only %d drawn frames' %\n total_drawn_frames)\n# Get drawn frame avg/min/max from the middle 25 frames.\nstart = (total_drawn_frames - 25)/2\nprint 'Got %d total drawn frames. Using indexes [%d-%d).' % (\n total_drawn_frames, start, start+25)\nfor frame_id, duration in drawn_frame_id_and_duration[start:start+25]:\n drawn_frame_max = max(drawn_frame_max, duration)\n drawn_frame_min = (min(drawn_frame_min, duration)\n if drawn_frame_min else duration)\n drawn_frame_cumulative += duration\n# Add metrics to perf_results.\nperf_results['drawn_frame_max_us'] = drawn_frame_max\nperf_results['drawn_frame_min_us'] = drawn_frame_min\nperf_results['drawn_frame_avg_us'] = drawn_frame_cumulative/25\n\nprint 'Final perf_results dict: %s' % perf_results\n\n# Write perf_results to the output json.\nwith open(output_json_file, 'w') as f:\n f.write(json.dumps(perf_results))\n",
"[CLEANUP]/g3_try_tmp_1/lottie1.json",
"/path/to/tmp/json",
"lottie-web"
],
"env": {
"CHROME_HEADLESS": "1",
"PATH": "<PATH>:RECIPE_REPO[depot_tools]"
},
"name": "parse lottie1.json trace",
"~followup_annotations": [
"@@@STEP_LOG_LINE@json.output@{@@@",
"@@@STEP_LOG_LINE@json.output@ \"frame_avg_us\": 179.71, @@@",
"@@@STEP_LOG_LINE@json.output@ \"frame_max_us\": 218.25, @@@",
"@@@STEP_LOG_LINE@json.output@ \"frame_min_us\": 141.17@@@",
"@@@STEP_LOG_LINE@json.output@}@@@",
"@@@STEP_LOG_END@json.output@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@import json@@@",
"@@@STEP_LOG_LINE@python.inline@import sys@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@trace_output = sys.argv[1]@@@",
"@@@STEP_LOG_LINE@python.inline@with open(trace_output, 'r') as f:@@@",
"@@@STEP_LOG_LINE@python.inline@ trace_json = json.load(f)@@@",
"@@@STEP_LOG_LINE@python.inline@output_json_file = sys.argv[2]@@@",
"@@@STEP_LOG_LINE@python.inline@renderer = sys.argv[3] # Unused for now but might be useful in the future.@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@# Output data about the GPU that was used.@@@",
"@@@STEP_LOG_LINE@python.inline@print 'GPU data:'@@@",
"@@@STEP_LOG_LINE@python.inline@print trace_json['metadata'].get('gpu-gl-renderer')@@@",
"@@@STEP_LOG_LINE@python.inline@print trace_json['metadata'].get('gpu-driver')@@@",
"@@@STEP_LOG_LINE@python.inline@print trace_json['metadata'].get('gpu-gl-vendor')@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@erroneous_termination_statuses = [@@@",
"@@@STEP_LOG_LINE@python.inline@ 'replaced_by_new_reporter_at_same_stage',@@@",
"@@@STEP_LOG_LINE@python.inline@ 'did_not_produce_frame',@@@",
"@@@STEP_LOG_LINE@python.inline@]@@@",
"@@@STEP_LOG_LINE@python.inline@accepted_termination_statuses = [@@@",
"@@@STEP_LOG_LINE@python.inline@ 'missed_frame',@@@",
"@@@STEP_LOG_LINE@python.inline@ 'submitted_frame',@@@",
"@@@STEP_LOG_LINE@python.inline@ 'main_frame_aborted'@@@",
"@@@STEP_LOG_LINE@python.inline@]@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@current_frame_duration = 0@@@",
"@@@STEP_LOG_LINE@python.inline@total_frames = 0@@@",
"@@@STEP_LOG_LINE@python.inline@frame_id_to_start_ts = {}@@@",
"@@@STEP_LOG_LINE@python.inline@# Will contain tuples of frame_ids and their duration and status.@@@",
"@@@STEP_LOG_LINE@python.inline@completed_frame_id_and_duration_status = []@@@",
"@@@STEP_LOG_LINE@python.inline@# Will contain tuples of drawn frame_ids and their duration.@@@",
"@@@STEP_LOG_LINE@python.inline@drawn_frame_id_and_duration = []@@@",
"@@@STEP_LOG_LINE@python.inline@for trace in trace_json['traceEvents']:@@@",
"@@@STEP_LOG_LINE@python.inline@ if 'PipelineReporter' in trace['name']:@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_id = trace['id']@@@",
"@@@STEP_LOG_LINE@python.inline@ args = trace.get('args')@@@",
"@@@STEP_LOG_LINE@python.inline@ if args and args.get('step') == 'BeginImplFrameToSendBeginMainFrame':@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_id_to_start_ts[frame_id] = trace['ts']@@@",
"@@@STEP_LOG_LINE@python.inline@ elif args and (args.get('termination_status') in@@@",
"@@@STEP_LOG_LINE@python.inline@ accepted_termination_statuses):@@@",
"@@@STEP_LOG_LINE@python.inline@ if not frame_id_to_start_ts.get(frame_id):@@@",
"@@@STEP_LOG_LINE@python.inline@ print '[No start ts found for %s]' % frame_id@@@",
"@@@STEP_LOG_LINE@python.inline@ continue@@@",
"@@@STEP_LOG_LINE@python.inline@ current_frame_duration = trace['ts'] - frame_id_to_start_ts[frame_id]@@@",
"@@@STEP_LOG_LINE@python.inline@ total_frames += 1@@@",
"@@@STEP_LOG_LINE@python.inline@ completed_frame_id_and_duration_status.append(@@@",
"@@@STEP_LOG_LINE@python.inline@ (frame_id, current_frame_duration, args['termination_status']))@@@",
"@@@STEP_LOG_LINE@python.inline@ if(args['termination_status'] == 'missed_frame' or@@@",
"@@@STEP_LOG_LINE@python.inline@ args['termination_status'] == 'submitted_frame'):@@@",
"@@@STEP_LOG_LINE@python.inline@ drawn_frame_id_and_duration.append((frame_id, current_frame_duration))@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@ # We are done with this frame_id so remove it from the dict.@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_id_to_start_ts.pop(frame_id)@@@",
"@@@STEP_LOG_LINE@python.inline@ print '%d (%s with %s): %d' % (@@@",
"@@@STEP_LOG_LINE@python.inline@ total_frames, frame_id, args['termination_status'],@@@",
"@@@STEP_LOG_LINE@python.inline@ current_frame_duration)@@@",
"@@@STEP_LOG_LINE@python.inline@ elif args and (args.get('termination_status') in@@@",
"@@@STEP_LOG_LINE@python.inline@ erroneous_termination_statuses):@@@",
"@@@STEP_LOG_LINE@python.inline@ # Invalidate previously collected results for this frame_id.@@@",
"@@@STEP_LOG_LINE@python.inline@ if frame_id_to_start_ts.get(frame_id):@@@",
"@@@STEP_LOG_LINE@python.inline@ print '[Invalidating %s due to %s]' % (@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_id, args['termination_status'])@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_id_to_start_ts.pop(frame_id)@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@# Calculate metrics for total completed frames.@@@",
"@@@STEP_LOG_LINE@python.inline@total_completed_frames = len(completed_frame_id_and_duration_status)@@@",
"@@@STEP_LOG_LINE@python.inline@if total_completed_frames < 25:@@@",
"@@@STEP_LOG_LINE@python.inline@ raise Exception('Even with 3 loops found only %d frames' %@@@",
"@@@STEP_LOG_LINE@python.inline@ total_completed_frames)@@@",
"@@@STEP_LOG_LINE@python.inline@# Get frame avg/min/max for the middle 25 frames.@@@",
"@@@STEP_LOG_LINE@python.inline@start = (total_completed_frames - 25)/2@@@",
"@@@STEP_LOG_LINE@python.inline@print 'Got %d total completed frames. Using indexes [%d, %d).' % (@@@",
"@@@STEP_LOG_LINE@python.inline@ total_completed_frames, start, start+25)@@@",
"@@@STEP_LOG_LINE@python.inline@frame_max = 0@@@",
"@@@STEP_LOG_LINE@python.inline@frame_min = 0@@@",
"@@@STEP_LOG_LINE@python.inline@frame_cumulative = 0@@@",
"@@@STEP_LOG_LINE@python.inline@aborted_frames = 0@@@",
"@@@STEP_LOG_LINE@python.inline@for frame_id, duration, status in (@@@",
"@@@STEP_LOG_LINE@python.inline@ completed_frame_id_and_duration_status[start:start+25]):@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_max = max(frame_max, duration)@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_min = min(frame_min, duration) if frame_min else duration@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_cumulative += duration@@@",
"@@@STEP_LOG_LINE@python.inline@ if status == 'main_frame_aborted':@@@",
"@@@STEP_LOG_LINE@python.inline@ aborted_frames += 1@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results = {}@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['frame_max_us'] = frame_max@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['frame_min_us'] = frame_min@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['frame_avg_us'] = frame_cumulative/25@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['aborted_frames'] = aborted_frames@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@# Now calculate metrics for only drawn frames.@@@",
"@@@STEP_LOG_LINE@python.inline@drawn_frame_max = 0@@@",
"@@@STEP_LOG_LINE@python.inline@drawn_frame_min = 0@@@",
"@@@STEP_LOG_LINE@python.inline@drawn_frame_cumulative = 0@@@",
"@@@STEP_LOG_LINE@python.inline@total_drawn_frames = len(drawn_frame_id_and_duration)@@@",
"@@@STEP_LOG_LINE@python.inline@if total_drawn_frames < 25:@@@",
"@@@STEP_LOG_LINE@python.inline@ raise Exception('Even with 3 loops found only %d drawn frames' %@@@",
"@@@STEP_LOG_LINE@python.inline@ total_drawn_frames)@@@",
"@@@STEP_LOG_LINE@python.inline@# Get drawn frame avg/min/max from the middle 25 frames.@@@",
"@@@STEP_LOG_LINE@python.inline@start = (total_drawn_frames - 25)/2@@@",
"@@@STEP_LOG_LINE@python.inline@print 'Got %d total drawn frames. Using indexes [%d-%d).' % (@@@",
"@@@STEP_LOG_LINE@python.inline@ total_drawn_frames, start, start+25)@@@",
"@@@STEP_LOG_LINE@python.inline@for frame_id, duration in drawn_frame_id_and_duration[start:start+25]:@@@",
"@@@STEP_LOG_LINE@python.inline@ drawn_frame_max = max(drawn_frame_max, duration)@@@",
"@@@STEP_LOG_LINE@python.inline@ drawn_frame_min = (min(drawn_frame_min, duration)@@@",
"@@@STEP_LOG_LINE@python.inline@ if drawn_frame_min else duration)@@@",
"@@@STEP_LOG_LINE@python.inline@ drawn_frame_cumulative += duration@@@",
"@@@STEP_LOG_LINE@python.inline@# Add metrics to perf_results.@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['drawn_frame_max_us'] = drawn_frame_max@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['drawn_frame_min_us'] = drawn_frame_min@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['drawn_frame_avg_us'] = drawn_frame_cumulative/25@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@print 'Final perf_results dict: %s' % perf_results@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@# Write perf_results to the output json.@@@",
"@@@STEP_LOG_LINE@python.inline@with open(output_json_file, 'w') as f:@@@",
"@@@STEP_LOG_LINE@python.inline@ f.write(json.dumps(perf_results))@@@",
"@@@STEP_LOG_END@python.inline@@@"
]
},
{
"cmd": [
"[START_DIR]/node/node/bin/node",
"[START_DIR]/cache/work/skia/tools/lottie-web-perf/lottie-web-perf.js",
"--backend",
"svg",
"--input",
"[START_DIR]/lottie-samples/lottie2.json",
"--output",
"[CLEANUP]/g3_try_tmp_1/lottie2.json"
],
"cwd": "[START_DIR]/cache/work/skia/tools/lottie-web-perf",
"env": {
"CHROME_HEADLESS": "1",
"DISPLAY": ":0",
"PATH": "<PATH>:RECIPE_REPO[depot_tools]"
},
"infra_step": true,
"name": "Run perf cmd line app (2)"
},
{
"cmd": [
"python",
"-u",
"\nimport json\nimport sys\n\ntrace_output = sys.argv[1]\nwith open(trace_output, 'r') as f:\n trace_json = json.load(f)\noutput_json_file = sys.argv[2]\nrenderer = sys.argv[3] # Unused for now but might be useful in the future.\n\n# Output data about the GPU that was used.\nprint 'GPU data:'\nprint trace_json['metadata'].get('gpu-gl-renderer')\nprint trace_json['metadata'].get('gpu-driver')\nprint trace_json['metadata'].get('gpu-gl-vendor')\n\nerroneous_termination_statuses = [\n 'replaced_by_new_reporter_at_same_stage',\n 'did_not_produce_frame',\n]\naccepted_termination_statuses = [\n 'missed_frame',\n 'submitted_frame',\n 'main_frame_aborted'\n]\n\ncurrent_frame_duration = 0\ntotal_frames = 0\nframe_id_to_start_ts = {}\n# Will contain tuples of frame_ids and their duration and status.\ncompleted_frame_id_and_duration_status = []\n# Will contain tuples of drawn frame_ids and their duration.\ndrawn_frame_id_and_duration = []\nfor trace in trace_json['traceEvents']:\n if 'PipelineReporter' in trace['name']:\n frame_id = trace['id']\n args = trace.get('args')\n if args and args.get('step') == 'BeginImplFrameToSendBeginMainFrame':\n frame_id_to_start_ts[frame_id] = trace['ts']\n elif args and (args.get('termination_status') in\n accepted_termination_statuses):\n if not frame_id_to_start_ts.get(frame_id):\n print '[No start ts found for %s]' % frame_id\n continue\n current_frame_duration = trace['ts'] - frame_id_to_start_ts[frame_id]\n total_frames += 1\n completed_frame_id_and_duration_status.append(\n (frame_id, current_frame_duration, args['termination_status']))\n if(args['termination_status'] == 'missed_frame' or\n args['termination_status'] == 'submitted_frame'):\n drawn_frame_id_and_duration.append((frame_id, current_frame_duration))\n\n # We are done with this frame_id so remove it from the dict.\n frame_id_to_start_ts.pop(frame_id)\n print '%d (%s with %s): %d' % (\n total_frames, frame_id, args['termination_status'],\n current_frame_duration)\n elif args and (args.get('termination_status') in\n erroneous_termination_statuses):\n # Invalidate previously collected results for this frame_id.\n if frame_id_to_start_ts.get(frame_id):\n print '[Invalidating %s due to %s]' % (\n frame_id, args['termination_status'])\n frame_id_to_start_ts.pop(frame_id)\n\n# Calculate metrics for total completed frames.\ntotal_completed_frames = len(completed_frame_id_and_duration_status)\nif total_completed_frames < 25:\n raise Exception('Even with 3 loops found only %d frames' %\n total_completed_frames)\n# Get frame avg/min/max for the middle 25 frames.\nstart = (total_completed_frames - 25)/2\nprint 'Got %d total completed frames. Using indexes [%d, %d).' % (\n total_completed_frames, start, start+25)\nframe_max = 0\nframe_min = 0\nframe_cumulative = 0\naborted_frames = 0\nfor frame_id, duration, status in (\n completed_frame_id_and_duration_status[start:start+25]):\n frame_max = max(frame_max, duration)\n frame_min = min(frame_min, duration) if frame_min else duration\n frame_cumulative += duration\n if status == 'main_frame_aborted':\n aborted_frames += 1\n\nperf_results = {}\nperf_results['frame_max_us'] = frame_max\nperf_results['frame_min_us'] = frame_min\nperf_results['frame_avg_us'] = frame_cumulative/25\nperf_results['aborted_frames'] = aborted_frames\n\n# Now calculate metrics for only drawn frames.\ndrawn_frame_max = 0\ndrawn_frame_min = 0\ndrawn_frame_cumulative = 0\ntotal_drawn_frames = len(drawn_frame_id_and_duration)\nif total_drawn_frames < 25:\n raise Exception('Even with 3 loops found only %d drawn frames' %\n total_drawn_frames)\n# Get drawn frame avg/min/max from the middle 25 frames.\nstart = (total_drawn_frames - 25)/2\nprint 'Got %d total drawn frames. Using indexes [%d-%d).' % (\n total_drawn_frames, start, start+25)\nfor frame_id, duration in drawn_frame_id_and_duration[start:start+25]:\n drawn_frame_max = max(drawn_frame_max, duration)\n drawn_frame_min = (min(drawn_frame_min, duration)\n if drawn_frame_min else duration)\n drawn_frame_cumulative += duration\n# Add metrics to perf_results.\nperf_results['drawn_frame_max_us'] = drawn_frame_max\nperf_results['drawn_frame_min_us'] = drawn_frame_min\nperf_results['drawn_frame_avg_us'] = drawn_frame_cumulative/25\n\nprint 'Final perf_results dict: %s' % perf_results\n\n# Write perf_results to the output json.\nwith open(output_json_file, 'w') as f:\n f.write(json.dumps(perf_results))\n",
"[CLEANUP]/g3_try_tmp_1/lottie2.json",
"/path/to/tmp/json",
"lottie-web"
],
"env": {
"CHROME_HEADLESS": "1",
"PATH": "<PATH>:RECIPE_REPO[depot_tools]"
},
"name": "parse lottie2.json trace",
"~followup_annotations": [
"@@@STEP_LOG_LINE@json.output@{@@@",
"@@@STEP_LOG_LINE@json.output@ \"frame_avg_us\": 179.71, @@@",
"@@@STEP_LOG_LINE@json.output@ \"frame_max_us\": 218.25, @@@",
"@@@STEP_LOG_LINE@json.output@ \"frame_min_us\": 141.17@@@",
"@@@STEP_LOG_LINE@json.output@}@@@",
"@@@STEP_LOG_END@json.output@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@import json@@@",
"@@@STEP_LOG_LINE@python.inline@import sys@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@trace_output = sys.argv[1]@@@",
"@@@STEP_LOG_LINE@python.inline@with open(trace_output, 'r') as f:@@@",
"@@@STEP_LOG_LINE@python.inline@ trace_json = json.load(f)@@@",
"@@@STEP_LOG_LINE@python.inline@output_json_file = sys.argv[2]@@@",
"@@@STEP_LOG_LINE@python.inline@renderer = sys.argv[3] # Unused for now but might be useful in the future.@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@# Output data about the GPU that was used.@@@",
"@@@STEP_LOG_LINE@python.inline@print 'GPU data:'@@@",
"@@@STEP_LOG_LINE@python.inline@print trace_json['metadata'].get('gpu-gl-renderer')@@@",
"@@@STEP_LOG_LINE@python.inline@print trace_json['metadata'].get('gpu-driver')@@@",
"@@@STEP_LOG_LINE@python.inline@print trace_json['metadata'].get('gpu-gl-vendor')@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@erroneous_termination_statuses = [@@@",
"@@@STEP_LOG_LINE@python.inline@ 'replaced_by_new_reporter_at_same_stage',@@@",
"@@@STEP_LOG_LINE@python.inline@ 'did_not_produce_frame',@@@",
"@@@STEP_LOG_LINE@python.inline@]@@@",
"@@@STEP_LOG_LINE@python.inline@accepted_termination_statuses = [@@@",
"@@@STEP_LOG_LINE@python.inline@ 'missed_frame',@@@",
"@@@STEP_LOG_LINE@python.inline@ 'submitted_frame',@@@",
"@@@STEP_LOG_LINE@python.inline@ 'main_frame_aborted'@@@",
"@@@STEP_LOG_LINE@python.inline@]@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@current_frame_duration = 0@@@",
"@@@STEP_LOG_LINE@python.inline@total_frames = 0@@@",
"@@@STEP_LOG_LINE@python.inline@frame_id_to_start_ts = {}@@@",
"@@@STEP_LOG_LINE@python.inline@# Will contain tuples of frame_ids and their duration and status.@@@",
"@@@STEP_LOG_LINE@python.inline@completed_frame_id_and_duration_status = []@@@",
"@@@STEP_LOG_LINE@python.inline@# Will contain tuples of drawn frame_ids and their duration.@@@",
"@@@STEP_LOG_LINE@python.inline@drawn_frame_id_and_duration = []@@@",
"@@@STEP_LOG_LINE@python.inline@for trace in trace_json['traceEvents']:@@@",
"@@@STEP_LOG_LINE@python.inline@ if 'PipelineReporter' in trace['name']:@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_id = trace['id']@@@",
"@@@STEP_LOG_LINE@python.inline@ args = trace.get('args')@@@",
"@@@STEP_LOG_LINE@python.inline@ if args and args.get('step') == 'BeginImplFrameToSendBeginMainFrame':@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_id_to_start_ts[frame_id] = trace['ts']@@@",
"@@@STEP_LOG_LINE@python.inline@ elif args and (args.get('termination_status') in@@@",
"@@@STEP_LOG_LINE@python.inline@ accepted_termination_statuses):@@@",
"@@@STEP_LOG_LINE@python.inline@ if not frame_id_to_start_ts.get(frame_id):@@@",
"@@@STEP_LOG_LINE@python.inline@ print '[No start ts found for %s]' % frame_id@@@",
"@@@STEP_LOG_LINE@python.inline@ continue@@@",
"@@@STEP_LOG_LINE@python.inline@ current_frame_duration = trace['ts'] - frame_id_to_start_ts[frame_id]@@@",
"@@@STEP_LOG_LINE@python.inline@ total_frames += 1@@@",
"@@@STEP_LOG_LINE@python.inline@ completed_frame_id_and_duration_status.append(@@@",
"@@@STEP_LOG_LINE@python.inline@ (frame_id, current_frame_duration, args['termination_status']))@@@",
"@@@STEP_LOG_LINE@python.inline@ if(args['termination_status'] == 'missed_frame' or@@@",
"@@@STEP_LOG_LINE@python.inline@ args['termination_status'] == 'submitted_frame'):@@@",
"@@@STEP_LOG_LINE@python.inline@ drawn_frame_id_and_duration.append((frame_id, current_frame_duration))@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@ # We are done with this frame_id so remove it from the dict.@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_id_to_start_ts.pop(frame_id)@@@",
"@@@STEP_LOG_LINE@python.inline@ print '%d (%s with %s): %d' % (@@@",
"@@@STEP_LOG_LINE@python.inline@ total_frames, frame_id, args['termination_status'],@@@",
"@@@STEP_LOG_LINE@python.inline@ current_frame_duration)@@@",
"@@@STEP_LOG_LINE@python.inline@ elif args and (args.get('termination_status') in@@@",
"@@@STEP_LOG_LINE@python.inline@ erroneous_termination_statuses):@@@",
"@@@STEP_LOG_LINE@python.inline@ # Invalidate previously collected results for this frame_id.@@@",
"@@@STEP_LOG_LINE@python.inline@ if frame_id_to_start_ts.get(frame_id):@@@",
"@@@STEP_LOG_LINE@python.inline@ print '[Invalidating %s due to %s]' % (@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_id, args['termination_status'])@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_id_to_start_ts.pop(frame_id)@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@# Calculate metrics for total completed frames.@@@",
"@@@STEP_LOG_LINE@python.inline@total_completed_frames = len(completed_frame_id_and_duration_status)@@@",
"@@@STEP_LOG_LINE@python.inline@if total_completed_frames < 25:@@@",
"@@@STEP_LOG_LINE@python.inline@ raise Exception('Even with 3 loops found only %d frames' %@@@",
"@@@STEP_LOG_LINE@python.inline@ total_completed_frames)@@@",
"@@@STEP_LOG_LINE@python.inline@# Get frame avg/min/max for the middle 25 frames.@@@",
"@@@STEP_LOG_LINE@python.inline@start = (total_completed_frames - 25)/2@@@",
"@@@STEP_LOG_LINE@python.inline@print 'Got %d total completed frames. Using indexes [%d, %d).' % (@@@",
"@@@STEP_LOG_LINE@python.inline@ total_completed_frames, start, start+25)@@@",
"@@@STEP_LOG_LINE@python.inline@frame_max = 0@@@",
"@@@STEP_LOG_LINE@python.inline@frame_min = 0@@@",
"@@@STEP_LOG_LINE@python.inline@frame_cumulative = 0@@@",
"@@@STEP_LOG_LINE@python.inline@aborted_frames = 0@@@",
"@@@STEP_LOG_LINE@python.inline@for frame_id, duration, status in (@@@",
"@@@STEP_LOG_LINE@python.inline@ completed_frame_id_and_duration_status[start:start+25]):@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_max = max(frame_max, duration)@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_min = min(frame_min, duration) if frame_min else duration@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_cumulative += duration@@@",
"@@@STEP_LOG_LINE@python.inline@ if status == 'main_frame_aborted':@@@",
"@@@STEP_LOG_LINE@python.inline@ aborted_frames += 1@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results = {}@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['frame_max_us'] = frame_max@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['frame_min_us'] = frame_min@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['frame_avg_us'] = frame_cumulative/25@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['aborted_frames'] = aborted_frames@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@# Now calculate metrics for only drawn frames.@@@",
"@@@STEP_LOG_LINE@python.inline@drawn_frame_max = 0@@@",
"@@@STEP_LOG_LINE@python.inline@drawn_frame_min = 0@@@",
"@@@STEP_LOG_LINE@python.inline@drawn_frame_cumulative = 0@@@",
"@@@STEP_LOG_LINE@python.inline@total_drawn_frames = len(drawn_frame_id_and_duration)@@@",
"@@@STEP_LOG_LINE@python.inline@if total_drawn_frames < 25:@@@",
"@@@STEP_LOG_LINE@python.inline@ raise Exception('Even with 3 loops found only %d drawn frames' %@@@",
"@@@STEP_LOG_LINE@python.inline@ total_drawn_frames)@@@",
"@@@STEP_LOG_LINE@python.inline@# Get drawn frame avg/min/max from the middle 25 frames.@@@",
"@@@STEP_LOG_LINE@python.inline@start = (total_drawn_frames - 25)/2@@@",
"@@@STEP_LOG_LINE@python.inline@print 'Got %d total drawn frames. Using indexes [%d-%d).' % (@@@",
"@@@STEP_LOG_LINE@python.inline@ total_drawn_frames, start, start+25)@@@",
"@@@STEP_LOG_LINE@python.inline@for frame_id, duration in drawn_frame_id_and_duration[start:start+25]:@@@",
"@@@STEP_LOG_LINE@python.inline@ drawn_frame_max = max(drawn_frame_max, duration)@@@",
"@@@STEP_LOG_LINE@python.inline@ drawn_frame_min = (min(drawn_frame_min, duration)@@@",
"@@@STEP_LOG_LINE@python.inline@ if drawn_frame_min else duration)@@@",
"@@@STEP_LOG_LINE@python.inline@ drawn_frame_cumulative += duration@@@",
"@@@STEP_LOG_LINE@python.inline@# Add metrics to perf_results.@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['drawn_frame_max_us'] = drawn_frame_max@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['drawn_frame_min_us'] = drawn_frame_min@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['drawn_frame_avg_us'] = drawn_frame_cumulative/25@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@print 'Final perf_results dict: %s' % perf_results@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@# Write perf_results to the output json.@@@",
"@@@STEP_LOG_LINE@python.inline@with open(output_json_file, 'w') as f:@@@",
"@@@STEP_LOG_LINE@python.inline@ f.write(json.dumps(perf_results))@@@",
"@@@STEP_LOG_END@python.inline@@@"
]
},
{
"cmd": [
"[START_DIR]/node/node/bin/node",
"[START_DIR]/cache/work/skia/tools/lottie-web-perf/lottie-web-perf.js",
"--backend",
"svg",
"--input",
"[START_DIR]/lottie-samples/lottie3.json",
"--output",
"[CLEANUP]/g3_try_tmp_1/lottie3.json"
],
"cwd": "[START_DIR]/cache/work/skia/tools/lottie-web-perf",
"env": {
"CHROME_HEADLESS": "1",
"DISPLAY": ":0",
"PATH": "<PATH>:RECIPE_REPO[depot_tools]"
},
"infra_step": true,
"name": "Run perf cmd line app (3)"
},
{
"cmd": [
"python",
"-u",
"\nimport json\nimport sys\n\ntrace_output = sys.argv[1]\nwith open(trace_output, 'r') as f:\n trace_json = json.load(f)\noutput_json_file = sys.argv[2]\nrenderer = sys.argv[3] # Unused for now but might be useful in the future.\n\n# Output data about the GPU that was used.\nprint 'GPU data:'\nprint trace_json['metadata'].get('gpu-gl-renderer')\nprint trace_json['metadata'].get('gpu-driver')\nprint trace_json['metadata'].get('gpu-gl-vendor')\n\nerroneous_termination_statuses = [\n 'replaced_by_new_reporter_at_same_stage',\n 'did_not_produce_frame',\n]\naccepted_termination_statuses = [\n 'missed_frame',\n 'submitted_frame',\n 'main_frame_aborted'\n]\n\ncurrent_frame_duration = 0\ntotal_frames = 0\nframe_id_to_start_ts = {}\n# Will contain tuples of frame_ids and their duration and status.\ncompleted_frame_id_and_duration_status = []\n# Will contain tuples of drawn frame_ids and their duration.\ndrawn_frame_id_and_duration = []\nfor trace in trace_json['traceEvents']:\n if 'PipelineReporter' in trace['name']:\n frame_id = trace['id']\n args = trace.get('args')\n if args and args.get('step') == 'BeginImplFrameToSendBeginMainFrame':\n frame_id_to_start_ts[frame_id] = trace['ts']\n elif args and (args.get('termination_status') in\n accepted_termination_statuses):\n if not frame_id_to_start_ts.get(frame_id):\n print '[No start ts found for %s]' % frame_id\n continue\n current_frame_duration = trace['ts'] - frame_id_to_start_ts[frame_id]\n total_frames += 1\n completed_frame_id_and_duration_status.append(\n (frame_id, current_frame_duration, args['termination_status']))\n if(args['termination_status'] == 'missed_frame' or\n args['termination_status'] == 'submitted_frame'):\n drawn_frame_id_and_duration.append((frame_id, current_frame_duration))\n\n # We are done with this frame_id so remove it from the dict.\n frame_id_to_start_ts.pop(frame_id)\n print '%d (%s with %s): %d' % (\n total_frames, frame_id, args['termination_status'],\n current_frame_duration)\n elif args and (args.get('termination_status') in\n erroneous_termination_statuses):\n # Invalidate previously collected results for this frame_id.\n if frame_id_to_start_ts.get(frame_id):\n print '[Invalidating %s due to %s]' % (\n frame_id, args['termination_status'])\n frame_id_to_start_ts.pop(frame_id)\n\n# Calculate metrics for total completed frames.\ntotal_completed_frames = len(completed_frame_id_and_duration_status)\nif total_completed_frames < 25:\n raise Exception('Even with 3 loops found only %d frames' %\n total_completed_frames)\n# Get frame avg/min/max for the middle 25 frames.\nstart = (total_completed_frames - 25)/2\nprint 'Got %d total completed frames. Using indexes [%d, %d).' % (\n total_completed_frames, start, start+25)\nframe_max = 0\nframe_min = 0\nframe_cumulative = 0\naborted_frames = 0\nfor frame_id, duration, status in (\n completed_frame_id_and_duration_status[start:start+25]):\n frame_max = max(frame_max, duration)\n frame_min = min(frame_min, duration) if frame_min else duration\n frame_cumulative += duration\n if status == 'main_frame_aborted':\n aborted_frames += 1\n\nperf_results = {}\nperf_results['frame_max_us'] = frame_max\nperf_results['frame_min_us'] = frame_min\nperf_results['frame_avg_us'] = frame_cumulative/25\nperf_results['aborted_frames'] = aborted_frames\n\n# Now calculate metrics for only drawn frames.\ndrawn_frame_max = 0\ndrawn_frame_min = 0\ndrawn_frame_cumulative = 0\ntotal_drawn_frames = len(drawn_frame_id_and_duration)\nif total_drawn_frames < 25:\n raise Exception('Even with 3 loops found only %d drawn frames' %\n total_drawn_frames)\n# Get drawn frame avg/min/max from the middle 25 frames.\nstart = (total_drawn_frames - 25)/2\nprint 'Got %d total drawn frames. Using indexes [%d-%d).' % (\n total_drawn_frames, start, start+25)\nfor frame_id, duration in drawn_frame_id_and_duration[start:start+25]:\n drawn_frame_max = max(drawn_frame_max, duration)\n drawn_frame_min = (min(drawn_frame_min, duration)\n if drawn_frame_min else duration)\n drawn_frame_cumulative += duration\n# Add metrics to perf_results.\nperf_results['drawn_frame_max_us'] = drawn_frame_max\nperf_results['drawn_frame_min_us'] = drawn_frame_min\nperf_results['drawn_frame_avg_us'] = drawn_frame_cumulative/25\n\nprint 'Final perf_results dict: %s' % perf_results\n\n# Write perf_results to the output json.\nwith open(output_json_file, 'w') as f:\n f.write(json.dumps(perf_results))\n",
"[CLEANUP]/g3_try_tmp_1/lottie3.json",
"/path/to/tmp/json",
"lottie-web"
],
"env": {
"CHROME_HEADLESS": "1",
"PATH": "<PATH>:RECIPE_REPO[depot_tools]"
},
"name": "parse lottie3.json trace",
"~followup_annotations": [
"@@@STEP_LOG_LINE@json.output@{@@@",
"@@@STEP_LOG_LINE@json.output@ \"frame_avg_us\": 179.71, @@@",
"@@@STEP_LOG_LINE@json.output@ \"frame_max_us\": 218.25, @@@",
"@@@STEP_LOG_LINE@json.output@ \"frame_min_us\": 141.17@@@",
"@@@STEP_LOG_LINE@json.output@}@@@",
"@@@STEP_LOG_END@json.output@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@import json@@@",
"@@@STEP_LOG_LINE@python.inline@import sys@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@trace_output = sys.argv[1]@@@",
"@@@STEP_LOG_LINE@python.inline@with open(trace_output, 'r') as f:@@@",
"@@@STEP_LOG_LINE@python.inline@ trace_json = json.load(f)@@@",
"@@@STEP_LOG_LINE@python.inline@output_json_file = sys.argv[2]@@@",
"@@@STEP_LOG_LINE@python.inline@renderer = sys.argv[3] # Unused for now but might be useful in the future.@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@# Output data about the GPU that was used.@@@",
"@@@STEP_LOG_LINE@python.inline@print 'GPU data:'@@@",
"@@@STEP_LOG_LINE@python.inline@print trace_json['metadata'].get('gpu-gl-renderer')@@@",
"@@@STEP_LOG_LINE@python.inline@print trace_json['metadata'].get('gpu-driver')@@@",
"@@@STEP_LOG_LINE@python.inline@print trace_json['metadata'].get('gpu-gl-vendor')@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@erroneous_termination_statuses = [@@@",
"@@@STEP_LOG_LINE@python.inline@ 'replaced_by_new_reporter_at_same_stage',@@@",
"@@@STEP_LOG_LINE@python.inline@ 'did_not_produce_frame',@@@",
"@@@STEP_LOG_LINE@python.inline@]@@@",
"@@@STEP_LOG_LINE@python.inline@accepted_termination_statuses = [@@@",
"@@@STEP_LOG_LINE@python.inline@ 'missed_frame',@@@",
"@@@STEP_LOG_LINE@python.inline@ 'submitted_frame',@@@",
"@@@STEP_LOG_LINE@python.inline@ 'main_frame_aborted'@@@",
"@@@STEP_LOG_LINE@python.inline@]@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@current_frame_duration = 0@@@",
"@@@STEP_LOG_LINE@python.inline@total_frames = 0@@@",
"@@@STEP_LOG_LINE@python.inline@frame_id_to_start_ts = {}@@@",
"@@@STEP_LOG_LINE@python.inline@# Will contain tuples of frame_ids and their duration and status.@@@",
"@@@STEP_LOG_LINE@python.inline@completed_frame_id_and_duration_status = []@@@",
"@@@STEP_LOG_LINE@python.inline@# Will contain tuples of drawn frame_ids and their duration.@@@",
"@@@STEP_LOG_LINE@python.inline@drawn_frame_id_and_duration = []@@@",
"@@@STEP_LOG_LINE@python.inline@for trace in trace_json['traceEvents']:@@@",
"@@@STEP_LOG_LINE@python.inline@ if 'PipelineReporter' in trace['name']:@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_id = trace['id']@@@",
"@@@STEP_LOG_LINE@python.inline@ args = trace.get('args')@@@",
"@@@STEP_LOG_LINE@python.inline@ if args and args.get('step') == 'BeginImplFrameToSendBeginMainFrame':@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_id_to_start_ts[frame_id] = trace['ts']@@@",
"@@@STEP_LOG_LINE@python.inline@ elif args and (args.get('termination_status') in@@@",
"@@@STEP_LOG_LINE@python.inline@ accepted_termination_statuses):@@@",
"@@@STEP_LOG_LINE@python.inline@ if not frame_id_to_start_ts.get(frame_id):@@@",
"@@@STEP_LOG_LINE@python.inline@ print '[No start ts found for %s]' % frame_id@@@",
"@@@STEP_LOG_LINE@python.inline@ continue@@@",
"@@@STEP_LOG_LINE@python.inline@ current_frame_duration = trace['ts'] - frame_id_to_start_ts[frame_id]@@@",
"@@@STEP_LOG_LINE@python.inline@ total_frames += 1@@@",
"@@@STEP_LOG_LINE@python.inline@ completed_frame_id_and_duration_status.append(@@@",
"@@@STEP_LOG_LINE@python.inline@ (frame_id, current_frame_duration, args['termination_status']))@@@",
"@@@STEP_LOG_LINE@python.inline@ if(args['termination_status'] == 'missed_frame' or@@@",
"@@@STEP_LOG_LINE@python.inline@ args['termination_status'] == 'submitted_frame'):@@@",
"@@@STEP_LOG_LINE@python.inline@ drawn_frame_id_and_duration.append((frame_id, current_frame_duration))@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@ # We are done with this frame_id so remove it from the dict.@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_id_to_start_ts.pop(frame_id)@@@",
"@@@STEP_LOG_LINE@python.inline@ print '%d (%s with %s): %d' % (@@@",
"@@@STEP_LOG_LINE@python.inline@ total_frames, frame_id, args['termination_status'],@@@",
"@@@STEP_LOG_LINE@python.inline@ current_frame_duration)@@@",
"@@@STEP_LOG_LINE@python.inline@ elif args and (args.get('termination_status') in@@@",
"@@@STEP_LOG_LINE@python.inline@ erroneous_termination_statuses):@@@",
"@@@STEP_LOG_LINE@python.inline@ # Invalidate previously collected results for this frame_id.@@@",
"@@@STEP_LOG_LINE@python.inline@ if frame_id_to_start_ts.get(frame_id):@@@",
"@@@STEP_LOG_LINE@python.inline@ print '[Invalidating %s due to %s]' % (@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_id, args['termination_status'])@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_id_to_start_ts.pop(frame_id)@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@# Calculate metrics for total completed frames.@@@",
"@@@STEP_LOG_LINE@python.inline@total_completed_frames = len(completed_frame_id_and_duration_status)@@@",
"@@@STEP_LOG_LINE@python.inline@if total_completed_frames < 25:@@@",
"@@@STEP_LOG_LINE@python.inline@ raise Exception('Even with 3 loops found only %d frames' %@@@",
"@@@STEP_LOG_LINE@python.inline@ total_completed_frames)@@@",
"@@@STEP_LOG_LINE@python.inline@# Get frame avg/min/max for the middle 25 frames.@@@",
"@@@STEP_LOG_LINE@python.inline@start = (total_completed_frames - 25)/2@@@",
"@@@STEP_LOG_LINE@python.inline@print 'Got %d total completed frames. Using indexes [%d, %d).' % (@@@",
"@@@STEP_LOG_LINE@python.inline@ total_completed_frames, start, start+25)@@@",
"@@@STEP_LOG_LINE@python.inline@frame_max = 0@@@",
"@@@STEP_LOG_LINE@python.inline@frame_min = 0@@@",
"@@@STEP_LOG_LINE@python.inline@frame_cumulative = 0@@@",
"@@@STEP_LOG_LINE@python.inline@aborted_frames = 0@@@",
"@@@STEP_LOG_LINE@python.inline@for frame_id, duration, status in (@@@",
"@@@STEP_LOG_LINE@python.inline@ completed_frame_id_and_duration_status[start:start+25]):@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_max = max(frame_max, duration)@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_min = min(frame_min, duration) if frame_min else duration@@@",
"@@@STEP_LOG_LINE@python.inline@ frame_cumulative += duration@@@",
"@@@STEP_LOG_LINE@python.inline@ if status == 'main_frame_aborted':@@@",
"@@@STEP_LOG_LINE@python.inline@ aborted_frames += 1@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results = {}@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['frame_max_us'] = frame_max@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['frame_min_us'] = frame_min@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['frame_avg_us'] = frame_cumulative/25@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['aborted_frames'] = aborted_frames@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@# Now calculate metrics for only drawn frames.@@@",
"@@@STEP_LOG_LINE@python.inline@drawn_frame_max = 0@@@",
"@@@STEP_LOG_LINE@python.inline@drawn_frame_min = 0@@@",
"@@@STEP_LOG_LINE@python.inline@drawn_frame_cumulative = 0@@@",
"@@@STEP_LOG_LINE@python.inline@total_drawn_frames = len(drawn_frame_id_and_duration)@@@",
"@@@STEP_LOG_LINE@python.inline@if total_drawn_frames < 25:@@@",
"@@@STEP_LOG_LINE@python.inline@ raise Exception('Even with 3 loops found only %d drawn frames' %@@@",
"@@@STEP_LOG_LINE@python.inline@ total_drawn_frames)@@@",
"@@@STEP_LOG_LINE@python.inline@# Get drawn frame avg/min/max from the middle 25 frames.@@@",
"@@@STEP_LOG_LINE@python.inline@start = (total_drawn_frames - 25)/2@@@",
"@@@STEP_LOG_LINE@python.inline@print 'Got %d total drawn frames. Using indexes [%d-%d).' % (@@@",
"@@@STEP_LOG_LINE@python.inline@ total_drawn_frames, start, start+25)@@@",
"@@@STEP_LOG_LINE@python.inline@for frame_id, duration in drawn_frame_id_and_duration[start:start+25]:@@@",
"@@@STEP_LOG_LINE@python.inline@ drawn_frame_max = max(drawn_frame_max, duration)@@@",
"@@@STEP_LOG_LINE@python.inline@ drawn_frame_min = (min(drawn_frame_min, duration)@@@",
"@@@STEP_LOG_LINE@python.inline@ if drawn_frame_min else duration)@@@",
"@@@STEP_LOG_LINE@python.inline@ drawn_frame_cumulative += duration@@@",
"@@@STEP_LOG_LINE@python.inline@# Add metrics to perf_results.@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['drawn_frame_max_us'] = drawn_frame_max@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['drawn_frame_min_us'] = drawn_frame_min@@@",
"@@@STEP_LOG_LINE@python.inline@perf_results['drawn_frame_avg_us'] = drawn_frame_cumulative/25@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@print 'Final perf_results dict: %s' % perf_results@@@",
"@@@STEP_LOG_LINE@python.inline@@@@",
"@@@STEP_LOG_LINE@python.inline@# Write perf_results to the output json.@@@",
"@@@STEP_LOG_LINE@python.inline@with open(output_json_file, 'w') as f:@@@",
"@@@STEP_LOG_LINE@python.inline@ f.write(json.dumps(perf_results))@@@",
"@@@STEP_LOG_END@python.inline@@@"
]
},
{
"cmd": [
"python",
"-u",
"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
"--json-output",
"/path/to/tmp/json",
"rmtree",
"[CLEANUP]/g3_try_tmp_1"
],
"infra_step": true,
"name": "rmtree [CLEANUP]/g3_try_tmp_1"
},
{
"cmd": [
"python",
"-u",
"import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n"
],
"name": "get swarming bot id",
"~followup_annotations": [
"@@@STEP_LOG_LINE@python.inline@import os@@@",
"@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@",
"@@@STEP_LOG_END@python.inline@@@"
]
},
{
"cmd": [
"python",
"-u",
"import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n"
],
"name": "get swarming task id",
"~followup_annotations": [
"@@@STEP_LOG_LINE@python.inline@import os@@@",
"@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@",
"@@@STEP_LOG_END@python.inline@@@"
]
},
{
"cmd": [
"python",
"-u",
"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
"--json-output",
"/path/to/tmp/json",
"ensure-directory",
"--mode",
"0777",
"[START_DIR]/[SWARM_OUT_DIR]"
],
"infra_step": true,
"name": "makedirs perf_dir"
},
{
"cmd": [
"python",
"-u",
"import json\nwith open('[START_DIR]/[SWARM_OUT_DIR]/perf_abc123_1337000001.json', 'w') as outfile:\n json.dump(obj={'gitHash': 'abc123', 'results': {'lottie3.json': {'gl': {'frame_avg_us': 179.71, 'frame_max_us': 218.25, 'frame_min_us': 141.17}}, 'lottie1.json': {'gl': {'frame_avg_us': 179.71, 'frame_max_us': 218.25, 'frame_min_us': 141.17}}, 'lottie2.json': {'gl': {'frame_avg_us': 179.71, 'frame_max_us': 218.25, 'frame_min_us': 141.17}}}, 'swarming_task_id': '', 'renderer': 'lottie-web', 'key': {'extra_config': 'LottieWeb', 'bench_type': 'tracing', 'cpu_or_gpu_value': 'AVX2', 'arch': 'x86_64', 'source_type': 'lottie-web', 'cpu_or_gpu': 'CPU', 'model': 'GCE', 'configuration': 'Release', 'os': 'Debian9', 'compiler': 'none'}, 'swarming_bot_id': ''}, fp=outfile, indent=4)\n"
],
"env": {
"CHROME_HEADLESS": "1",
"PATH": "<PATH>:RECIPE_REPO[depot_tools]"
},
"name": "write output JSON",
"~followup_annotations": [
"@@@STEP_LOG_LINE@python.inline@import json@@@",
"@@@STEP_LOG_LINE@python.inline@with open('[START_DIR]/[SWARM_OUT_DIR]/perf_abc123_1337000001.json', 'w') as outfile:@@@",
"@@@STEP_LOG_LINE@python.inline@ json.dump(obj={'gitHash': 'abc123', 'results': {'lottie3.json': {'gl': {'frame_avg_us': 179.71, 'frame_max_us': 218.25, 'frame_min_us': 141.17}}, 'lottie1.json': {'gl': {'frame_avg_us': 179.71, 'frame_max_us': 218.25, 'frame_min_us': 141.17}}, 'lottie2.json': {'gl': {'frame_avg_us': 179.71, 'frame_max_us': 218.25, 'frame_min_us': 141.17}}}, 'swarming_task_id': '', 'renderer': 'lottie-web', 'key': {'extra_config': 'LottieWeb', 'bench_type': 'tracing', 'cpu_or_gpu_value': 'AVX2', 'arch': 'x86_64', 'source_type': 'lottie-web', 'cpu_or_gpu': 'CPU', 'model': 'GCE', 'configuration': 'Release', 'os': 'Debian9', 'compiler': 'none'}, 'swarming_bot_id': ''}, fp=outfile, indent=4)@@@",
"@@@STEP_LOG_END@python.inline@@@"
]
},
{
"name": "$result"
}
]