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:
@@ -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…)
|
||||
|
||||
Reference in New Issue
Block a user