Skip to content

Instantly share code, notes, and snippets.

@AlexTMjugador
Last active August 11, 2019 18:40
Show Gist options
  • Save AlexTMjugador/cd7157435b7ee895511f4326ed42a28b to your computer and use it in GitHub Desktop.
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.
#!/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
#!/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