屏幕撕裂Nvidia GTX960m

我最近买了MSI GP72 7QF( i5-7300HQ + Nvidia GTX960m ),我在安装Ubuntu 17.04后遇到了令人讨厌的屏幕撕裂问题。 我安装了最新的Nvidia驱动程序( 384.59 ),但它仍在撕裂。 我猜问题是PRIME同步。

我该如何解决?

我有两台运行17.04的混合笔记本电脑,一台旧的ThinkPad和一台P50(2016)。 这些是Nvidia Optimus机器,都具有“企业级”Quadro图形和适当的硬件多路复用,便宜的笔记本电脑没有。 这使得在Linux中的Optimus问题有点没有实际意义,但是,无论如何,我都有优化工作。

我花了很多时间来解决这个问题,并提出了答案。 无论如何,如果你有我的机器。

我的笔记本电脑有一个BIOS设置来禁用英特尔图形,只使用nvidia卡,它描述为离散模式。 这需要移动工作站ThinkPad具有的硬件多路复用。 在这种模式下,很容易摆脱撕裂。 这是解决方案(1)。 但这可能不是一种选择。

如果Nvidia控制面板让你选择nvidia或intel,你就处于混合模式。

如果你想使用混合图形,或者你别无选择,很容易避免在外部显示器上撕裂,因为它们是从nvidia硬件驱动的。 仅在笔记本电脑面板或外接显示器上撕裂? 根据我对两台机器的经验,外部监控器撕裂由力管道组成固定。 不需要完整的pipleline。 这是解决方案(2a)但它不会停止在笔记本电脑面板上撕裂。 您可以从nvidia控制面板或命令行打开它(适用于启动脚本)。 见下面的屏幕截图。 有一个技巧:您需要选择外部显示器,而不是内部面板,然后单击Advanced...命令行脚本如下所示。

但要在nvidia prime模式下停止在intel面板上撕裂,你需要Prime同步。 这是最难的工作。 我在17.04使用gnome桌面,但忘了使用gdm3。 继续使用lightdm作为显示管理器。 gdm3目前有一个bug,它似乎迫使一个Wayland会话,但这不起作用。 使用lightdm,您可以使用最新的nvidia驱动程序(我假设您已发现PPA中的驱动程序)启用主要同步以获得无泪体验。 您需要创建一个名为在现有nvidia之后加载的新modprobe文件,然后为此重建initramfs(清除并重新安装nvidia驱动程序会将此作为副作用,但需要更长时间)。 如果这是你的情况,我会用完整的说明更新这个答案。 它现在运行良好,有最新的驱动程序(大约一周)。 在那之前,它有效,但我们得到内核恐慌。 现在看起来很稳定。 在nvidia上有一个用于linux驱动程序的论坛,它有一个非常活跃的线程。 因此,获得主要同步工作是解决方案(2b)

我不确定笔记本电脑上的Prime同步有多大意义; 如果使用多显示器(几乎所有时间),我也可以通过使用离散模式得到我想要的东西,当我想要长电池寿命时,我在混合模式下交换到prime-select intel。 这意味着前往bios设置,但更改主要模式需要重新启动。 换句话说,我从来没有真正需要它,但它确实有效(现在)。

如果你在英特尔模式下运行混合图形,很容易修复笔记本电脑面板上的撕裂,因为nvidia卡从图片中消失(字面意思)。 因此,Prime同步无关紧要。 当然,在这种情况下,没有外部监视器。 在我的笔记本电脑上,我必须使用一个设置来启用无泪英特尔; 这是一个xorg设置。 我有一个脚本prime-select_tim,它在intel模式下运行时恢复该设置,并在nvidia模式下运行时将其删除。 那是因为如果这个配置在/usr/share/X11/xorg.conf.d中仍然有效,x将不会在prime select nvidia中启动你说你在尝试使用intel配置文件时遇到了麻烦。 在混合Nvidia模式下运行时,我发现X对/ usr / share / X11的内容非常挑剔。 它可以工作,如果你什么都不添加(这就是为什么我有一个脚本,如果我改为混合nvidia模式隐藏我的20-intel.conf文件)。

