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

  1. sRemFB creates evdi cards on the GPU box.
  2. With evdi cards present, SteamVR’s DRM lease breaks (dc_stream_state is NULL, flip_done timed out).
  3. The first fix was to remove the evdi cards before starting VR.
  4. But mutter never forgets a removed GPU. Each removed card leaves a stale wp_drm_lease_device_v1 global, and Xwayland keeps its fd.
  5. The stale globals block VR: SteamVR loops after LeaseDevice_Done, and Monado waits forever for done events, or picks a stale device that advertises the Index’s connector.
  6. 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.
  7. So there is no longer any reason to remove evdi cards: sremfb-server now 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.

Written by Jonathan (462engineering) and Claude (Claude Opus 5.5, Anthropic) — research, debugging and drafting done together in a Claude Code session.