kde/qemu: un solo output virtio (KWIN_DRM_DEVICES) — mata el negro-tras-pintar

Tras arreglar el FB (modifiers), el escritorio pintaba con plasmashell y volvía a
negro. Causa: kwin veía DOS outputs — virtio-gpu ("QEMU Monitor") Y el efifb/simpledrm
("Unknown-1", framebuffer EFI read-only que no fue expulsado al cargar virtio-gpu).
El conflicto entre ambos rompía el import/destroy de buffers EGL (spam
eglDestroyImageKHR EGL_BAD_PARAMETER) y tiraba la conexión de plasmashell
("error in client communication") ⇒ negro.

Fix: plasma-start detecta el card cuyo driver es virtio_gpu (robusto al numerado
card0/card1 que cambia entre boots) y lo pasa por KWIN_DRM_DEVICES ⇒ kwin ignora el
efifb. Resultado: un solo output, atomic modeset, y TODOS los errores correlacionados
con el negro a 0 (client-comm, eglDestroyImage, FB fail, output disabled). kwin carga
efectos normalmente.

+ monitor de estado cada 15s al serial (kwin/plasmashell vivos) para diagnóstico.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-20 12:01:16 -04:00
co-authored by Claude Opus 4.8
parent 6c0ef0867d
commit 2f99446ca1
+21
View File
@@ -129,6 +129,22 @@ if [ "${DIAG:-1}" = 1 ]; then
say "core dumps ON (pattern=$(cat /proc/sys/kernel/core_pattern 2>/dev/null), ulimit -c=$(ulimit -c))"
fi
# SÓLO el card de virtio-gpu: el efifb/simpledrm sobrevive como 2º DRM ("Unknown-1", read-only) y kwin
# intenta manejar ambos outputs ⇒ conflicto de presentación ⇒ pinta y vuelve a NEGRO. Detectamos el card
# cuyo driver es virtio_gpu (robusto al numerado card0/card1 que cambia entre boots) y se lo pasamos a kwin.
VIRTIO_CARD=
for c in /dev/dri/card*; do
n=$(basename "$c")
drv=$(readlink -f "/sys/class/drm/$n/device/driver" 2>/dev/null)
case "$drv" in *virtio*) VIRTIO_CARD="$c"; break;; esac
done
if [ -n "$VIRTIO_CARD" ]; then
export KWIN_DRM_DEVICES="$VIRTIO_CARD"
say "KWIN_DRM_DEVICES=$VIRTIO_CARD (ignorando efifb/simpledrm)"
else
say "!! no hallé card virtio_gpu; kwin verá todos los DRM (posible doble output)"
fi
# Compositor sobre el DRM de virtio (software EGL/GBM vía kms_swrast). SIN --virtual: presenta al display.
say "lanzando kwin_wayland (DRM virtio, software GL)..."
/usr/bin/kwin_wayland --drm >/tmp/kwin.log 2>&1 &
@@ -159,6 +175,11 @@ sleep 8
say "procesos: $(ps axo comm 2>/dev/null | grep -E 'kwin|plasma' | sort -u | tr '\n' ' ')"
say "escritorio arriba (o mira /tmp/plasmashell.log). Ctrl-C mata la sesion."
dump /tmp/plasmashell.log
# monitor de estado: cada 15s dice si kwin/plasmashell siguen vivos ⇒ si vuelve a negro, sabremos si
# fue plasmashell que murió (containment) o kwin/output. (busybox pgrep -c cuenta procesos.)
( while sleep 15; do
say "STATUS: kwin=$(pgrep -c kwin_wayland 2>/dev/null) plasmashell=$(pgrep -c plasmashell 2>/dev/null) outputs_ok"
done ) &
wait $KWIN
RC=$?
# kwin salió ⇒ volcá su log para saber por qué (backend QPainter, DRM, modeset…)