panfrost: Add pandecode (command stream debugger)
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Tue, 19 Feb 2019 05:50:14 +0000 (05:50 +0000)
committerAlyssa Rosenzweig <alyssa@rosenzweig.io>
Thu, 21 Feb 2019 07:01:48 +0000 (07:01 +0000)
commitf611782045b471ab5004850530d6efb1a0b98c2d
treea3bcfb17b7a9f65b31b333e6491dbadcaace4b14
parentfb3bbd0c1cc115d477ce13a8e0af1bba20624bda
panfrost: Add pandecode (command stream debugger)

The `panwrap` utility can be LD_PRELOAD'd into a GLES app, intercepting
communication between the driver and the kernel. Modern panwrap versions
do no processing of their own; instead, they create a trace directory.
This directory contains the following files:

 - control.log: a line-by-line plain text file, denoting important
   syscalls (mmaps and job submits) along with their arguments

 - memory_*.bin, shader_*.bin: binary dumps of mapped memory

Together, these files contain enough information to reconstruct the
command stream and shaders of (at minimum) a single frame.

The `pandecode` utility takes this directory structure as input,
reconstructing the mapped memory and using the job submit command as an
entrypoint. It then walks the descriptors as the hardware would, parsing
and pretty-printing. Its final output is the pretty-printed command
stream interleaved with the disassembled shaders, suitable for driver
debugging. For instance, the behaviour of two driver versions (one
working, one broken) can be compared by diff'ing their decoded logs.

pandecode/decode.c was originally a part of `panwrap`; it is the oldest
living code in the project. Its history is generally not worth
preserving.

panwrap itself will continue to live downstream for the foreseeable
future, as it is specifically written for the vendor kernel. It is
possible, however, to produce equivalent traces directly from Panfrost,
bypassing the intermediate wrapping layer for well-behaved drivers.

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
src/gallium/drivers/panfrost/meson.build
src/gallium/drivers/panfrost/pan_pretty_print.c
src/gallium/drivers/panfrost/pan_pretty_print.h
src/gallium/drivers/panfrost/pandecode/cmdline.c [new file with mode: 0644]
src/gallium/drivers/panfrost/pandecode/decode.c [new file with mode: 0644]
src/gallium/drivers/panfrost/pandecode/mmap.h [new file with mode: 0644]