We do often include affiliate links to earn us some pennies. See more here.

How To: An update on fixing screen-tearing on Linux with an NVIDIA GPU

By - | Views: 135,732
My original guide on how to help fix screen-tearing on Linux with an NVIDIA GPU is a bit dated, so here’s an even easier way.

Notes
You will likely need the 375.26 driver or newer for this to show up in "nvidia-settings".

These options may cause a loss in performance. For me personally, the loss is next to nothing.

It probably won't work with Optimus right now, but this may be fixed in future.

What to do
Previously you needed to edit config files, and it was a little messy. Thankfully, NVIDIA added options in nvidia-settings to essentially do it all for you. The options were added in a more recent NVIDIA driver version, so be sure you're up to date.

Load "nvidia-settings" and you will need to go to this screen and then hit “Advanced” at the bottom (my screenshot doesn't have the button, as this is what you see after you hit it):
image
Tick the boxes for “Force Composition Pipeline” and “Force Full Composition Pipeline” and then hit "Apply".

You can then enjoy a tear-free experience on Linux with an NVIDIA GPU. It really is that damn easy now.

Note: You will likely need to run nvidia-settings with “sudo” for the below to work.
If you want this applied all the time on startup (without needing to do anything), you can hit “Save to X Configuration File”. I have mine located at “/etc/X11/xorg.conf.d/xorg.conf” on Antergos, but your location may be different. I also recommend backing any existing xorg.conf file up if one exists.

This step isn't needed, but it's a fun and useful extra!
I also have mine set to a script and then to a keyboard shortcut, for those times when a game reverts the desktop to a low resolution after exiting, or when a game turns off a second monitor, this will turn it back on.

For that I manually set the resolution like so:
nvidia-settings --assign CurrentMetaMode="DVI-I-1:1920x1080_60 +0+0 { ForceFullCompositionPipeline = On }, HDMI-0:1920x1080_60 +1920+0 { ForceFullCompositionPipeline = On }"
Edit that for your details, like your resolution and monitor connections (you can see them by running "xrandr --query" in terminal), and then save it as an easy to remember filename. You can then set it as a custom shortcut, I use “CTRL+ALT+F4” as it’s not used for anything else.

This has been tested and works for me perfectly across Ubuntu Unity, Ubuntu MATE and Antergos KDE. Article taken from GamingOnLinux.com.
Tags: HOWTO, NVIDIA
11 Likes
About the author -
author picture
I am the owner of GamingOnLinux. After discovering Linux back in the days of Mandrake in 2003, I constantly came back to check on the progress of Linux until Ubuntu appeared on the scene and it helped me to really love it. You can reach me easily by emailing GamingOnLinux directly. Find me on Mastodon.
See more from me
The comments on this article are closed.
59 comments
Page: «5/6»
  Go to:

14 Jan 12, 2017
View PC info
  • Supporter Plus
OMG it worked!
[email protected] Jan 12, 2017
An important point to note is that if you enable FCP, you might want to disable in game vsync. You'll encounter performance hits that can be pretty massive. In game vsync is no longer necessary.
staticx27 Jan 12, 2017
Being able to set brightness or contrast using this option (and using it in the past with my old GTX 660ti) does not work, In game or on the desktop (Redshift). Not sure why this is, but I thought people should be aware. Unfortunately this makes it not an option for me.


Last edited by staticx27 on 12 January 2017 at 3:48 am UTC
[email protected] Jan 12, 2017
Quoting: staticx27Being able to set brightness or contrast using this option (and using it in the past with my old GTX 660ti) does not work, In game or on the desktop (Redshift). Not sure why this is, but I thought people should be aware. Unfortunately this makes it not an option for me.

Likely a bug that needs to be reported to NVIDIA. I found that with this on, if you switch to another tty and back, redshift works again for that session until you reboot.
Kuduzkehpan Jan 12, 2017
thx for fix.
monnef Jan 12, 2017
Not working for me :(. *sadpanda*
I am using KDE (Kubuntu 16.04) and I have also tried setting to full redraw, activating VDPAU in player (it doesn't work in SMPlayer nor Firefox HTML5 player). I am quite annoyed by this - having nice (for me quite expensive) GPU GTX 1070, yet basic "feature" like vsync is broken :'(.

PS: Drivers version is 375.26.
wolfyrion Jan 12, 2017
I dont think you can manage to have a tearing free distro if you dont have a compositor enabled but if you have Plasma/KDE you dont need these settings , you just need 2 things.

have the compositor enable in everything
(there was a bug that compositor was going disable if you launched anything related to opengl and that was causing tearing and many other problems.)
To fix that you had to create a rule to force the compositor on
Windows Rules: Appearance and Fixes --> Force Compositing --> Force --> No
(dont know if this bug still happens or is fixed)

Then you have to add these lines on /etc/profile

gedit /etc/profile

export __GL_SYNC_TO_VBLANK=1
export __GL_SYNC_DISPLAY_DEVICE=1
export __VDPAU_NVIDIA_SYNC_DISPLAY_DEVICE=1
export __GL_SYNC_DISPLAY_DEVICE=1
export KWIN_TRIPLE_BUFFER=1
export KWIN_USE_BUFFER_AGE=0


As you can see I dont have any of the settings mentioned enable and 0 tearing on everything I do.




Last edited by wolfyrion on 12 January 2017 at 7:03 am UTC
monnef Jan 12, 2017
Thank you for your time to write down the tips. I tried it all, but it still behaves the same (I have enabled compositor).

I forgot to mention that I also tried:
export __GL_YIELD="USLEEP"
export __GL_THREADED_OPTIMIZATIONS=1


But without any luck. Also tried opengl renderer in SMPlayer, older drivers, but nothing seems to make any change. I am beginning to think that it's broken just for specific GPU serie or model, or some weird combination of package versions, because I see so many posts how to fix it and how it is working for everybody :( .

The tearing is very visible when watching full hd video. Sadly it is working fine in Windows 10 (dual boot), so it shouldn't be a hw issue.
tuubi Jan 12, 2017
View PC info
  • Supporter
Quoting: monnefThe tearing is very visible when watching full hd video. Sadly it is working fine in Windows 10 (dual boot), so it shouldn't be a hw issue.
Which player? Use something that supports VPDAU, like mpv or Kodi. Or are you talking about Flash video on the web?

EDIT: Sorry, just noticed your earlier message. I remember having trouble with video tearing as well back before I started using Compton.


Last edited by tuubi on 12 January 2017 at 8:06 am UTC
kokoko3k Jan 12, 2017
Quoting: [email protected]An important point to note is that if you enable FCP, you might want to disable in game vsync. You'll encounter performance hits that can be pretty massive. In game vsync is no longer necessary.

Not quite right, on contrary, you may waste GPU/CPU cycles trying to render more frames than the monitor would allow; if the game has no vsync logic enabled, it is probably completely unaware of the monitor refresh rate, so it will render as fast as it can, and that could lead to jerkyness because the couple [compositor+monitor refresh] is not synced to game frames.

Indeed, one thing i noticed with compositors that do vsync (*AND* vsync is disabled in games) is that motion is jerky/jumpy in games (it is still smooth in movies because the fps is limited by the movie itself).

The workaround for that is:
Given "C" a compositor that provides a working vsync (nvidia forcefullcompositionpipeline, kwin with tearing prevention on, compton with vsync enabled and so on):

* If the game provides a working vsync, enable it and disable "C"

*If the game provides a non working vsync, enable it and leave "C" enabled; this is needed because even if you got tearing with the Game's non-working vsync option turned on, it will still be useful, because it limits the framerate to the monitor refresh rate; this helps "C" to stay in sync with the frames -> provide a smooth gameplay.

I've tested that on trine 2 and grid autsport.

My current setup is as follows:
Desktop Use:
- KDE/Plasma, compositor enabled but with "tearing prevention" disabled
- ForceFullCompositionPipeline enabled.
- vsync disabled in mpv (framerate is limited anyway by the movie)

Gaming:
- KDE/Plasma compositor completely disabled (to gain some fps)
but with frame limiter set to 75 (because my monitor uses 75hz).
Do that in ~/.config/kwinrc, add MaxFPS=75 in the "[Compositing]" section.
- Vsync option in game enabled
- If the games has a working vsync -> ForceFullCompositionPipeline disabled.
- If the games has a non-working vsync -> ForceFullCompositionPipeline enabled.

All the switches are bound to shortcuts alt-shift-f12 and alt-shift-f11
alt-shift-f12 comes with kdekwin and completely disables the compositor
alt-shift-f11 is bound to the following:
> cat ~/scripts/nvidia.compositionpipeline.switch.sh 
#!/bin/bash
killall aosd_cat
if nvidia-settings -t -q CurrentMetaMode|grep 'ForceCompositionPipeline=On' &>/dev/null ; then
    ~/scripts/nvidia.compositionpipeline.disable.sh &
    echo "FFCP=OFF" | aosd_cat -n "Sans Bold 15"  -x 0 -y 0 -p 0 -t 0 -b 255 -s 255 -d 10 -R yellow  -u 5000 &
    echo "FFCP=OFF" | aosd_cat -n "Sans Bold 15"  -x 0 -y 0 -p 2 -t 0 -b 255 -s 255 -d 10 -R yellow  -u 5000 &
        else
    ~/scripts/nvidia.compositionpipeline.enable.sh &
    echo "FFCP=ON" | aosd_cat -n "Sans Bold 15"   -x 0 -y 0 -p 0 -t 0 -b 255 -s 255 -d 10 -R "#99ccff"  -u 5000 &
    echo "FFCP=ON" | aosd_cat -n "Sans Bold 15"   -x 0 -y 0 -p 2 -t 0 -b 255 -s 255 -d 10 -R "#99ccff"  -u 5000 &
fi
###########
> cat ~/scripts/nvidia.compositionpipeline.disable.sh 
#!/bin/bash
sh -c "nvidia-settings --assign CurrentMetaMode=\"$(nvidia-settings -t -q CurrentMetaMode |tr -d "\n"|sed 's/.*:://'|sed 's/^ *//;s/ *$//'|sed "s/CompositionPipeline=On/CompositionPipeline=Off/g")\""
###########
> cat ~/scripts/nvidia.compositionpipeline.enable.sh 
#/bin/bash
sh -c "nvidia-settings --assign CurrentMetaMode=\"$(nvidia-settings -t -q CurrentMetaMode |tr -d "\n"|sed 's/ViewPortIn=/ForceFullCompositionPipeline=On, ViewPortIn=/g'|sed 's/.*:://'|sed 's/^ *//;s/ *$//')\""

Hitting a shortcut is faster than opening the nvidia's control panel, and the aosd_cat command is useful because it show the current FFCP (ForceFullCompositionPipeline) state.


Last edited by kokoko3k on 12 January 2017 at 4:27 pm UTC
While you're here, please consider supporting GamingOnLinux on:

Reward Tiers: Patreon. Plain Donations: PayPal.

This ensures all of our main content remains totally free for everyone! Patreon supporters can also remove all adverts and sponsors! Supporting us helps bring good, fresh content. Without your continued support, we simply could not continue!

You can find even more ways to support us on this dedicated page any time. If you already are, thank you!
The comments on this article are closed.