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.
200 lines
4.7 KiB
200 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
|
|
|