Optimus : rendu NVIDIA

De ArchwikiFR

NVIDIA® Optimus™

NVIDIA Optimus est une technologie qui permet d'utiliser les avantages de deux cartes graphiques : l'une économe en énergie (Intel) mais faible en puissance, l'autre plus performante (NVIDIA) mais plus énergivore. Cette technologie équipe la plupart des ordinateurs sur le marché et permet d'activer l'une ou l'autre carte graphique selon la charge de travail. Néanmoins, il n'existe pas encore de fonctionnalité permettant d'automatiser le passage de l'une à l'autre carte sur les distributions GNU/Linux à l'heure actuelle.

Contrairement à Bumblebee, qui permet d'activer la carte graphique NVIDIA lorsque nécessaire, cette solution permettra d'activer la carte graphique dédiée en permanence puisque c'est elle qui sera en charge de tout l'affichage graphique et ce, sans avoir besoin de passer par la carte graphique Intel mais au détriment de la durée de vie de la batterie qui en sera fortement diminuée. Il est vivement conseillé de travailler sur secteur si vous prévoyez de mettre en place ce type de solution.

Si vous ne vous souciez pas de la durée de vie de votre batterie et que vous souhaitez profiter des performances seules de la carte NVIDIA, alors ce sujet vous concerne.

En revanche, si votre ordinateur portable fonctionne sur batterie la plupart du temps, il est préférable d'utiliser la solution Bumblebee.

Mise en place de la solution

État de la technologie Optimus sur la machine

Pour savoir si vous êtes équipé de la technologie Optimus, il suffit de lancer la commande permettant de lister le matériel disponible sur la machine :

lspci | grep -E "VGA|3D"

Si le résultat est de la forme suivante :

00:02.0 VGA compatible controller: Intel Corporation Haswell-ULT Integrated Graphics Controller (rev 09)
04:00.0 3D controller: NVIDIA Corporation GM108M [GeForce 840M] (rev a2)

Alors vous êtes concerné. Si le résultat est différent, vous n'êtes pas concerné et risquez d'endommager la configuration actuelle en continuant sur ce sujet.

Utilisateur de Bumblebee seulement

Si vous utilisiez auparavant Bumblebee, il y a de fortes chances que les paquets que vous aurez à installer entrent en conflits avec les paquets installés pour faire fonctionner Bumblebee. Si vous êtes dans ce cas là, il suffira simplement de supprimer les paquets en question avant de procéder à l'étape suivante.

Astuce : Si vous ne vous souvenez plus des paquets qui ont été installés lors de la mise en place de la solution Bumblebee, il suffit de lancer la commande permettant de demander au gestionnaire de paquets quels sont les paquets installés relatifs à ce dernier.
pacman -Qs bumblebee

L'ensemble des fonctionnalités du gestionnaire de paquets sont disponibles sur le Wiki dédié à son sujet.

Installation des paquets nécessaires

Afin que le serveur graphique puisse détecter une source d'affichage, il faudra installer les pilotes nécessaires. En l'occurence, les pilotes NVIDIA.

pacman -S nvidia nvidia-libgl xrandr
Important : selon l'ancienneté de votre carte graphique, il se peut que les pilotes nvidia et nvidia-libgl ne soient pas adaptés. Dans ce cas, veuillez consulter la page dédiée aux cartes graphiques NVIDIA pour savoir quel pilote installer.
Astuce : le module DKMS, couplé au paquet nvidia concerné, peut devenir un atout de taille face aux mise à jour du kernel. Ainsi, votre pilote "résiste" aux mises à jour du noyau qui demanderaient de réinstaller les paquets classiques, sans module. Pour en savoir plus, visitez la page dédiée au module DKMS

Rédaction du fichier de configuration du serveur graphique

Bien que dans la majorité des cas, il n'y ait aucune configuration manuelle à faire de la part de l'utilisateur, dans notre situation (Optimus), il va falloir indiquer au serveur X que la carte graphique intégrée (Intel) doit être désactivée et qu'il faut désormais utiliser la carte graphique dédiée (NVIDIA).

Pour cela, il suffit simplement de créer un fichier dans le dossier de configuration du serveur graphique.

