101e04c3fSmrg#!/usr/bin/env bash
2af69d88dSmrg##########################################################################
3af69d88dSmrg#
4af69d88dSmrg# Copyright 2011 Jose Fonseca
5af69d88dSmrg# All Rights Reserved.
6af69d88dSmrg#
7af69d88dSmrg# Permission is hereby granted, free of charge, to any person obtaining a copy
8af69d88dSmrg# of this software and associated documentation files (the "Software"), to deal
9af69d88dSmrg# in the Software without restriction, including without limitation the rights
10af69d88dSmrg# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11af69d88dSmrg# copies of the Software, and to permit persons to whom the Software is
12af69d88dSmrg# furnished to do so, subject to the following conditions:
13af69d88dSmrg#
14af69d88dSmrg# The above copyright notice and this permission notice shall be included in
15af69d88dSmrg# all copies or substantial portions of the Software.
16af69d88dSmrg#
17af69d88dSmrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18af69d88dSmrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19af69d88dSmrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20af69d88dSmrg# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21af69d88dSmrg# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22af69d88dSmrg# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23af69d88dSmrg# THE SOFTWARE.
24af69d88dSmrg#
25af69d88dSmrg##########################################################################/
26af69d88dSmrg
27af69d88dSmrgset -e
28af69d88dSmrg
297ec681f3SmrgPROGNAME="$(basename "$0")"
307ec681f3SmrgTRACEDUMP="${TRACEDUMP:-$(dirname "$0")/dump.py}"
317ec681f3Smrg
327ec681f3Smrg
337ec681f3Smrg
347ec681f3Smrg###
357ec681f3Smrg### Helper functions
367ec681f3Smrg###
377ec681f3Smrgfatal()
387ec681f3Smrg{
397ec681f3Smrg  echo "ERROR: $1"
407ec681f3Smrg  exit 1
417ec681f3Smrg}
427ec681f3Smrg
437ec681f3Smrg
447ec681f3Smrgprint_version()
457ec681f3Smrg{
467ec681f3Smrg  echo "TraceDiff - Compare two Gallium trace files"
477ec681f3Smrg  echo "(C) Copyright 2011 Jose Fonseca"
487ec681f3Smrg  echo ""
49af69d88dSmrg}
50af69d88dSmrg
51af69d88dSmrg
527ec681f3Smrgprint_help()
537ec681f3Smrg{
547ec681f3Smrg  echo "Usage: ${PROGNAME} [options] <tracefile1> <tracefile2>"
557ec681f3Smrg  echo ""
567ec681f3Smrg  echo "  -h, --help         display this help and exit"
577ec681f3Smrg  echo "  -V, --version      output version information and exit"
587ec681f3Smrg  echo ""
597ec681f3Smrg  echo "  -m, --meld         use Meld for diffing (default is sdiff)"
607ec681f3Smrg  echo ""
617ec681f3Smrg  echo "dump.py options:"
627ec681f3Smrg  echo "  -N, --named        generate symbolic names for raw pointer values"
637ec681f3Smrg  echo "  -M, --method-only  output only call names without arguments"
647ec681f3Smrg  echo ""
657ec681f3Smrg  echo "sdiff options:"
667ec681f3Smrg  echo "  -d, --minimal      try hard to find a smaller set of changes"
677ec681f3Smrg  echo ""
687ec681f3Smrg}
697ec681f3Smrg
707ec681f3Smrg
717ec681f3Smrgdo_cleanup()
727ec681f3Smrg{
737ec681f3Smrg  if test -d "$TEMPDIR"; then
747ec681f3Smrg    rm -rf "$TEMPDIR"
757ec681f3Smrg  fi
767ec681f3Smrg}
777ec681f3Smrg
787ec681f3Smrg
797ec681f3Smrgstrip_dump()
807ec681f3Smrg{
817ec681f3Smrg  INFILE="$1"
827ec681f3Smrg  OUTFILE="$2"
837ec681f3Smrg
847ec681f3Smrg  python3 "$TRACEDUMP" --plain --suppress \
857ec681f3Smrg    "${DUMP_ARGS[@]}" "$INFILE" \
867ec681f3Smrg  | sed \
877ec681f3Smrg    -e '/pipe_screen::is_format_supported/d' \
887ec681f3Smrg    -e '/pipe_screen::get_\(shader_\)\?paramf\?/d' \
897ec681f3Smrg    -e 's/\r$//g' \
907ec681f3Smrg    -e 's/, /,\n\t/g' \
917ec681f3Smrg    -e 's/) = /)\n\t= /' \
927ec681f3Smrg  > "$OUTFILE"
937ec681f3Smrg}
947ec681f3Smrg
957ec681f3Smrg
967ec681f3Smrg###
977ec681f3Smrg### Main code starts
987ec681f3Smrg###
997ec681f3Smrgtrap do_cleanup HUP INT TERM
1007ec681f3SmrgDUMP_ARGS=()
1017ec681f3SmrgSDIFF_ARGS=()
1027ec681f3SmrgUSE_MELD=0
1037ec681f3Smrg
1047ec681f3Smrgwhile test -n "$1"
1057ec681f3Smrgdo
1067ec681f3Smrg  case "$1" in
1077ec681f3Smrg    --version|-V)
1087ec681f3Smrg      print_version
1097ec681f3Smrg      exit 0
1107ec681f3Smrg      ;;
1117ec681f3Smrg    --help|-h)
1127ec681f3Smrg      print_version
1137ec681f3Smrg      print_help
1147ec681f3Smrg      exit 0
1157ec681f3Smrg      ;;
1167ec681f3Smrg    -N|--named|-M|--method-only)
1177ec681f3Smrg      DUMP_ARGS+=("$1")
1187ec681f3Smrg      shift
1197ec681f3Smrg      ;;
1207ec681f3Smrg    -d|--minimal)
1217ec681f3Smrg      SDIFF_ARGS+=("$1")
1227ec681f3Smrg      shift
1237ec681f3Smrg      ;;
1247ec681f3Smrg    -m|--meld)
1257ec681f3Smrg      USE_MELD=1
1267ec681f3Smrg      shift
1277ec681f3Smrg      ;;
1287ec681f3Smrg    *)
1297ec681f3Smrg      if test "x$INFILE1" = "x"; then
1307ec681f3Smrg        INFILE1="$1";
1317ec681f3Smrg      elif test "x$INFILE2" = "x"; then
1327ec681f3Smrg        INFILE2="$1";
1337ec681f3Smrg      else
1347ec681f3Smrg        fatal "Too many input filenames specified."
1357ec681f3Smrg      fi
1367ec681f3Smrg      shift
1377ec681f3Smrg      ;;
1387ec681f3Smrg  esac
1397ec681f3Smrgdone
1407ec681f3Smrg
1417ec681f3Smrg
1427ec681f3Smrgif test "x$INFILE1" = "x" -o "x$INFILE2" = "x"; then
1437ec681f3Smrg  print_help
1447ec681f3Smrg  fatal "Not enough input file(s) specified!"
1457ec681f3Smrgfi
1467ec681f3Smrg
1477ec681f3Smrg
1487ec681f3SmrgTEMPDIR="$(mktemp -d)"
1497ec681f3SmrgTEMP1="${TEMPDIR}/1"
1507ec681f3SmrgTEMP2="${TEMPDIR}/2"
151af69d88dSmrg
1527ec681f3Smrgif test $USE_MELD -ne 0; then
1537ec681f3Smrg  strip_dump "$INFILE1" "$TEMP1" "$@" || fatal "Could not dump '${INFILE1}."
1547ec681f3Smrg  strip_dump "$INFILE2" "$TEMP2" "$@" || fatal "Could not dump '${INFILE2}."
1557ec681f3Smrg  meld "$TEMP1" "$TEMP2"
1567ec681f3Smrgelse
1577ec681f3Smrg  mkfifo "$TEMP1" || fatal "Could not create fifo 1"
1587ec681f3Smrg  mkfifo "$TEMP2" || fatal "Could not create fifo 2"
159af69d88dSmrg
1607ec681f3Smrg  strip_dump "$INFILE1" "$TEMP1" "$@" &
1617ec681f3Smrg  strip_dump "$INFILE2" "$TEMP2" "$@" &
162af69d88dSmrg
1637ec681f3Smrg  sdiff \
1647ec681f3Smrg    --left-column \
1657ec681f3Smrg    --width="$(tput cols)" \
1667ec681f3Smrg    --speed-large-files \
1677ec681f3Smrg    "${SDIFF_ARGS[@]}" \
1687ec681f3Smrg    "$TEMP1" "$TEMP2" \
1697ec681f3Smrg  | less
1707ec681f3Smrgfi
171