X.org 可以加载两个不同的驱动程序吗?(使用 Intel 和 NVidia 卡的三头设置)

Ale*_*lex 7 nvidia xorg multiple-monitors intel

我们想用板载英特尔图形适配器和 nvidia 卡设置 3 个屏幕。

两张卡都在 lspci 中被识别

01:00.0 VGA 兼容控制器:NVIDIA Corporation GT218 [GeForce 210] (rev a2)
00:02.0 显示控制器:英特尔公司第二代核心处理器家族集成图形控制器(修订版 09)

基本工作:如果我切换到控制台,我会在 Intel 卡上看到输出,X 仅在 Nvidia 卡上运行。

但是当我输入时,xrandr | grep conn我只有一个连接的端口:

DVI-I-0 断线(正常左倒右 x 轴 y 轴)
VGA-0 断线(正常左倒右 x 轴 y 轴)
DVI-I-1 连接 1920x1200+0+0(正常左倒右 x 轴 y 轴) 518mm x 324mm
HDMI-0 断开(正常左倒右 x 轴 y 轴)

我在 Ubuntu 12.10(和 XFCE)上安装了专有的 nvidia 驱动程序。

我假设 X 在自动检测两张卡时可能有问题,所以我认为以下内容xorg.conf可能会有所帮助:

“服务器布局”部分
    标识符“布局0”
    屏幕 0“屏幕 0”
    屏幕 1 “屏幕 1”
    输入设备“键盘0”“核心键盘”
    输入设备“鼠标0”“核心指针”
结束部分

“文件”部分
结束部分

“输入设备”部分
    # 默认生成
    标识符“Mouse0”
    司机“老鼠”
    选项“协议”“自动”
    选项“设备”“/dev/psaux”
    选项“Emulate3Buttons”“否”
    选项“ZAxisMapping”“4 5”
结束部分

“输入设备”部分
    # 默认生成
    标识符“键盘0”
    驱动程序“kbd”
结束部分

“监视器”部分
    标识符“Monitor0”
    供应商名称“未知”
    型号名称“未知”
    水平同步 28.0 - 33.0
    垂直刷新 43.0 - 72.0
    选项“DPMS”
结束部分

“设备”部分
    标识符“设备0”
    驱动程序“英伟达”
    供应商名称“NVIDIA Corporation”
    BoardName "GeForce 210"
结束部分

“屏幕”部分
    标识符“Screen0”
    设备“设备0”
    监视器“监视器0”
    默认深度 24
    “显示”小节
        深度 24
    结束小节
结束部分


“监视器”部分
    标识符“Monitor1”
    供应商名称“未知”
    型号名称“未知”
    水平同步 28.0 - 33.0
    垂直刷新 43.0 - 72.0
    选项“DPMS”
结束部分

“设备”部分
    标识符“设备 1”
    驱动程序“英特尔”
    供应商名称“英特尔”
    BoardName "内部英特尔显卡"
结束部分

“屏幕”部分
    标识符“屏幕1”
    设备“设备 1”
    监视器“监视器 1”
    默认深度 24
    “显示”小节
        深度 24
    结束小节
结束部分

但它仍然无法正常工作。

  • 这通常可以在 X 中使用两个不同的驱动程序吗?
  • 那么是否有必要xorg.conf手动创建?(因为 Ubuntu 12.10 通常没有xorg.conf
  • 我的有什么错误xorg.conf吗?

小智 8

是的,X 可以使用多个驱动程序。您的设置与我的设置非常相似。我有一个 NVIDIA 9800 GT,连接了两个显示器,第二代英特尔卡和一个显示器。

我没有看到您的xorg.conf. 我怀疑您需要创建一个xorg.confif 来告诉 X 使用 nvidia 和 intel 驱动程序。我的xorg.conf看起来很像你的;我有三个显示器和屏幕部分,因为 nvidia 卡有两个显示器,但我很确定 X 忽略了这些部分。

首先,您需要确保 xinerama 在xorg.conf(可能没有必要)中被禁用。

xorg.conf

Section "ServerFlags"
    Option  "xinerama"  "off"
EndSection
Run Code Online (Sandbox Code Playgroud)

当你做 a 时,xrandr --listproviders你应该看到两张牌。

cody@IRIS> xrandr --listproviders
Providers: number : 2
Provider 0: id: 0x290 cap: 0x1, Source Output crtcs: 2 outputs: 5 associated providers: 1 name:NVIDIA-0
Provider 1: id: 0x48 cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 3 outputs: 6 associated providers: 1 name:Intel
Run Code Online (Sandbox Code Playgroud)

如果您没有看到两张卡,则您可能缺少驱动程序。(但 OP 说控制台正在使用一个,而 X 正在使用另一个,所以它们可能都有效)

您应该能够使用xrandr --setprovideroutputsource将英特尔端口添加到您显示的列表中xrandr | grep conn 在我的情况下,我使用以下名称--listproviders

xrandr --setprovideroutputsource Intel NVIDIA-0
Run Code Online (Sandbox Code Playgroud)

如果那没有添加 Intel 端口,则它可能已经以您看不到的方式连接。断开它与:

xrandr --setprovideroutputsource Intel 0x0
Run Code Online (Sandbox Code Playgroud)

然后再次尝试连接:

xrandr --setprovideroutputsource Intel NVIDIA-0
Run Code Online (Sandbox Code Playgroud)

现在应该显示所有输出端口。并且您应该能够使用 gnome 显示设置或xrandr.

所以当我终于让我的英特尔显示器工作时,当我试图将鼠标移动到第三个显示器时,nvidia 显示器决定它们需要平移。现在它将在第三个和第二个监视器上显示第三个监视器的内容。第二个的原始内容滑到第一个显示器上,第一个的内容在屏幕外。如果我再次尝试将光标移到第一台显示器上,它将恢复正常。

我终于通过另一个xrandr电话解决了这个问题:

xrandr --output DVI-I-2 --panning 3840x1200+1680+0/1920x1200+1680+0/0/0/0/0
Run Code Online (Sandbox Code Playgroud)

此调用需要物理屏幕几何结构和逻辑布局的知识。我有一个 1680x1050 的显示器、一个 1920x1200 和一个 1920x1080。它们按从左到右的顺序排列。最右边的是连接到英特尔卡。

此调用正在中间监视器上设置平移区域。 --output DVI-I-2恰好是连接到我中间显示器的端口。

前四个数字将平移区域设置为中间和右侧屏幕的总和。3840x1200 作为宽度和高度,+1680+0 偏移区域以从中间显示器的左上角开始。(显然 [0,0] 在左监视器的左上角)

接下来的 4 个数字是光标跟踪区域。我将其设置为仅跟踪中间屏幕上的光标。这样当光标离开此屏幕时,它不会尝试移动图像以跟随光标。

最后 4 个数字定义了平移区域周围的边界。我只是在这里使用默认值。

我使用的相关软件版本:

xorg-server-1.17.4
gnome-3.18.0
xrandr-1.4.3
Run Code Online (Sandbox Code Playgroud)