drm-shim¶
Panfrost implements drm-shim
, stubbing out the Panfrost kernel interface.
Use cases for this functionality include:
Future hardware bring up
Running shader-db on non-Mali workstations
Reproducing compiler (and some driver) bugs without Mali hardware
Although Mali hardware is usually paired with an Arm CPU, Panfrost is portable C code and should work on any Linux machine. In particular, you can test the compiler on shader-db on an Intel desktop.
To build Mesa with Panfrost drm-shim, configure Meson with
-Dgallium-drivers=panfrost
and -Dtools=drm-shim
. See the above
building section for a full invocation. The drm-shim binary will be built to
build/src/panfrost/drm-shim/libpanfrost_noop_drm_shim.so
.
To use, set the LD_PRELOAD
environment variable to the drm-shim binary.
By default, drm-shim mocks a Mali-G52 system. To select a specific Mali GPU,
set the PAN_GPU_ID
environment variable to the desired GPU ID:
Product |
Architecture |
GPU ID |
---|---|---|
Mali-T720 |
Midgard (v4) |
720 |
Mali-T860 |
Midgard (v5) |
860 |
Mali-G72 |
Bifrost (v6) |
6221 |
Mali-G52 |
Bifrost (v7) |
7212 |
Mali-G57 |
Valhall (v9) |
9093 |
Mali-G610 |
Valhall (v10) |
a867 |
Additional GPU IDs are enumerated in the panfrost_model_list
list in
src/panfrost/lib/pan_props.c
.
As an example: assuming Mesa is installed to a local path ~/lib
and Mesa’s
build directory is ~/mesa/build
, a shader can be compiled for Mali-G52 as:
~/shader-db$ BIFROST_MESA_DEBUG=shaders \
LD_PRELOAD=~/mesa/build/src/panfrost/drm-shim/libpanfrost_noop_drm_shim.so \
PAN_GPU_ID=7212 \
./run shaders/glmark/1-1.shader_test
The same shader can be compiled for Mali-T720 as:
~/shader-db$ MIDGARD_MESA_DEBUG=shaders \
LD_PRELOAD=~/mesa/build/src/panfrost/drm-shim/libpanfrost_noop_drm_shim.so \
PAN_GPU_ID=720 \
./run shaders/glmark/1-1.shader_test
These examples set the compilers’ shaders
debug flags to dump the optimized
NIR, backend IR after instruction selection, backend IR after register
allocation and scheduling, and a disassembly of the final compiled binary.
As another example, this invocation runs a single dEQP test “on” Mali-G52,
pretty-printing GPU data structures and disassembling all shaders
(PAN_MESA_DEBUG=trace
) as well as dumping raw GPU memory
(PAN_MESA_DEBUG=dump
). The EGL_PLATFORM=surfaceless
environment variable
and various flags to dEQP mimic the surfaceless environment that our
continuous integration (CI) uses. This eliminates window system dependencies,
although it requires a specially built CTS:
~/VK-GL-CTS/build/external/openglcts/modules$ PAN_MESA_DEBUG=trace,dump \
LD_PRELOAD=~/mesa/build/src/panfrost/drm-shim/libpanfrost_noop_drm_shim.so \
PAN_GPU_ID=7212 EGL_PLATFORM=surfaceless \
./glcts --deqp-surface-type=pbuffer \
--deqp-gl-config-name=rgba8888d24s8ms0 --deqp-surface-width=256 \
--deqp-surface-height=256 -n \
dEQP-GLES31.functional.shaders.builtin_functions.common.abs.float_highp_compute