Home | History | Annotate | Line # | Download | only in trace
      1 #!/usr/bin/env bash
      2 ##########################################################################
      3 #
      4 # Copyright 2011 Jose Fonseca
      5 # All Rights Reserved.
      6 #
      7 # Permission is hereby granted, free of charge, to any person obtaining a copy
      8 # of this software and associated documentation files (the "Software"), to deal
      9 # in the Software without restriction, including without limitation the rights
     10 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     11 # copies of the Software, and to permit persons to whom the Software is
     12 # furnished to do so, subject to the following conditions:
     13 #
     14 # The above copyright notice and this permission notice shall be included in
     15 # all copies or substantial portions of the Software.
     16 #
     17 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     20 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     21 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     22 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     23 # THE SOFTWARE.
     24 #
     25 ##########################################################################/
     26 
     27 set -e
     28 
     29 PROGNAME="$(basename "$0")"
     30 TRACEDUMP="${TRACEDUMP:-$(dirname "$0")/dump.py}"
     31 
     32 
     33 
     34 ###
     35 ### Helper functions
     36 ###
     37 fatal()
     38 {
     39   echo "ERROR: $1"
     40   exit 1
     41 }
     42 
     43 
     44 print_version()
     45 {
     46   echo "TraceDiff - Compare two Gallium trace files"
     47   echo "(C) Copyright 2011 Jose Fonseca"
     48   echo ""
     49 }
     50 
     51 
     52 print_help()
     53 {
     54   echo "Usage: ${PROGNAME} [options] <tracefile1> <tracefile2>"
     55   echo ""
     56   echo "  -h, --help         display this help and exit"
     57   echo "  -V, --version      output version information and exit"
     58   echo ""
     59   echo "  -m, --meld         use Meld for diffing (default is sdiff)"
     60   echo ""
     61   echo "dump.py options:"
     62   echo "  -N, --named        generate symbolic names for raw pointer values"
     63   echo "  -M, --method-only  output only call names without arguments"
     64   echo ""
     65   echo "sdiff options:"
     66   echo "  -d, --minimal      try hard to find a smaller set of changes"
     67   echo ""
     68 }
     69 
     70 
     71 do_cleanup()
     72 {
     73   if test -d "$TEMPDIR"; then
     74     rm -rf "$TEMPDIR"
     75   fi
     76 }
     77 
     78 
     79 strip_dump()
     80 {
     81   INFILE="$1"
     82   OUTFILE="$2"
     83 
     84   python3 "$TRACEDUMP" --plain --suppress \
     85     "${DUMP_ARGS[@]}" "$INFILE" \
     86   | sed \
     87     -e '/pipe_screen::is_format_supported/d' \
     88     -e '/pipe_screen::get_\(shader_\)\?paramf\?/d' \
     89     -e 's/\r$//g' \
     90     -e 's/, /,\n\t/g' \
     91     -e 's/) = /)\n\t= /' \
     92   > "$OUTFILE"
     93 }
     94 
     95 
     96 ###
     97 ### Main code starts
     98 ###
     99 trap do_cleanup HUP INT TERM
    100 DUMP_ARGS=()
    101 SDIFF_ARGS=()
    102 USE_MELD=0
    103 
    104 while test -n "$1"
    105 do
    106   case "$1" in
    107     --version|-V)
    108       print_version
    109       exit 0
    110       ;;
    111     --help|-h)
    112       print_version
    113       print_help
    114       exit 0
    115       ;;
    116     -N|--named|-M|--method-only)
    117       DUMP_ARGS+=("$1")
    118       shift
    119       ;;
    120     -d|--minimal)
    121       SDIFF_ARGS+=("$1")
    122       shift
    123       ;;
    124     -m|--meld)
    125       USE_MELD=1
    126       shift
    127       ;;
    128     *)
    129       if test "x$INFILE1" = "x"; then
    130         INFILE1="$1";
    131       elif test "x$INFILE2" = "x"; then
    132         INFILE2="$1";
    133       else
    134         fatal "Too many input filenames specified."
    135       fi
    136       shift
    137       ;;
    138   esac
    139 done
    140 
    141 
    142 if test "x$INFILE1" = "x" -o "x$INFILE2" = "x"; then
    143   print_help
    144   fatal "Not enough input file(s) specified!"
    145 fi
    146 
    147 
    148 TEMPDIR="$(mktemp -d)"
    149 TEMP1="${TEMPDIR}/1"
    150 TEMP2="${TEMPDIR}/2"
    151 
    152 if test $USE_MELD -ne 0; then
    153   strip_dump "$INFILE1" "$TEMP1" "$@" || fatal "Could not dump '${INFILE1}."
    154   strip_dump "$INFILE2" "$TEMP2" "$@" || fatal "Could not dump '${INFILE2}."
    155   meld "$TEMP1" "$TEMP2"
    156 else
    157   mkfifo "$TEMP1" || fatal "Could not create fifo 1"
    158   mkfifo "$TEMP2" || fatal "Could not create fifo 2"
    159 
    160   strip_dump "$INFILE1" "$TEMP1" "$@" &
    161   strip_dump "$INFILE2" "$TEMP2" "$@" &
    162 
    163   sdiff \
    164     --left-column \
    165     --width="$(tput cols)" \
    166     --speed-large-files \
    167     "${SDIFF_ARGS[@]}" \
    168     "$TEMP1" "$TEMP2" \
    169   | less
    170 fi
    171