# 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 time chronyd -q # Initial synchronization, will take some time chronyd # Keep clocks in sync # Get trace cached trace_base=$(cat /traces-db/current_trace) if [ "x$trace_base" = "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_base}.trace" datadir="/traces-db/${trace_base}-out" 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 /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:" LOOP= if [ "x$perfetto_loops" != "x" -a "x$perfetto_loops" != "x0" ]; then LOOP="--loop=$perfetto_loops" fi eglretrace --benchmark --singlethread $LOOP $WAIT --headless "$trace" sleep 1 /perfetto/out/dist/perfetto --attach=mykey --stop chmod a+rw "$guest_perf" 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