X.org可以加载两个不同的驱动程序? (使用Intel和NVidia卡进行三头安装)

我们想要设置一个带有板载intel图形适配器和nvidia卡的3个屏幕。

两张卡都在lspci中识别

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

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

但是当我输入xrandr | grep conn 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可以帮助:

 “ServerLayout”部分
    标识符“Layout0”
    屏幕0“Screen0”
    屏幕1“屏幕1”
     InputDevice“Keyboard0”“CoreKeyboard”
     InputDevice“Mouse0”“CorePointer”
 EndSection

 “文件”部分
 EndSection

 “InputDevice”部分
     #默认生成
    标识符“Mouse0”
    司机“老鼠”
    选项“协议”“自动”
    选项“Device”“/ dev / psaux”
    选项“Emulate3Buttons”“no”
    选项“ZAxisMapping”“4 5”
 EndSection

 “InputDevice”部分
     #默认生成
    标识符“Keyboard0”
    司机“kbd”
 EndSection

 “监视器”部分
    标识符“Monitor0”
     VendorName“未知”
     ModelName“未知”
     HorizSync 28.0  -  33.0
     VertRefresh 43.0  -  72.0
    选项“DPMS”
 EndSection

 “设备”部分
    标识符“Device0”
    司机“nvidia”
    供应商名称“NVIDIA Corporation”
     BoardName“GeForce 210”
 EndSection

 “屏幕”部分
    标识符“Screen0”
    设备“Device0”
    监控“Monitor0”
     DefaultDepth 24
    子部分“显示”
        深度24
     EndSubSection
 EndSection


 “监视器”部分
    标识符“Monitor1”
     VendorName“未知”
     ModelName“未知”
     HorizSync 28.0  -  33.0
     VertRefresh 43.0  -  72.0
    选项“DPMS”
 EndSection

 “设备”部分
    标识符“Device1”
    司机“英特尔”
     VendorName“Intel”
     BoardName“内部英特尔图形”
 EndSection

 “屏幕”部分
    标识符“Screen1”
    设备“Device1”
    监控“Monitor1”
     DefaultDepth 24
    子部分“显示”
        深度24
     EndSubSection
 EndSection

但它仍然无法正常工作。

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

是的,X可以使用多个驱动程序。 你的设置和我的设置非常相似。 我有一台连接了两台显示器的NVIDIA 9800 GT和一台带有一台显示器的第二代智能卡。

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

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

xorg.conf

 Section "ServerFlags" Option "xinerama" "off" EndSection 

当你做一个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 

如果你没有看到两张卡,你可能错过了一个驱动程序。 (但是OP说控制台正在使用一个而X正在使用另一个,所以它们可能都工作)

您应该能够使用xrandr --setprovideroutputsource将英特尔端口添加到xrandr | grep conn显示的列表中xrandr | grep conn xrandr | grep conn在我的例子中,我使用--listproviders给出的名称:

 xrandr --setprovideroutputsource Intel NVIDIA-0 

如果没有添加英特尔端口,它可能已经以您无法看到的方式连接。 断开它:

 xrandr --setprovideroutputsource Intel 0x0 

然后尝试再次连接:

 xrandr --setprovideroutputsource Intel NVIDIA-0 

现在应该显示所有输出端口。 并且您应该能够添加带有gnome显示设置或xrandr显示。

因此,当我最终让我的英特尔显示器工作时,nvidia显示器确定当我尝试将鼠标移动到第三个显示器时他们需要平移。 它现在将在第三和第二个监视器上显示第三个监视器的内容。 第二个原始内容滑到第一个显示器,第一个内容在屏幕外。 如果我试图再次将光标移动到第一个监视器,它将滑回正常状态。

我终于用另一个xrandr调用修复了这个问题:

 xrandr --output DVI-I-2 --panning 3840x1200+1680+0/1920x1200+1680+0/0/0/0/0 

此调用需要了解物理屏幕几何和逻辑布局。 我有一台1680×1050显示器,一台1920×1200和一台1920×1080。 它们按从左到右的顺序排列。 最右侧连接到英特尔卡。

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

前四个数字将平移区域设置为中间和右侧屏幕的总和。 3840×1200作为宽度和高度,+ 1680 + 0来偏移中间监视器左上角的区域。 (显然[0,0]位于左侧监视器的左上角)

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

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

我使用的相关软件的版本:

 xorg-server-1.17.4 gnome-3.18.0 xrandr-1.4.3