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