Nvidia : Résoudre les problèmes de « tearing »

Bonjour !

Alors voilà, depuis que j'ai fait l'acquisition de ma nouvelle carte graphique Nvidia Geforce GTX 750 ti (OC edition), j'avais un phénomène de "tearing" qui était très important lors du visionnage de vidéo, avec le pilote Nouveau (libre et installé par défaut). Sous Ubuntu (unity) j'avais résolu plus ou moins le problème en passant au pilote propriétaire en version 340.x (car le 360 semble incompatible avec cette carte).

Cependant, ce problème était toujours présent sur certaines vidéos et également à des jeux vidéos un peu gourmands comme Rocket League nouvellement disponible sous Linux. Et il était encore très présent partout sous KDE, sûrement dû au moteur de rendu graphique différent et probablement plus gourmand.

Ayant malgré tout envie de repasser sous KDE qui me plaît toujours mieux qu'Unity, et pour éventuellement pouvoir jouer à de vrais jeux vidéos sous Linux, j'ai cherché une solution à mon problème. Je l'ai trouvé et après 1 jour de tests en tout genre, je n'ai plus aucun phénomène de "tearing". Voici la solution !

Le diagnostic

Le tearing est un phénomène visiblement très courant avec les pilotes propriétaires NVIDIA sous Linux (je n'ai jamais eu de problème sous Windows de ce genre). In se caractérise par un déchirement de l'écran. Vous avez peut-être l'impression comme moi de voir des lignes transparentes à l'écran. Voici une image illustrant le bug (source Wikipedia) :

Ce phénomène apparaît généralement lors du visionnage de vidéos ou lors de jeu vidéos. De manière générale, quand l'image bouge à l'écran, d'autant plus quand le mouvement est horizontal.

La solution

La première chose à faire est de générer le fichier de configuration du serveur X. Pour ceci, exécutez la commande suivante dans un terminal :

nvidia-xconfig

Ensuite, éditez le fichier suivant en tant que root (super-utilisateur) :

/etc/X11/xorg.conf

Allez dans la section Devices, et ajoutez à la fin les 2 lignes suivants :

Option         "RegistryDwords" "PerfLevelSrc=0x3322; PowerMizerDefaultAC=0x1"
    Option         "TripleBuffer" "True"

Notez que ces options peuvent augmenter la consommation de la carte graphique. Cela peut donc être un problème pour les ordinateurs portables. Voir l'article source cité ci-dessous pour d'autres options.

Puis, allez dans la section Screen et ajoutez la ligne suivante :

Option "metamodes" "nvidia-auto-select +0+0 { ForceFullCompositionPipeline = On }"

Si d'autres lignes commencent par Option "metamodes" dans cette section, commentez-les à l'aide d'un dièse (#) en début de ligne.

Enregistrez le fichier et quittez-le. Ouvrez maintenant le fichier suivant, toujours en tant que root :

/etc/profile.d/profile.sh

Chez moi ce fichier n'existant mais, je l'ai créé. Ajouter la ligne suivante :

export __GL_THREADED_OPTIMISATIONS=1

Enregistrez le fichier et quittez-le. Exécutez le programme nividia-settings en tant que root (sudo nvidia-settings). Dans la section OpenGL Settings, vérifiez que les cases Sync to VBlank et Allow flipping sont bien cochées. Dans la section X Server XVideo Settings, vérifiez que l'option Auto est sélectionnée, la sélectionner dans le cas contraire.

Enfin, aller dans la section X Server Display Configuration et cliquez sur le bouton Save to X Configuration File. Il se peut qu'il y ait un warning, validez-le. Ouvrez à nouveau le fichier /etc/X11/xorg.conf et vérifiez que les modifications effectuées précédemment sont toujours là. Si ce n'est pas le cas, refaites les modifications. Pour ma part, j'ai du refaire celle de la partie Screen, car elle avait été modifiée (j'ai commenté la ligne modifiée et remis la bonne en dessous).

La dernière étape utilise le programme compton. il faut donc l'installer :

sudo apt-get install compton

Il vous faut ensuite éditer le fichier suivant (qui sera vraissemblablement un nouveau fichier que vous devez créer) :

~/.config/compton.conf

Mettez le contenu suivant (remplacer le contenu préexistant le cas échéant) :

