1*bbecb9d1SAndroid Build Coastguard Worker#!/bin/bash 2*bbecb9d1SAndroid Build Coastguard Worker# Copyright 2019 The Chromium OS Authors. All rights reserved. 3*bbecb9d1SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 4*bbecb9d1SAndroid Build Coastguard Worker# found in the LICENSE file. 5*bbecb9d1SAndroid Build Coastguard Worker 6*bbecb9d1SAndroid Build Coastguard Worker# This script is to be run on the KVM host, outside the container 7*bbecb9d1SAndroid Build Coastguard Worker 8*bbecb9d1SAndroid Build Coastguard Worker 9*bbecb9d1SAndroid Build Coastguard Worker#set -ex 10*bbecb9d1SAndroid Build Coastguard Worker 11*bbecb9d1SAndroid Build Coastguard Worker# grab the pwd before changing it to this script's directory 12*bbecb9d1SAndroid Build Coastguard Workerpwd="${PWD}" 13*bbecb9d1SAndroid Build Coastguard Workerroot_dir="$(pwd)" 14*bbecb9d1SAndroid Build Coastguard Worker 15*bbecb9d1SAndroid Build Coastguard Workercd "${0%/*}" 16*bbecb9d1SAndroid Build Coastguard Worker 17*bbecb9d1SAndroid Build Coastguard Workermesa_src="" 18*bbecb9d1SAndroid Build Coastguard Workervirgl_src="" 19*bbecb9d1SAndroid Build Coastguard Workertraces_db="" 20*bbecb9d1SAndroid Build Coastguard Workerkernel_src="" 21*bbecb9d1SAndroid Build Coastguard Workerbenchmark_loops=0 22*bbecb9d1SAndroid Build Coastguard Workerperfetto_loops=10 23*bbecb9d1SAndroid Build Coastguard Workerwait_after_frame= 24*bbecb9d1SAndroid Build Coastguard Worker 25*bbecb9d1SAndroid Build Coastguard Workerprint_help() { 26*bbecb9d1SAndroid Build Coastguard Worker echo "Run GL trace with perfetto" 27*bbecb9d1SAndroid Build Coastguard Worker echo "Usage mesa_wrapper.sh [options]" 28*bbecb9d1SAndroid Build Coastguard Worker echo "" 29*bbecb9d1SAndroid Build Coastguard Worker echo " --root, -r Path to a root directory that contains the sources for mesa, virglrenderer, and the trace-db" 30*bbecb9d1SAndroid Build Coastguard Worker echo " --mesa, -m Path to Mesa source code (overrides path generated from root)" 31*bbecb9d1SAndroid Build Coastguard Worker echo " --virgl, -v Path to virglrenderer source code (overrides path generated from root)" 32*bbecb9d1SAndroid Build Coastguard Worker echo " --kernel, -k Path to Linux kernel source code" 33*bbecb9d1SAndroid Build Coastguard Worker echo " --traces-db, -d Path to the directory containing the traces (overrides path generated from root)" 34*bbecb9d1SAndroid Build Coastguard Worker echo " --trace, -t Trace to be run (path relative to traces-db) (required)" 35*bbecb9d1SAndroid Build Coastguard Worker echo " --benchmark, -b Number of times the last frame should be run for benchmarking (default 0=disabled)" 36*bbecb9d1SAndroid Build Coastguard Worker echo " --perfetto, -p Number of times the last frame should be loop for perfetto (default 10; 0=run trace normally)" 37*bbecb9d1SAndroid Build Coastguard Worker echo " --snapshot, -s Make per-frame snapshots" 38*bbecb9d1SAndroid Build Coastguard Worker echo " --debug Enable extra logging" 39*bbecb9d1SAndroid Build Coastguard Worker echo "" 40*bbecb9d1SAndroid Build Coastguard Worker echo " --help, -h Print this help" 41*bbecb9d1SAndroid Build Coastguard Worker} 42*bbecb9d1SAndroid Build Coastguard Worker 43*bbecb9d1SAndroid Build Coastguard Workercommand="" 44*bbecb9d1SAndroid Build Coastguard Worker 45*bbecb9d1SAndroid Build Coastguard Workerwhile [ -n "$1" ] ; do 46*bbecb9d1SAndroid Build Coastguard Worker case "$1" in 47*bbecb9d1SAndroid Build Coastguard Worker 48*bbecb9d1SAndroid Build Coastguard Worker --root|-r) 49*bbecb9d1SAndroid Build Coastguard Worker root_dir="$2" 50*bbecb9d1SAndroid Build Coastguard Worker shift 51*bbecb9d1SAndroid Build Coastguard Worker ;; 52*bbecb9d1SAndroid Build Coastguard Worker 53*bbecb9d1SAndroid Build Coastguard Worker --mesa|-m) 54*bbecb9d1SAndroid Build Coastguard Worker mesa_src="$2" 55*bbecb9d1SAndroid Build Coastguard Worker shift 56*bbecb9d1SAndroid Build Coastguard Worker ;; 57*bbecb9d1SAndroid Build Coastguard Worker 58*bbecb9d1SAndroid Build Coastguard Worker --virgl|-v) 59*bbecb9d1SAndroid Build Coastguard Worker virgl_src="$2" 60*bbecb9d1SAndroid Build Coastguard Worker shift 61*bbecb9d1SAndroid Build Coastguard Worker ;; 62*bbecb9d1SAndroid Build Coastguard Worker 63*bbecb9d1SAndroid Build Coastguard Worker --traces-db|-d) 64*bbecb9d1SAndroid Build Coastguard Worker traces_db="$2" 65*bbecb9d1SAndroid Build Coastguard Worker shift 66*bbecb9d1SAndroid Build Coastguard Worker ;; 67*bbecb9d1SAndroid Build Coastguard Worker 68*bbecb9d1SAndroid Build Coastguard Worker --kernel|-k) 69*bbecb9d1SAndroid Build Coastguard Worker kernel_src="$2" 70*bbecb9d1SAndroid Build Coastguard Worker shift 71*bbecb9d1SAndroid Build Coastguard Worker ;; 72*bbecb9d1SAndroid Build Coastguard Worker 73*bbecb9d1SAndroid Build Coastguard Worker --help|-h) 74*bbecb9d1SAndroid Build Coastguard Worker print_help 75*bbecb9d1SAndroid Build Coastguard Worker exit 76*bbecb9d1SAndroid Build Coastguard Worker ;; 77*bbecb9d1SAndroid Build Coastguard Worker 78*bbecb9d1SAndroid Build Coastguard Worker --trace|-t) 79*bbecb9d1SAndroid Build Coastguard Worker trace="$2" 80*bbecb9d1SAndroid Build Coastguard Worker shift 81*bbecb9d1SAndroid Build Coastguard Worker ;; 82*bbecb9d1SAndroid Build Coastguard Worker 83*bbecb9d1SAndroid Build Coastguard Worker --benchmark|-b) 84*bbecb9d1SAndroid Build Coastguard Worker command="$command -b $2" 85*bbecb9d1SAndroid Build Coastguard Worker shift 86*bbecb9d1SAndroid Build Coastguard Worker ;; 87*bbecb9d1SAndroid Build Coastguard Worker 88*bbecb9d1SAndroid Build Coastguard Worker --perfetto|-p) 89*bbecb9d1SAndroid Build Coastguard Worker command="$command -p $2" 90*bbecb9d1SAndroid Build Coastguard Worker shift 91*bbecb9d1SAndroid Build Coastguard Worker ;; 92*bbecb9d1SAndroid Build Coastguard Worker 93*bbecb9d1SAndroid Build Coastguard Worker --wait-after-frame|-w) 94*bbecb9d1SAndroid Build Coastguard Worker command="$command -w" 95*bbecb9d1SAndroid Build Coastguard Worker ;; 96*bbecb9d1SAndroid Build Coastguard Worker 97*bbecb9d1SAndroid Build Coastguard Worker --snapshot|-s) 98*bbecb9d1SAndroid Build Coastguard Worker command="$command -s" 99*bbecb9d1SAndroid Build Coastguard Worker ;; 100*bbecb9d1SAndroid Build Coastguard Worker 101*bbecb9d1SAndroid Build Coastguard Worker --debug) 102*bbecb9d1SAndroid Build Coastguard Worker command="$command --debug" 103*bbecb9d1SAndroid Build Coastguard Worker ;; 104*bbecb9d1SAndroid Build Coastguard Worker *) 105*bbecb9d1SAndroid Build Coastguard Worker echo "Unknown option '$1' given, run with option --help to see supported options" 106*bbecb9d1SAndroid Build Coastguard Worker exit 107*bbecb9d1SAndroid Build Coastguard Worker ;; 108*bbecb9d1SAndroid Build Coastguard Worker esac 109*bbecb9d1SAndroid Build Coastguard Worker shift 110*bbecb9d1SAndroid Build Coastguard Workerdone 111*bbecb9d1SAndroid Build Coastguard Worker 112*bbecb9d1SAndroid Build Coastguard Workerif [ "x$mesa_src" = "x" ] ; then 113*bbecb9d1SAndroid Build Coastguard Worker mesa_src="$root_dir/mesa" 114*bbecb9d1SAndroid Build Coastguard Workerfi 115*bbecb9d1SAndroid Build Coastguard Worker 116*bbecb9d1SAndroid Build Coastguard Workerif [ "x$virgl_src" = "x" ] ; then 117*bbecb9d1SAndroid Build Coastguard Worker virgl_src="$root_dir/virglrenderer" 118*bbecb9d1SAndroid Build Coastguard Workerfi 119*bbecb9d1SAndroid Build Coastguard Worker 120*bbecb9d1SAndroid Build Coastguard Workerif [ "x$traces_db" = "x" ] ; then 121*bbecb9d1SAndroid Build Coastguard Worker traces_db="$root_dir/traces-db" 122*bbecb9d1SAndroid Build Coastguard Workerfi 123*bbecb9d1SAndroid Build Coastguard Worker 124*bbecb9d1SAndroid Build Coastguard Workercan_run=1 125*bbecb9d1SAndroid Build Coastguard Worker 126*bbecb9d1SAndroid Build Coastguard Workerif [ "x$trace" = "x" ]; then 127*bbecb9d1SAndroid Build Coastguard Worker echo "No trace given" >&2; 128*bbecb9d1SAndroid Build Coastguard Worker can_run=0 129*bbecb9d1SAndroid Build Coastguard Workerfi 130*bbecb9d1SAndroid Build Coastguard Worker 131*bbecb9d1SAndroid Build Coastguard Workerif [ "x$mesa_src" = "x" ]; then 132*bbecb9d1SAndroid Build Coastguard Worker echo "no mesa src dir given" >&2; 133*bbecb9d1SAndroid Build Coastguard Worker can_run=0 134*bbecb9d1SAndroid Build Coastguard Workerfi 135*bbecb9d1SAndroid Build Coastguard Worker 136*bbecb9d1SAndroid Build Coastguard Workerif [ ! -d "$mesa_src/src/mesa" ]; then 137*bbecb9d1SAndroid Build Coastguard Worker echo "mesa src dir '$mesa_src' is not a mesa source tree" >&2; 138*bbecb9d1SAndroid Build Coastguard Worker can_run=0 139*bbecb9d1SAndroid Build Coastguard Workerfi 140*bbecb9d1SAndroid Build Coastguard Worker 141*bbecb9d1SAndroid Build Coastguard Workerif [ "x$virgl_src" = "x" ]; then 142*bbecb9d1SAndroid Build Coastguard Worker echo "no virglrenderer src dir given" >&2; 143*bbecb9d1SAndroid Build Coastguard Worker can_run=0 144*bbecb9d1SAndroid Build Coastguard Workerfi 145*bbecb9d1SAndroid Build Coastguard Worker 146*bbecb9d1SAndroid Build Coastguard Workerif [ ! -d "$virgl_src/vtest" ]; then 147*bbecb9d1SAndroid Build Coastguard Worker echo "virglrenderer src dir '$virgl_src' is not a virglrenderer source tree" >&2; 148*bbecb9d1SAndroid Build Coastguard Worker can_run=0 149*bbecb9d1SAndroid Build Coastguard Workerfi 150*bbecb9d1SAndroid Build Coastguard Worker 151*bbecb9d1SAndroid Build Coastguard Workerif [ "x$traces_db" = "x" ]; then 152*bbecb9d1SAndroid Build Coastguard Worker echo "no traces_db dir given" >&2; 153*bbecb9d1SAndroid Build Coastguard Worker can_run=0 154*bbecb9d1SAndroid Build Coastguard Workerfi 155*bbecb9d1SAndroid Build Coastguard Worker 156*bbecb9d1SAndroid Build Coastguard Workerif [ ! -f "$traces_db/$trace" ]; then 157*bbecb9d1SAndroid Build Coastguard Worker echo "Given trace file '$trace' doesn't exist in traces db dir '$traces_db'" >&2; 158*bbecb9d1SAndroid Build Coastguard Worker # check whether the trace has been given with a path relative to the root dir 159*bbecb9d1SAndroid Build Coastguard Worker # that can be removed 160*bbecb9d1SAndroid Build Coastguard Worker trace=${trace#*/} 161*bbecb9d1SAndroid Build Coastguard Worker echo "Trying $traces_db/$trace" >&2; 162*bbecb9d1SAndroid Build Coastguard Worker if [ ! -f "$traces_db/$trace" ]; then 163*bbecb9d1SAndroid Build Coastguard Worker echo "Given trace file '$trace' not found " >&2; 164*bbecb9d1SAndroid Build Coastguard Worker can_run=0 165*bbecb9d1SAndroid Build Coastguard Worker fi 166*bbecb9d1SAndroid Build Coastguard Workerfi 167*bbecb9d1SAndroid Build Coastguard Worker 168*bbecb9d1SAndroid Build Coastguard Workerif [ "x$can_run" = "x0" ]; then 169*bbecb9d1SAndroid Build Coastguard Worker echo "Missing or command line options with errors were given" >&2; 170*bbecb9d1SAndroid Build Coastguard Worker exit 1 171*bbecb9d1SAndroid Build Coastguard Workerfi 172*bbecb9d1SAndroid Build Coastguard Worker 173*bbecb9d1SAndroid Build Coastguard Workerre='^[0-9]+$' 174*bbecb9d1SAndroid Build Coastguard Workerif ! [[ 1$benchmark_loops =~ $re ]] ; then 175*bbecb9d1SAndroid Build Coastguard Worker echo "error: benchmark_loops '" $benchmark_loops "'is not a number" >&2; 176*bbecb9d1SAndroid Build Coastguard Worker exit 1 177*bbecb9d1SAndroid Build Coastguard Workerfi 178*bbecb9d1SAndroid Build Coastguard Worker 179*bbecb9d1SAndroid Build Coastguard Workerif ! [[ 1$perfetto_loops =~ $re ]] ; then 180*bbecb9d1SAndroid Build Coastguard Worker echo "error: perfetto_loops '" $perfetto_loops "' is not a number" >&2; 181*bbecb9d1SAndroid Build Coastguard Worker exit 1 182*bbecb9d1SAndroid Build Coastguard Workerfi 183*bbecb9d1SAndroid Build Coastguard Worker 184*bbecb9d1SAndroid Build Coastguard Workerecho "command=$command" 185*bbecb9d1SAndroid Build Coastguard Worker 186*bbecb9d1SAndroid Build Coastguard Workerdocker run -it --rm \ 187*bbecb9d1SAndroid Build Coastguard Worker --privileged \ 188*bbecb9d1SAndroid Build Coastguard Worker --ipc=host \ 189*bbecb9d1SAndroid Build Coastguard Worker -v /dev/log:/dev/log \ 190*bbecb9d1SAndroid Build Coastguard Worker -v /dev/vhost-net:/dev/vhost-net \ 191*bbecb9d1SAndroid Build Coastguard Worker -v /sys/kernel/debug:/sys/kernel/debug \ 192*bbecb9d1SAndroid Build Coastguard Worker -v "$mesa_src":/mesa \ 193*bbecb9d1SAndroid Build Coastguard Worker -v "$virgl_src":/virglrenderer \ 194*bbecb9d1SAndroid Build Coastguard Worker -v "$traces_db":/traces-db \ 195*bbecb9d1SAndroid Build Coastguard Worker -v "$kernel_src":/kernel \ 196*bbecb9d1SAndroid Build Coastguard Worker --volume "$pwd":/wd \ 197*bbecb9d1SAndroid Build Coastguard Worker --workdir /wd \ 198*bbecb9d1SAndroid Build Coastguard Worker mesa \ 199*bbecb9d1SAndroid Build Coastguard Worker -t "$trace" \ 200*bbecb9d1SAndroid Build Coastguard Worker $command 201