You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

201 lines
4.7 KiB

#!/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