backend = "glx";
paint-on-overlay = true;
glx-no-stencil = true;
glx-no-rebind-pixmap = true;
vsync = "opengl-swc"; 

# These are important. The first one enables the opengl backend. The last one is the vsync method. Depending on the driver you might need to use a different method.
# The other options are smaller performance tweaks that work well in most cases. 
# You can find the rest of the options here: https://github.com/chjj/compton/wiki/perf-guide, and here: https://github.com/chjj/compton/wiki/vsync-guide

# Shadow
shadow = true;          # Enabled client-side shadows on windows.
no-dock-shadow = true;      # Avoid drawing shadows on dock/panel windows.
no-dnd-shadow = true;       # Don't draw shadows on DND windows.
clear-shadow = true;        # Zero the part of the shadow's mask behind the window (experimental).
shadow-radius = 7;      # The blur radius for shadows. (default 12)
shadow-offset-x = -7;       # The left offset for shadows. (default -15)
shadow-offset-y = -7;       # The top offset for shadows. (default -15)
shadow-exclude = [
 "! name~=''",
 "n:e:Notification",
 "n:e:Plank",
 "n:e:Docky",
 "g:e:Synapse",
 "g:e:Kupfer",
 "g:e:Conky",
 "n:w:*Firefox*",
 "n:w:*Chrome*",
 "n:w:*Chromium*",
 "class_g ?= 'Notify-osd'",
 "class_g ?= 'Cairo-dock'",
 "class_g ?= 'Xfce4-notifyd'",
 "class_g ?= 'Xfce4-power-manager'"
];

# The shadow exclude options are helpful if you have shadows enabled. Due to the way compton draws its shadows, certain applications will have visual glitches 
# (most applications are fine, only apps that do weird things with xshapes or argb are affected). 
# This list includes all the affected apps I found in my testing. The "! name~=''" part excludes shadows on any "Unknown" windows, this prevents a visual glitch with the XFWM alt tab switcher.

# Fading
fading = true; # Fade windows during opacity changes.
fade-delta = 4; # The time between steps in a fade in milliseconds. (default 10).
fade-in-step = 0.03; # Opacity change between steps while fading in. (default 0.028).
fade-out-step = 0.03; # Opacity change between steps while fading out. (default 0.03).
#no-fading-openclose = true; # Fade windows in/out when opening/closing

detect-client-opacity = true; # This prevents opacity being ignored for some apps. For example without this enabled my xfce4-notifyd is 100% opacity no matter what.

# Window type settings
wintypes:
{
  tooltip = { fade = true; shadow = false; };
};

Enfin, lancez la commande suivante :

compton --config /home/yourusername/.config/compton.conf -b

en remplaçant yourusername par votre nom d'utilisateur. Notez que cette commande a fait chez moi un gros bug : je ne pouvais plus cliquer sur rien et j'ai du redémarrer. Mais plus de problème ensuite 😉

Voilà ! Après redémarrage, le tearing ne sera plus qu'un mauvais souvenir !

Source : http://gloriouseggroll.tv/2016-arch-linux-nvidia-get-rid-of-screen-tearing-and-stuttering/ (la solution proposée est pour Archlinux mais je l'ai moi testée sous Ubuntu 16.04 sans problème !).

3 commentaires

  1. Bonjour,
    Merci pour ce tuto très exhaustif !
    Mais pour ma part, je me suis contenté de cocher la case "force composition pipeline" (pas full) dans Nvidia X server settings et cela a résolu le problème de tearing vidéo. Je laisse donc l'info dans ce commentaire, malgré les 3 ans écoulés, pour ceux qui auraient aussi un problème de tearing vidéo car cet article apparaît dans les premiers résultats de recherche Google.

    1. Bonjour,

      Merci pour l'info. Ça correspond à la partie qui consiste à modifier le xorg.conf, donc pour ça c'est potentiellement plus rapide donc cool (même si pour moi c'était l'option full en l'ocurrence). Peut-être est-ce le fait de ne pas mettre le full qui permet de ne pas avoir à faire le reste. A tester sur des choses gourmandes en graphique...

  2. Salut, merci pour l'article qui décrit parfaitement nos problèmes (pour du ciné sur vidéoprojecteur plutôt que pour les jeux mais l'effet est le même). La solution de Flytox a suffit pour le tearing, c'est quand même bon à savoir. Maintenant il nous reste ce que je suppose être du "stuttering"

Répondre à Flytox Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.