diff options
Diffstat (limited to 'perf-testing/run-trace-in-container.sh')
-rwxr-xr-x | perf-testing/run-trace-in-container.sh | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/perf-testing/run-trace-in-container.sh b/perf-testing/run-trace-in-container.sh new file mode 100755 index 00000000..657a0bd2 --- /dev/null +++ b/perf-testing/run-trace-in-container.sh @@ -0,0 +1,200 @@ +#!/bin/bash +# Copyright 2019 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# This script is to be run on the KVM host, outside the container + + +#set -ex + +# grab the pwd before changing it to this script's directory +pwd="${PWD}" +root_dir="$(pwd)" + +cd "${0%/*}" + +mesa_src="" +virgl_src="" +traces_db="" +kernel_src="" +benchmark_loops=0 +perfetto_loops=10 +wait_after_frame= + +print_help() { + echo "Run GL trace with perfetto" + echo "Usage mesa_wrapper.sh [options]" + echo "" + echo " --root, -r Path to a root directory that contains the sources for mesa, virglrenderer, and the trace-db" + echo " --mesa, -m Path to Mesa source code (overrides path generated from root)" + echo " --virgl, -v Path to virglrenderer source code (overrides path generated from root)" + echo " --kernel, -k Path to Linux kernel source code" + echo " --traces-db, -d Path to the directory containing the traces (overrides path generated from root)" + echo " --trace, -t Trace to be run (path relative to traces-db) (required)" + echo " --benchmark, -b Number of times the last frame should be run for benchmarking (default 0=disabled)" + echo " --perfetto, -p Number of times the last frame should be loop for perfetto (default 10; 0=run trace normally)" + echo " --snapshot, -s Make per-frame snapshots" + echo " --debug Enable extra logging" + echo "" + echo " --help, -h Print this help" +} + +command="" + +while [ -n "$1" ] ; do + case "$1" in + + --root|-r) + root_dir="$2" + shift + ;; + + --mesa|-m) + mesa_src="$2" + shift + ;; + + --virgl|-v) + virgl_src="$2" + shift + ;; + + --traces-db|-d) + traces_db="$2" + shift + ;; + + --kernel|-k) + kernel_src="$2" + shift + ;; + + --help|-h) + print_help + exit + ;; + + --trace|-t) + trace="$2" + shift + ;; + + --benchmark|-b) + command="$command -b $2" + shift + ;; + + --perfetto|-p) + command="$command -p $2" + shift + ;; + + --wait-after-frame|-w) + command="$command -w" + ;; + + --snapshot|-s) + command="$command -s" + ;; + + --debug) + command="$command --debug" + ;; + *) + echo "Unknown option '$1' given, run with option --help to see supported options" + exit + ;; + esac + shift +done + +if [ "x$mesa_src" = "x" ] ; then + mesa_src="$root_dir/mesa" +fi + +if [ "x$virgl_src" = "x" ] ; then + virgl_src="$root_dir/virglrenderer" +fi + +if [ "x$traces_db" = "x" ] ; then + traces_db="$root_dir/traces-db" +fi + +can_run=1 + +if [ "x$trace" = "x" ]; then + echo "No trace given" >&2; + can_run=0 +fi + +if [ "x$mesa_src" = "x" ]; then + echo "no mesa src dir given" >&2; + can_run=0 +fi + +if [ ! -d "$mesa_src/src/mesa" ]; then + echo "mesa src dir '$mesa_src' is not a mesa source tree" >&2; + can_run=0 +fi + +if [ "x$virgl_src" = "x" ]; then + echo "no virglrenderer src dir given" >&2; + can_run=0 +fi + +if [ ! -d "$virgl_src/vtest" ]; then + echo "virglrenderer src dir '$virgl_src' is not a virglrenderer source tree" >&2; + can_run=0 +fi + +if [ "x$traces_db" = "x" ]; then + echo "no traces_db dir given" >&2; + can_run=0 +fi + +if [ ! -f "$traces_db/$trace" ]; then + echo "Given trace file '$trace' doesn't exist in traces db dir '$traces_db'" >&2; + # check whether the trace has been given with a path relative to the root dir + # that can be removed + trace=${trace#*/} + echo "Trying $traces_db/$trace" >&2; + if [ ! -f "$traces_db/$trace" ]; then + echo "Given trace file '$trace' not found " >&2; + can_run=0 + fi +fi + +if [ "x$can_run" = "x0" ]; then + echo "Missing or command line options with errors were given" >&2; + exit 1 +fi + +re='^[0-9]+$' +if ! [[ 1$benchmark_loops =~ $re ]] ; then + echo "error: benchmark_loops '" $benchmark_loops "'is not a number" >&2; + exit 1 +fi + +if ! [[ 1$perfetto_loops =~ $re ]] ; then + echo "error: perfetto_loops '" $perfetto_loops "' is not a number" >&2; + exit 1 +fi + +echo "command=$command" + +docker run -it --rm \ + --privileged \ + --ipc=host \ + -v /dev/log:/dev/log \ + -v /dev/vhost-net:/dev/vhost-net \ + -v /sys/kernel/debug:/sys/kernel/debug \ + -v "$mesa_src":/mesa \ + -v "$virgl_src":/virglrenderer \ + -v "$traces_db":/traces-db \ + -v "$kernel_src":/kernel \ + --volume "$pwd":/wd \ + --workdir /wd \ + mesa \ + -t "$trace" \ + $command |