diff options
Diffstat (limited to 'perf-testing/Docker/run_traces.sh')
-rw-r--r-- | perf-testing/Docker/run_traces.sh | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/perf-testing/Docker/run_traces.sh b/perf-testing/Docker/run_traces.sh new file mode 100644 index 00000000..653565fd --- /dev/null +++ b/perf-testing/Docker/run_traces.sh @@ -0,0 +1,119 @@ +# This script is to be run on the KVM guest + +set -ex + +mkdir /waffle +mount -t virtiofs waffle-tag /waffle + +mkdir /apitrace +mount -t virtiofs apitrace-tag /apitrace + +mkdir /traces-db +mount -t virtiofs traces-db-tag /traces-db + +mkdir /perfetto +mount -t virtiofs perfetto-tag /perfetto + +echo 3 > /proc/sys/kernel/printk + +export PATH="/apitrace/build:$PATH" +export PATH="/waffle/build/bin:$PATH" +export LD_LIBRARY_PATH="/waffle/build/lib:$LD_LIBRARY_PATH" +export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH" +export EGL_PLATFORM="surfaceless" +export WAFFLE_PLATFORM="surfaceless_egl" +export MESA_GL_VERSION_OVERRIDE="4.5" +export DISPLAY= + +# Comment out any other sources, so it only syncs to the host via PTP +sed -i '/pool/s/^/#/' /etc/chrony/chrony.conf +echo refclock PHC /dev/ptp0 poll 1 dpoll -2 offset 0 >> /etc/chrony/chrony.conf +echo cmdport 0 >> /etc/chrony/chrony.conf +echo bindcmdaddress / >> /etc/chrony/chrony.conf + +mkdir -p /run/chrony +time chronyd -q # Initial synchronization, will take some time +chronyd # Keep clocks in sync + +# Get trace cached +trace_no_ext=$(cat /traces-db/current_trace) +if [ "x$trace_no_ext" = "x" ]; then + echo "No trace given, bailing out" + exit 1 +fi + +command=$(cat /traces-db/command) +echo command=$command + +WAIT= +RECORD= +benchmark_loops=0 +perfetto_loops=10 + +for c in $command; do + + val=(${c//=/ }) + case "${val[0]}" in + benchmark) + benchmark_loops=${val[1]} + ;; + + perfetto) + perfetto_loops=${val[1]} + ;; + + wait-after-frame) + WAIT="--wait-after-frame" + ;; + + record-frame) + RECORD="--snapshot" + ;; + + esac +done + +if [ -e /traces-db/wait_after_frame ]; then + WAIT=-wait-after-frame +fi + +trace="/traces-db/${trace_no_ext}.trace" +datadir="/traces-db/${trace_no_ext}-out" +trace_base=$(basename ${trace_no_ext}) +guest_perf="$datadir/${trace_base}-guest.perfetto" + +cat "$trace" > /dev/null + +# To keep Perfetto happy +echo 0 > /sys/kernel/debug/tracing/tracing_on +echo nop > /sys/kernel/debug/tracing/current_tracer + +echo "Guest:" +wflinfo --platform surfaceless_egl --api gles2 -v + +if [ "x$perfetto_loops" != "x" -a "x$perfetto_loops" != "x0" ]; then + /perfetto/out/dist/traced & + /perfetto/out/dist/traced_probes & + sleep 1 + + /perfetto/out/dist/perfetto --txt -c /usr/local/perfetto-guest.cfg -o "$guest_perf" --detach=mykey + sleep 1 + + # The first virtio-gpu event has to be captured in the guest, so we correlate correctly to the host event + + echo "Replaying for Perfetto:" + eglretrace --benchmark --singlethread --loop=$perfetto_loops $WAIT --headless "$trace" + sleep 1 + + /perfetto/out/dist/perfetto --attach=mykey --stop + chmod a+rw "$guest_perf" +fi + +if [ "x$benchmark_loops" != "x0" ]; then + echo "Measuring rendering times:" + eglretrace --benchmark --loop=$benchmark_loops --headless "$trace" +fi + +if [ "x$RECORD" != "x" ]; then + eglretrace --snapshot frame --snapshot-prefix=${datadir}/ --headless "$trace" +fi |