另请注意,您应确保安装了xserver-xorg-video-intel软件包。 包装描述意味着你不需要它(“如果你的hw足够新(大约2007年及更新),则不鼓励。”尽管如此,它仍然是必不可少的。

这是解决方案(3)。 注意我不知道是否在xorg.conf.d中将此文件保留在hybrid-nvidia模式下仍然会导致问题,我暂时没有测试过。

这是我的20-intel.conf,用于在混合英特尔模式下修复笔记本电脑面板上的撕裂。 当处于hybrid-nvidia模式时,它不会修复笔记本电脑面板上的撕裂(实际上,即使只是将此文件留在那里也可能会阻止X启动)。 只有Prime同步可以帮助您。

 Section "Device" Identifier "Intel Graphics" Driver "intel" Option "TearFree" "true" EndSection 

我在使用xfce时完成了所有这些,所以我知道它也适用于那里。 但是17.04中的gnome非常好我改变了。 我没有在Unity中测试过这个。

==混合Nvidia模式==

所以要详细说明在混合nvidia模式下不要撕裂:在这种模式下,nvidia卡呈现一切。 它可以直接写入外部屏幕,因此外部屏幕上的任何撕裂都只是一个nvidia问题。 ForceCompositionPipeline是我需要的修复。

您可以从命令行激活它。 这就是我的工作。

 #!/bin/bash nvidia-settings --assign CurrentMetaMode="$(nvidia-settings -q CurrentMetaMode -t|tr '\n' ' '|sed -e 's/.*:: \(.*\)/\1\n/g' -e 's/}/, ForceCompositionPipeline = On}/g')" > /dev/null 

我不是那个片段的作者,对我来说太神奇了。 您也可以从Nvidia控制面板Advanced执行此操作,但请确保单击外部显示器的表示。 PRIME面板(即笔记本电脑面板)不显示此设置

在此处输入图像描述

如果这不能解决撕裂,我无法帮助,但这意味着你的问题是一个nvidia驱动程序问题,与prime或prime同步无关。 我正在使用PPA中的驱动程序384.59。 见http://ubuntuhandbook.org/index.php/2017/02/how-to-install-nvidia-375-39-378-13-via-ppa-in-ubuntu/

要在笔记本电脑面板上绘图,nvidia卡会写入intel卡使用的内存,然后将其显示在屏幕上。 这是“Prime”。 确保你有这个工作,否则你的笔记本电脑面板上就没有图像了。

但Prime Sync是下一个级别。 让两张卡同步以避免撕裂需要Prime Sync,这是一个非常新的东西,只有在过去几周我们才能看到稳定的解决方案。 nvidia驱动程序需要在内核模式设置下运行,默认情况下不会这样做。

 sudo vi /etc/modprobe.d/zz-nvidia-modeset.conf 

并使用此内容:

  options nvidia_384_drm modeset=1 

这显然假设你有一个384司机。

然后sudo update-initramfs -u

否则新文本文件将没有任何效果。 我不关心任何人对grub2中的设置的看法,使用这个文本文件是唯一对我有用的东西,它是nvidia Prime Sync线程上公认的解决方案。

如果您当前使用gdm3,请不要使用gdm3,请使用lightdm。 希望gdm3错误将在Ubuntu 17.10之前修复,它可能是默认的显示管理器:)如果你不确定,那么:

 dpkg-reconfigure lightdm 

然后重启。

 tim@raffles:~$ xrandr --properties | grep PRIME PRIME Synchronization: 1 

本教程解释了为什么会发生这种情况以及如何解决它: https : //m.youtube.com/watch?v = 91AQ_EzgNMk

在Ubuntu 16.04下接受回答

我没有测试分支,但接受答案说创建文件/etc/modprobe.d/zz-nvidia-modeset.conf并使用此内容:

 options nvidia_384_drm modeset=1 

但是,这与同一目录中的现有文件相矛盾:

 $ cat /etc/modprobe.d/nvidia-graphics-drivers.conf # This file was installed by nvidia-384 # Do not edit this file manually blacklist nouveau blacklist lbm-nouveau blacklist nvidia-current blacklist nvidia-173 blacklist nvidia-96 blacklist nvidia-current-updates blacklist nvidia-173-updates blacklist nvidia-96-updates blacklist nvidia-384-updates alias nvidia nvidia_384 alias nvidia-uvm nvidia_384_uvm alias nvidia-modeset nvidia_384_modeset alias nvidia-drm nvidia_384_drm alias nouveau off alias lbm-nouveau off options nvidia_384_drm modeset=0 

你需要注意的事情……

更短的答案

根据Tim Richardson的回答,答案较短。 适用于配备Skylake处理器和nVidia GTX 970M控制HDMI的系统。 清理安装Ubuntu 16.04并且不做任何其他步骤,只需使用Dash启动NVIDIA X-Server Settings

NVIDIA x-server设置

单击“ Advanced按钮以使“ Force Composition Pipeline选项可用。 然后检查并应用更改。

请注意,可以选择保存配置文件:

nVidia X服务器设置保存

ArchLinux详细介绍了使屏幕撕裂修复永久固定的下一步。 简而言之:

  1. /etc/X11/xorg.conf移动到/etc/X11/xorg.conf.d/20-nvidia.conf
  2. 编辑文件并插入3行(如下所示)
  3. 保存文件并重启(我必须做两次并在Thunderbolt 3 USB-C上热插拔第3个屏幕。

要添加到/etc/X11/xorg.conf.d/20-nvidia.conf的3行:

  Option "metamodes" "nvidia-auto-select +0+0 {ForceCompositionPipeline=On, ForceFullCompositionPipeline=On}" Option "AllowIndirectGLXProtocol" "off" Option "TripleBuffer" "on"