如何自动强制 Nvidia GPU 驱动程序的完整合成管道?

如何自动强制 Nvidia GPU 驱动程序的完整合成管道?

我已经安装了 Manjaro Linux。我的显卡是 Nvidia GTX 1050Ti。

当我启动计算机并尝试观看视频时,我注意到屏幕严重撕裂。当我转到 Nvidia X 服务器设置并启用选项“强制完整组合管道”时,此问题得到解决。

有没有办法永久设置此选项,以便我不必每次重新启动计算机时手动启用它?

答案1

我的笔记本电脑配备了 Quadro K2100M,运行 Ubuntu Bionic 和 KDE Plasma 5.17(来自霓虹灯回购)并使用nvidia-driver-430.

由于我在家里和工作时对显示器有一组不同的配置,因此我需要一些动态的东西,以下是对我有用的东西:

  1. 我编写了以下脚本来处理屏幕的动态配置(~/bin/force-composition-pipeline.sh):

    #!/bin/bash
    s="$(nvidia-settings -q CurrentMetaMode -t)"
    
    if [[ "${s}" != "" ]]; then
      s="${s#*" :: "}"
      nvidia-settings -a CurrentMetaMode="${s//\}/, ForceCompositionPipeline=On\}}"
    fi
    
  2. 我将该脚本添加到自动启动中:
    chmod +x ~/bin/force-composition-pipeline.sh
    ln -s ~/bin/force-composition-pipeline.sh ~/.config/autostart-scripts/
    
  3. 在 KDE Plasma 设置中,显示与监控->合成器,我设置了防止撕裂(“垂直同步”)绝不

请注意,我发现非完整ForceCompositionPipeline对我来说已经足够了。

答案2

添加到 Paradox 的答案(因为我似乎无法发表评论......),我会将该命令放在 ~/.bash_profile 而不是 ~/.bashrc 中。

每次打开新的 bash 会话(即每次打开新的终端仿真器窗口/选项卡)时都会获取 ~/.bashrc。

另一方面,当您将 bash 作为登录 shell 启动时,例如,当您登录图形桌面环境时,~/.bash_profile 仅获取一次。比照https://www.gnu.org/software/bash/manual/bash.html#Bash-Startup-Files

编辑:现在有一个更好的解决方案来解决使用 nvidia 专有驱动程序时 KWin 的撕裂问题;你需要有足够新的 kwin 版本,版本 >= 5.12 [1]启用 nvidia-drm 内核模块的模式设置 [2]。我对此进行了测试,它适用于 kwin-5.17.80(来自 openSuse 存储库的 git 快照)和 nvidia 440.26。

编辑:嗯,使用 nvidia-drm 模块启用模式集有副作用,从挂起恢复似乎失败......

编辑(再次):看起来即使没有使用 nvidia-drm 模块启用模式集,撕裂似乎也消失了,至少现在......

[1]https://wiki.archlinux.org/index.php/NVIDIA/Troubleshooting#Avoid_screen_tearing_in_KDE_(KWin) https://phabricator.kde.org/D19867

[2]https://wiki.archlinux.org/index.php/NVIDIA#DRM_kernel_mode_setting

答案3

您可以设置“强制完整组合管道" 终端中的选项,如下所示:

$ nvidia-settings --assign CurrentMetaMode="nvidia-auto-select +0+0 { ForceFullCompositionPipeline = On }"

要自动执行此操作,最简单的方法是将其放入您的.bashrc.要继续,只需在终端中输入以下内容:

$ echo "$ nvidia-settings --assign CurrentMetaMode=\"nvidia-auto-select +0+0 { ForceFullCompositionPipeline = On }\"" >> ~/.bashrc

您可以注销并重新登录(或重新启动)以应用此功能。请注意,由于“自动选择”,这意味着仅是一个显示器解决方案。

另一种方法是在内部执行相同的操作~/.nvidia-settings-rc,但行为可能会随着时间的推移而改变,而在 中.bashrc,您可以确定它是如何完成的。

附录

关于屏幕撕裂,您可能想尝试其他调整。

由于您使用的是 Manjaro,我假设您使用的是 KDE。您可以告诉窗口管理器 (KWin) 使用三重缓冲或等待当前图像显示后再更新屏幕。

1)等待GPU完全显示当前图像

# echo "export __GL_YIELD=\"USLEEP\"" >> /etc/profile.d/kwin.sh

2) 在KWin中启用三重缓冲

# echo "export KWIN_TRIPLE_BUFFER=1" >> /etc/profile.d/kwin.sh

请勿同时启用以上两项nvidia-settings如果您在 KWin 中启用三重缓冲,请务必启用三重缓冲。

答案4

对于单显示器:

创建一个文本文件并粘贴以下内容:

[Desktop Entry]
Type=Application
Name=nvidia-force-full-compositon
Exec=nvidia-settings --assign CurrentMetaMode="nvidia-auto-select +0+0 { ForceFullCompositionPipeline = On }"

对于双显示器:

如果您有双显示器,您可以在文本编辑器中打开此文件:/etc/X11/xorg.conf 然后使用 ctrl+F 搜索此单词metamodes并查看其配置内容。我的是这样的:

"metamodes" "DVI-I-0: nvidia-auto-select +1920+0 {ForceCompositionPipeline=On}, HDMI-0: nvidia-auto-select +0+0

所以我创建了这样的 destop 条目:

[Desktop Entry]
Type=Application
Name=nvidia-force-full-compositon
Exec=nvidia-settings --assign CurrentMetaMode="nvidia-auto-select +1920+0 {ForceCompositionPipeline=On}, nvidia-auto-select +0+0 { ForceCompositionPipeline = On }"

注意:您可以仅执行 ForceFullCompositionPipeline 或 ForceCompositionPipeline。只需根据需要更改文本即可。

将文本文件保存为如下所示:

nvidia-force-full-compositon.desktop

哪里.desktop是必不可少的。

现在将其复制粘贴到~/.config/autostart

重启。

相关内容