Last active
August 11, 2019 18:40
-
-
Save AlexTMjugador/cd7157435b7ee895511f4326ed42a28b to your computer and use it in GitHub Desktop.
Un script y servicio de SystemV que configuran automáticamente el backend GLX a usar, teniendo en cuenta el adaptador gráfico que se está usando en mi portátil. Se asume que el paquete update-glx está disponible.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
# Sale del script mostrando un mensaje de error, con un determinado | |
# código de error. | |
salirConError() { | |
printf '\n' | |
echo "! $1" 1>&2 | |
codigoError=$2 | |
if [ -z "$codigoError" -o $codigoError -eq 0 ]; then | |
codigoError=1 | |
fi | |
exit $codigoError | |
} | |
# Muestra un mensaje de información por la salida estándar. | |
mostrarInformacion() { | |
echo "- $1" | |
} | |
# Devuelve verdadero si se está usando un determinado backend GLX. | |
usandoBackend() { | |
[ $(update-glx --query glx | awk -F ': ' '$1 == "Value" { print $2 }') = "/usr/lib/$1" ] | |
return $? | |
} | |
# Cambia el backend de GLX en uso al dado por su argumento. | |
establecerBackend() { | |
mostrarInformacion "Cambiando backend a $1..." | |
update-glx --set glx /usr/lib/$1 >/dev/null 2>&1 || salirConError "Ha ocurrido un error al cambiar el backend a $1." 3 | |
} | |
# Comprobar que nos estamos ejecutando como root | |
if [ $(id -u) -ne 0 ]; then | |
salirConError 'Este script debe de ejecutarse como superusuario.' | |
fi | |
if [ "$1" != '--reset' ]; then | |
echo '***************************************' | |
echo '* /usr/bin/autoconfigurar-backend-glx *' | |
echo '***************************************' | |
echo 'Este programa configurará el backend de GLX más apropiado para la GPU que este portátil esté usando.' | |
echo 'Si no se ejecuta, OpenGL podría estar no disponible (glxgears no funcionar) o tener un rendimiento reducido (uso de llvmpipe, rasterizado por software).' | |
printf '\n' | |
# Comprobar que X no está abierto | |
if [ -n "$(ps --no-headers -o cmd -C Xorg)" ]; then | |
salirConError 'Xorg está abierto. Por favor, ciérralo antes de ejecutar este script.' 2 | |
fi | |
# Ver si la GPU dedicada está disponible, y fue la GPU de arranque | |
GPU=$(cat /sys/bus/pci/devices/0000\:01\:00.0/boot_vga 2>&1) | |
if [ "$GPU" = '1' ]; then | |
# Estamos usando la GPU de NVIDIA exclusivamente | |
mostrarInformacion 'GPU dedicada detectada, con gráficos integrados desactivados.' | |
if usandoBackend 'nvidia'; then | |
mostrarInformacion 'Ya se está usando el backend de GLX de NVIDIA. ¡Todo listo!' | |
else | |
establecerBackend 'nvidia' | |
fi | |
elif [ "$GPU" = '0' ]; then | |
# Estamos usando el modo dinámico del portátil, con ambos adaptadores gráficos disponibles | |
# (Bumblebee no es capaz de gestionar las GPU de este portátil en modo dinámico, por lo que | |
# esto no funciona. Pero, si Bumblebee soportase este portátil, este sería el proveedor GLX más apropiado) | |
mostrarInformacion 'Gráficos integrados y GPU dedicada detectadas.' | |
if usandoBackend 'nvidia/bumblebee'; then | |
mostrarInformacion 'Ya se está usando el backend de GLX de Bumblebee. ¡Todo listo!' | |
else | |
establecerBackend 'nvidia/bumblebee' | |
fi | |
else | |
# Estamos usando la GPU integrada exclusivamente | |
mostrarInformacion 'GPU integrada detectada, con GPU dedicada desactivada.' | |
if usandoBackend 'mesa-diverted'; then | |
mostrarInformacion 'Ya se está usando el backend de GLX de Mesa. ¡Todo listo!' | |
else | |
establecerBackend 'mesa-diverted' | |
fi | |
fi | |
else | |
# Esto asegura que nouveau no se asocie con la GPU de NVIDIA nunca, lo cual da conflictos | |
# con el controlador propietario. | |
# Cabe destacar que al cambiar backends de GLX podrían eliminarse las reglas de modprobe.d | |
# del controlador de NVIDIA que se encargan de poner a nouveau en la lista negra | |
readonly enlaceListaNegra=/etc/modprobe.d/siempre-desactivar-nouveau.conf | |
if [ ! -L $enlaceListaNegra ]; then | |
ln /etc/nvidia/nvidia-blacklists-nouveau.conf $enlaceListaNegra | |
update-initramfs -u >/dev/null 2>&1 | |
fi | |
fi |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
# Gestiona la configuración del backend de GLX. | |
# | |
### BEGIN INIT INFO | |
# Provides: autoconfigurar-backend-glx | |
# Required-Start: $local_fs | |
# Required-Stop: $local_fs | |
# Default-Start: 2 3 4 5 | |
# Default-Stop: 0 6 | |
# Short-Description: Autoconfigurador del backend de GLX | |
# Description: Configura automáticamente el backend de GLX para emplear el hardware del mejor modo posible. | |
### END INIT INFO | |
PATH=/bin:/usr/bin:/sbin:/usr/sbin | |
NAME=autoconfigurar-backend-glx | |
SCRIPT=/usr/bin/$NAME | |
. /lib/lsb/init-functions | |
case "$1" in | |
start) log_begin_msg "Ejecutando script de autoconfiguración de backend de GLX" | |
$SCRIPT > /dev/null | |
log_end_msg $? | |
;; | |
stop) log_begin_msg "Restaurando backend de GLX a un buen estado para apagado" | |
$SCRIPT --reset > /dev/null | |
log_end_msg $? | |
exit 0 | |
;; | |
restart) | |
exit 0 | |
;; | |
reload|force-reload) | |
exit 0 | |
;; | |
status) | |
exit 0 | |
;; | |
*) log_action_msg "Sintaxis: /etc/init.d/$NAME {start|stop}" | |
exit 2 | |
;; | |
esac | |
exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment