2026-09-28
A summary of the day. Each problem below was found while working on the previous one, so this post follows them in order. Details are in the linked posts.
Bring-up: Debian 13, RDNA4, Valve Index
The GPU box is a Debian 13 machine with a Radeon AI PRO R9700 (RDNA4).
RDNA4 needs the kernel, Mesa and firmware from trixie-backports. evdi
needs version 1.15.1 to build on kernel 7.1. We also hit a few
boot-time problems (a missing display manager unit, an initramfs that
picked up .link backups) and a few Steam and Index details.
→ Small notes: Debian 13 + RDNA4 + Index
Playing from the desk: sRemFB
To use the GPU box from the workstation, sRemFB creates an evdi virtual display on it and streams uncompressed or LZ4 damage rectangles to a new windowed viewer. Keyboard, mouse and gamepad go back over uinput, and audio over UDP. Key to pixel: 8.7 ms median on 2.5 GbE. → Playing on the GPU box from the desk, without a video codec
SteamVR judder, and moving to Monado
In SteamVR, menus and overlays judder. On Linux, SteamVR runs without
async reprojection. Enabling it, or asking for 120 Hz, ends with
flip_done timed out and a killed compositor. Monado with SteamVR’s own
Lighthouse driver, xrizer and WayVR runs smoothly at 90, 120 and 144 Hz
on the same hardware.
→ SteamVR on Linux: overlay/UI judder on RDNA4, and why Monado fixes it
mutter never forgets an unplugged GPU
mutter never removes a GPU that has been unplugged, and Xwayland keeps its DRM fd. Every removed evdi card leaves a stale DRM lease device. In the end, SteamVR and Monado both stall on them. → mutter never forgets an unplugged GPU (and what it does to VR)
How the problems connect
- sRemFB creates evdi cards on the GPU box.
- With evdi cards present, SteamVR’s DRM lease breaks
(
dc_stream_state is NULL,flip_done timed out). - The first fix was to remove the evdi cards before starting VR.
- But mutter never forgets a removed GPU. Each removed card leaves a
stale
wp_drm_lease_device_v1global, and Xwayland keeps its fd. - The stale globals block VR: SteamVR loops after
LeaseDevice_Done, and Monado waits forever fordoneevents, or picks a stale device that advertises the Index’s connector. - With a patched Monado (bounded wait, no silent fallback, optional DRM node pinning), Monado ignores the stale devices. It also runs fine alongside evdi, which SteamVR does not.
- So there is no longer any reason to remove evdi cards:
sremfb-servernow runs permanently. No cards are removed, so no stale devices are created.
A mutter patch for the root cause exists but has not been tested. It is published as an RFC in the mutter post.