Problema de Wayland y gráficos híbridos en Linux#

Los gráficos híbridos son una estrategia de los equipos modernos a incorporar dos tarjetas gráficas, una integrada y una dedicada, con capacidades y consumo de energía diferentes. La idea es no usar la dedicada, salvo que sea requerido para el renderizado 3D. Sin embargo, esto no es un problema resuelto en Linux y afecta a las aplicaciones nativas en Wayland, el cual es el nuevo y moderno protocolo para comunicación de servidor gráfico usado por los compositores de ventanas en Linux (en reemplazo de X11), que hagan uso de Vulkan.

Una de estas aplicaciones afectadas es el editor de código zed. Al momento de escribir esta entrada, la versión del controlador NVIDIA es 550.135 en la rama estable de Manjaro.

Síntomas del problema#

Caso Zed#

Considerando el ejemplo de zed, al ejecutar en Wayland, veremos por un breve momento que se intenta lanzar una ventana, pero a los pocos segundos se cierra. Podemos entrar a detallar mucho más, y podemos probar en la terminal zed --foreground, y allí veremos el error "payload": "called Result::unwrap()on anErr value: ERROR_INITIALIZATION_FAILED".

Si como yo, te ves afectado por este problema, puedes también contribuir con información útil al proyecto de Zed, reportando la salida de vulkaninfo y RUST_LOG=blade_graphics=debug zed --foreground, con info extra de lo siguiente que veremos para entender si el problema es más cercano a Vulkan/Wayland, o propiamente a Zed. Es el reporte zed/8168.

Caso VkCube (demo)#

Resulta que Vulkan posee unas aplicaciones de demostración para X11 y Wayland, vkcube y vkcube-wayland (disponibles en el paquete vulkan-tools), y lo esperado es que si estas funcionan, Zed (y otras basadas en Vulkan) deberían funcionarte, al menos por soporte de la plataforma.

En mi caso, vkcube funciona sin problema y Zed en X11 al menos abre la primera vez de la sesión, pero vkcube-wayland reporta segmentation fault (core dumped). Esto último lleva a que probablemente las aplicaciones nativas de Wayland con Vulkan no funcionen adecuadamente.

Ahora, posiblemente esto depende realmente de NVIDIA para los casos híbridos, porque en lo observado en Zed y con reportes de Vulkan, la afectación no ocurre en equipos con solo integrada o solo NVIDIA. Los casos reportados en Zed con solo integrada, era suficiente con instalar el controlador Vulkan adecuado para solucionar el problema. Y en Kubuntu 24.10 (que lo probé unas semanas), Zed me funcionó perfectamente en Wayland (pero entiendo que el controlador NVIDIA es de la serie 560).

Saber si tengo gráficos híbridos#

Para conocer si tu caso es por gráficos híbridos, puedes revisar la salida de las siguientes instrucciones

Consulta de controladores compatibles con salida VGA. Cualquier distribución Linux.#
 lspci | grep VGA
01:00.0 VGA compatible controller: NVIDIA Corporation TU106M [GeForce RTX 2060 Mobile] (rev a1)
05:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Renoir [Radeon Vega Series / Radeon Vega Mobile Series] (rev f0)
Utilidad de Manjaro para consultar controladores.#
 mhwd -li
> Installed PCI configs:
--------------------------------------------------------------------------------
                  NAME               VERSION          FREEDRIVER           TYPE
--------------------------------------------------------------------------------
           video-linux            2024.05.06                true            PCI
video-hybrid-amd-nvidia-prime            2023.03.23               false            PC

En ambos casos de puede apreciar la disponibilidad de una tarjeta gráfica NVIDIA y la tarjeta gráfica AMD (también podría ser Intel). Así que, esto puede ser la causa (considerando la versión del controlador NVIDIA).

Saber la versión del controlador NVIDIA#

Si no eres consciente de la versión del controlador, puedes usar tu gestor de paquetes para consultarlo, validando la versión del paquete de nvidia-utils. En mi caso, sería pamac info nvidia-utils o en derivados de Ubuntu, apt show nvidia-utils.

También puedes ejecutar nvidia-smi, y lo verás en la primera fila, Driver version.

Solución provisional#

Es claro que queremos poder usar nuestras aplicaciones favoritas, como en mi caso lo es poder usar zed. Sobre algunos problemas de Wayland en Manjaro, asociados con la tarjeta gráfica NVIDIA, he visto que la conclusión es esperar la serie 560, pero esta sigue en la rama inestable.

Pero mientras esto ocurre, podemos indicar explícitamente al controlador de Vulkan que haga uso de la configuración de la tarjeta integrada. Los archivos de configuración disponibles se encuentran en el directorio /usr/share/vulkan/icd.d/. Si es la tarjeta AMD, son los archivos que mencionan radeon, y el caso de Intel dirá intel. Esto se logra asignando la lista a la variable de entorno VK_DRIVER_FILES. En mi caso, sería:

export VK_DRIVER_FILES=/usr/share/vulkan/icd.d/radeon_icd.i686.json:/usr/share/vulkan/icd.d/radeon_icd.x86_64.json

Una vez realices este cambio, puedes probar nuevamente vkcube-wayland o zed, y si funciona, hacer este cambio permanente en el archivo .

sudo echo 'VK_DRIVER_FILES=/usr/share/vulkan/icd.d/radeon_icd.i686.json:/usr/share/vulkan/icd.d/radeon_icd.x86_64.json' >> /etc/environment

Este cambio también soluciona el error en X11 en la cual las aperturas posteriores dejan una ventana invisible.

Solución definitiva#

Cuando se encuentre disponible la serie 560 espero contarles si esto en Manjaro resolvió el problema, y para ese momento es necesario remover la línea anterior de las variables de entorno. Y cuando deseemos ejecutar algo directamente con la tarjeta NVIDIA, deberemos usar prime-run, que en este momento no hace diferencia.

Sin remover la línea, y solo para probar con el fin de saber si vale la pena hacerlo, puedes desasignar la variable con unset VK_DRIVER_FILES.