Important : la configuration du serveur graphique ne passe plus par /etc/X11/xorg.conf. Si un fichier de configuration se trouve à cet endroit, il faudra le supprimer. La nouvelle nomenclature étant /etc/X11/xorg.conf.d/20-exemple.conf
nano /etc/X11/xorg.conf.d/20-nvidia-optimus.conf

Une fois le fichier ouvert, il faudra copier puis coller les lignes suivantes :

Section        "ServerLayout"
    Identifier "layout"
    Screen 0   "nvidia"
    Inactive   "intel"
EndSection

Section        "Device"
    Identifier "nvidia"
    Driver     "nvidia"
    BusID      "PCI:4:0:0"
EndSection

Section        "Screen"
    Identifier "nvidia"
    Device     "nvidia"
    Option     "AllowEmptyInitialConfiguration" "Yes"
EndSection

Section        "Device"
    Identifier "intel"
    Driver     "modesetting"
    BusID      "PCI:0:2:0"
    Option     "AccelMethod"                    "sna"
EndSection

Section        "Screen"
    Identifier "intel"
    Device     "intel"
EndSection
Astuce : les BusID des cartes Intel et NVIDIA peuvent ne pas correspondre à ceux ci-dessus. Il faut connaître les BusID spécifiques à votre configuration matériel.

Pour la carte graphique intégrée :

lspci | grep VGA

Et pour la carte graphique dédiée :

lspci | grep 3D

Par exemple, pour le résultat suivant :

04:00.0 3D controller: NVIDIA Corporation GM108M [GeForce 840M] (rev a2)

04:00.0 deviendra 4:0:0. De même pour la carte graphique intégrée Intel. Ces modifications sont à apporter au fichier /etc/X11/xorg.conf.d/20-nvidia-optimus.conf. Une mauvaise configuration des BusID empêchera le serveur graphique d'utiliser la bonne carte graphique pour le rendu de l'écran.

Application de la solution à l'environnement graphique

Afin que l'environnement graphique puisse utiliser l'affichage graphique, il faut que xrandr s'exécute avant l'environnement graphique.

Attention : Il peut arriver que l'on soit amené à utiliser plusieurs gestionnaires de connexions à la fois (préférences de certains utilisateurs par exemple). Dans ce cas là, il faudra appliquer les modifications suivantes à tous ces gestionnaires de connexions. Les modifications apportées à l'un ne bénéficieront pas aux autres !

STARTX

Pour les personnes n'utilisant pas de gestionnaires de connexions (tel que LXDM, LightDM, KDM et autres), suivez le wiki dédié à Startx#Installation. Une fois que vous aurez copié le fichier de configuration dans votre dossier utilisateur, il faudra éditer ce fameux fichier et rajouter les lignes suivantes à la fin de votre fichier ~/.xinitrc :

xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

Une fois que le fichier sera enregistré, puis fermé, les modifications sont tout de suites appliquées et vous pouvez lancer votre environnement depuis la commande

startx
Astuce : Vous pouvez également éditer votre fichier ~/.bash_profile comme décrit dans le wiki sus-cité afin d'imiter le comportement d'un gestionnaire de connexions

LXDM

Il faut éditer le fichier /etc/lxdm/LoginReady :

nano /etc/lxdm/LoginReady

De manière à ce que son contenu soit de la forme :

#!/bin/sh
#
# Note: this is a sample and will not be run as is.

xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

Fermez et enregistrez le fichier. Puis, redémarrez la machine afin d'appliquer les modifications.

LightDM

Il suffit de créer le fichier /etc/lightdm/display_setup.sh :

nano /etc/lightdm/display_setup.sh

Et d'y ajouter les lignes suivantes :

xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

Ensuite, on enregistre et on ferme le fichier. Et on le rend exécutable :

chmod +x /etc/lightdm/display_setup.sh

Enfin, on va configurer LightDM pour lui indiquer le chemin du script à exécuter :

nano /etc/lightdm/lightdm.conf

En modifiant la section [SeatDefaults] de manière à obtenir ceci :

[SeatDefaults]
display-setup-script=/etc/lightdm/display_setup.sh

