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.
virglrenderer/perf-testing/run-trace-in-container.sh

201 lines
4.7 KiB

perf: add scripts to build docker image and run perfetto trace analysis Most of the work of this MR was done by Tomeu. Changes: - update the Dockerfile to use the new virglrenderer tracing option - use command line parsing to pass the parameters when running a trace - move some files and rename scripts v2: - unify gfx-pps build (Tomeu) and use to suggested branch (Fahien) - use upstream tagged version for igt-gpu-tools (Tomeu) - add parameters to set benchmark loop count (Louis-Francis) - add parameter to set perfetto loop count or loopless run v3: - compile virglrenderer against minigbm (Rohan) - compile minigbm with driver i915 (Rohan) v4: Don't build mesa-gbm (instead of deleting the library and header later) v5: add option to run script whether to wait after each frame v6: correct gfx-pps version and add gdb v7: fix tag for gfx-pps v8: - when building the container use the user ID and group id of the user who runs the container build - rework passing command line parameters - add a command line parameter to record per-frame images - Use debugoptimized build for gfx-pps (Tomeu) v9: disable buffer storage, there seems to be a bug in context handling triggered by this v10: move to upstream kernel 5.9.12 v11: - remove writing txt version of host trace - add debug flagto enable tracing EGL - don't force-remove libgbm1 it is no longer a problem to have it v12: update kernel to 5.20.5 v13: refactor trace merge (Rohan) v14: - Fix refactoring (Rohan) - Add license infro to perfetto merge script Signed-off-by: Gert Wollny <gert.wollny@collabora.com> Reviewed-By: Rohan Garg <rohan.garg@collabora.com>
4 years ago
#!/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