From 2f99446ca1444197fcbf3a186e6dc4d8760490d6 Mon Sep 17 00:00:00 2001 From: sergio Date: Mon, 20 Jul 2026 12:01:16 -0400 Subject: [PATCH] =?UTF-8?q?kde/qemu:=20un=20solo=20output=20virtio=20(KWIN?= =?UTF-8?q?=5FDRM=5FDEVICES)=20=E2=80=94=20mata=20el=20negro-tras-pintar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- scripts/kde/plasma-start-qemu.sh | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/scripts/kde/plasma-start-qemu.sh b/scripts/kde/plasma-start-qemu.sh index 7bec0a00..d989bf75 100644 --- a/scripts/kde/plasma-start-qemu.sh +++ b/scripts/kde/plasma-start-qemu.sh @@ -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…)