Enregistrez puis fermez le fichier édité. Redémarrez ensuite afin d'appliquer les modifications.

SDDM

Modifiez le fichier /usr/share/sddm/scripts/Xsetup :

nano /usr/share/sddm/scripts/Xsetup

Afin d'y ajouter les lignes en question, de manière à obtenir

xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

Ensuite, enregistrez puis fermez le fichier afin de pouvoir redémarrer la machine et d'appliquer les modifications.

KDM

Éditez le fichier /usr/share/config/kdm/Xsetup :

nano /usr/share/config/kdm/Xsetup

Afin de pouvoir y ajouter les lignes suivantes :

xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

Enregistrez, puis fermez le fichier. Redémarrez la machine afin de pouvoir appliquer les changements.

Vérification

Si votre environnement graphique est ouvert et que vous avez pu vous connecter, alors votre carte graphique a bien été reconnue par le fichier de configuration du serveur graphique.

Pour s'en assurer, on peut lancer un test graphique afin d'afficher les performances ainsi que le modèle de la carte graphique utilisé pour le test de performance. Pour cela, il suffit d'installer le paquet virtualgl et de lancer la commande

glxspheres64
Astuce : si vous disposez d'un système sous architecture 32 bits, la commande à lancer est
glxspheres32
Astuce : pour connaître l'architecture du système, il suffit de copier puis coller la commande suivante dans votre terminal
getconf LONG_BIT

Si votre affichage est bien rendu par la carte graphique NVIDIA, vous devriez avoir un résultat de la forme

Polygons in scene: 62464 (61 spheres * 1024 polys/spheres)
Visual ID of window: 0x5e
Context is Direct
OpenGL Renderer: GeForce 840M/PCIe/SSE2
929.699432 frames/sec - 983.361684 Mpixels/sec

Ici, on voit que le rendu OpenGL est réalisé par la carte graphique GeForce. Donc par la carte graphique dédiée.

Résolutions des problèmes

Écran noir au redémarrage de l'ordinateur

Cela peut arriver lorsque les BusID sont mal renseignés. Pour rétablir l'affichage graphique le temps de la résolution du problème, vous pouvez déplacer le fichier dans votre dossier personnel pour avoir de nouveau l'affichage graphique via la carte graphique Intel et pouvoir résoudre le problème. Tapez les touches Alt et F2 simultanément afin d'ouvrir un nouveau terminal virtuel. Une fois connecté avec vos identifiants, déplacez le fichier de configuration.

mv /etc/X11/xorg.conf.d/20-nvidia-optimus.conf ~/Bureau/

Puis, retournez sur l'affichage graphique en tapant simultanément sur les touches Alt et F1. Il ne vous reste plus qu'à vérifiez que les BusID sont les bons puis à déplacer le fichier de nouveau.

mv ~/Bureau/20-nvidia-optimus.conf /etc/X11/xorg.conf.d/

Un redémarrage suffit pour appliquer les modifications.

Écran noir au redémarrage malgré des BusID corrects

La configuration actuelle du fichier /etc/X11/xorg.conf.d/20-nvidia-optimus.conf peut poser problème depuis la mise à jour du serveur graphique 1.17.1. Il faudra éditer le fichier /etc/X11/xorg.conf.d/20-nvidia-optimus.conf et modifier la Section "Device" concernant la carte graphique Intel, de manière à obtenir ceci :

Section "Device"
    Identifier  "intel"
    Driver      "modesetting"
    BusID       "PCI:0:2:0"
    Option      "AccelMethod"  "sna"
    #Option      "TearFree" "True"
    #Option      "Tiling" "True"
    #Option      "SwapbuffersWait" "True"
EndSection

D'autres options sont désactivées et peuvent, selon les configurations, avoir un impact plus ou moins positif sur les performances. Décommentez les lignes et testez pour essayer d'améliorer la qualité de l'affichage.

Problème de synchronisation verticale

Malheureusement, il se peut que l'écran subisse de légers pics de latence. Cela est dû à un problème de synchronisation verticale mal réglé depuis le pilote. NVIDIA travaille actuellement sur un correctif qui sera appliqué une fois que le problème sera résolu. Voir la discussion sur le forum officiel.

Voir Aussi