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