硬件3D加速指南

Donnie Berkholz  作者
Jorge Paulo  编辑
Joshua Saddler  编辑
张乐  译者

更新于2008年 12月 11日

1.  解释

什么是硬件3D加速,为什么我需要它?

使用硬件3D加速,三维渲染将会使用显卡上的图形处理器来进行,而不会占据宝贵的CPU资源来绘制3D图像。它也被称作“硬件加速”而不是“软件加速”,因为如果没有这个3D加速,你的CPU将只能使用Mesa软件渲染库来绘制所有的3D图像,这会占用相当多的处理器资源。虽然Xorg一般会支持2D硬件加速,它经常缺少硬件3D加速。三维硬件加速在游戏、3D CAD和建模等需要渲染3D对象的场合下非常有价值。

我怎样获得硬件3D加速?

在很多情况下,二进制驱动和开源驱动都存在。推荐使用开源驱动,因为我们使用的是Linux并且开源是它的本质特征之一。有些时候,二进制驱动是唯一的选择,比如nVidia的显卡。二进制驱动有针对nVidia显卡的x11-drivers/nvidia-drivers以及针对ATI显卡的x11-drivers/ati-drivers

什么是DRI?

Direct Rendering Infrastructure——直接渲染架构,也称DRI,是一个允许在安全和高效的方式下直接访问显卡硬件的架构。它包括对X服务器的改动,以及对几个客户端库和内核的改动。DRI的第一个重要应用是创建快速的OpenGL实现。

什么是DRM,它和常规Xorg有何联系?

DRM(Direct Rendering Manager——直接渲染管理器)是Xorg的一个改进,它通过增加直接渲染所必要的内核模块来为显卡增加3D加速功能。

目的

本指南是给那些在Xorg里不能搞定直接渲染的人准备的。DRM对于下面这些驱动工作正常:

请看DRI主页以获取更多信息和文档。

回馈

如果有任何问题和建议,请发email给Donnie Berkholz

2.  安装Xorg和配置内核

安装Xorg

请阅读我们的Xorg配置指南来配置Xorg并使之运行起来。

配置你的内核

检测你的芯片组并只启用该芯片组

代码 2.1: 检查你的AGP芯片组

# emerge pciutils; lspci | grep AGP
# 00:01.0 PCI bridge: Intel Corp. 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 03)
(因为硬件的不同,你的输出和上面的可能不一样。)

如果你的芯片组不被内核所支持,尝试给内核加上agp=try_unsupported参数可能能够成功。这将会使用Intel的一般性函数来充当AGP支持。要添加这个参数,请修改你的引导程序配置文件!

大多数,如果不是全部,内核都应该有这些选项。这里配置时使用的是一个标准的gentoo-sources内核。

代码 2.2: 配置内核

# ls -l /usr/src/linux 
lrwxrwxrwx 1 root root 22 2007-02-14 20:12 /usr/src/linux -> linux-2.6.18-gentoo-r4
(确保/usr/src/linux连接指向你现在的内核。)
# cd /usr/src/linux
# make menuconfig

代码 2.3: make menuconfig选项

Processor type and features --->
<*> MTRR (Memory Type Range Register) support
Device drivers --->
   Graphic support --->
   <M> /dev/agpgart (AGP Support) --->
   (agpgart选项在64位内核里不存在;只需要选择你的芯片组支持即可。)
   <M> Intel 440LX/BX/GX, I8xx and E7x05 support
(启用你的芯片组而不要照抄上面的例子。)
   <M> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
     <M> (从列表里选择你的显卡)

编译和安装内核

代码 2.4: 编译和安装内核

# make && make modules_install

不要忘记设置grub.conf或者lilo.conf并且执行/sbin/lilo如果你使用LILO的话。

3.  配置直接渲染

配置Xorg.conf

用你喜欢的文本编辑器打开/etc/X11/xorg.conf,编辑它以启用DRI和GLX。

代码 3.1: xorg.conf

...
Section "Module"
  Load "dri"
  Load "glx"
  ...
EndSection
...
Section "Device"
  Driver "radeon"
  (用你的驱动的名字替换radeon。)
  ...
EndSection
...
Section "dri"
  Mode 0666
EndSection

modules.autoload.d的改动

你需要把你的显卡所用的模块名字加入/etc/modules.autoload.d/kernel-2.6来确保系统启动时这个模块能被自动加载。

代码 3.2: 编辑/etc/modules.autoload.d/kernel-2.6

(改成你的模块的名字)
intel-agp

注意: 如果你把agpgart编译成了模块,你也需要把它加入/etc/modules.autoload.d/kernel-2.6

4.  测试3D加速

重启使用新内核

重启你的电脑使用你的新内核并以普通用户登录。是时候看看你的直接渲染是否已经启用而且它究竟有多厉害了。glxinfoglxgearsmesa-progs包的一部分,所以运行这两个命令前要确保它们已经被安装。

代码 4.1: 测试渲染

$ startx
(不需要加载你的驱动的模块或者agpgart,即使你把它们编译成了模块。)
(它们会被自动加载。)
$ glxinfo | grep rendering
direct rendering: Yes
(如果这里显示的是“No”,那么你没有3D加速。)
$ glxgears
(用默认大小的窗口测试你的FPS。这个数字应该比配置DRM前高出了许多。尽量在CPU空闲的时候测试。)

注意: FPS可能会受你的屏幕的刷新率所限,所以如果glxgears显示FPS只有70-100时不要忘了这一点。games-fps/ut2004-demo是一个更好的测试工具,它可以给你真实世界的表现结果。

5.  优化你的显卡的表现

获取直接渲染的最高性能

有一些选项可以提高表现百分之30或以上。请在/etc/X11/xorg.conf里设定它们。不过,首先你要检查你的主板和显卡是否支持这些选项。

首先,我们来看看你的显卡是否支持fast write。我们通过仔细分析lspci的输出来检查这一点。我们主要看“VGA compatible controller”的信息。

代码 5.1: 显卡检查

# lspci -vv
01:00.0 VGA compatible controller: ATI Technologies Inc Radeon Mobility M6 LY (prog-if 00 [VGA])
. . .
Capabilities: [58] AGP version 2.0
    Status: RQ=48 Iso- ArqSz=0 Cal=0 SBA+ ITACoh- GART64- HTrans- 64bit- FW+ AGP3- Rate=x1,x2,x4

虽然产生了很多信息,不过我们寻找的是“Capabilities”段的“Status”子段的FW。如果FW+出现在“Status”行,这表示这个显卡支持fast write。现在我们可以检查主板是否支持fast write。

重要: 如果你没有看到FW+,但是看到了FW-,你不能在xorg.conf启用fast write。你的显卡不支持fast write。

现在我们要确保主板也支持fast write。这次我们看你的lspci输出的“Host bridge”段。

代码 5.2: 主板检查

# lspci -vv
00:00.0 Host bridge: Intel Corporation 82830 830 Chipset Host Bridge (rev 02)
. . .
Capabilities: [a0] AGP version 2.0
    Status: RQ=32 Iso- ArqSz=0 Cal=0 SBA+ ITACoh- GART64- HTrans- 64bit- FW+ AGP3- Rate=x1,x2,x4

同样,检查你的AGP“Capabilities”段的“Status”子段。寻找FW。如果你看到FW+,你的主板支持fast write。

重要: 记住,你的显卡和主板要有一样的FW能力。如果有一个设备在“Status”里显示FW-,你就不能在xorg.conf里启用fast write。

假设一切正常而且你的主板和显卡都支持fast write,让我们在/etc/X11/xorg.conf里启用这个选项以获取你的硬件的最佳性能。

代码 5.3: xorg.conf

Section "Device"
  Option     "AGPMode" "4"
  (这样FPS能从609上升到618。)
  Option     "AGPFastWrite" "True"
  (这一项没有可测量的效果,不过它可能导致系统不稳定。)
  (你还需要在你的BIOS里设定它。)
  Option     "EnablePageFlip" "True"
  (这一项可以使FPS从618上升到702。它也是比较“危险的”,不过很少有人报告过问题。)
  ...
EndSection

警告: 在VIA芯片组上启用AGPFastWrite几乎肯定会导致你的机器死机。VIA芯片组不能很好的支持fast write,所以你要自己承担使用这个设定的风险。

注意: 记住如果你想让fast write正常运作,你首先需要在你的BIOS里启用相关的设定。

如果你想要设定更多的功能,请查看DRI网页上的功能矩阵或者Sourceforge上的功能列表

6.  疑难解答

不行啊。我无法启用直接渲染,而且我不知道为什么。

尝试在启动X服务器之前modprobe radeon(把radeon替换为你的驱动的名字)。再尝试把agpgart编译进内核,而不是编译成一个模块。

当我startx时,我得到了这个错误信息:"[drm] failed to load kernel module agpgart"

这是因为你把agpgart编译进了内核,而不是编译成模块。如果运行起来没有问题,请忽略这个提示。

我有一个Radeon显卡,我想要TV-Out。

原来由GATOS项目开发的驱动已经被合并到Xorg里了。要启用TV-Out你不需要做什么事情;x11-drivers/xf86-video-ati将会正常支持这个功能。

不行啊。我的显卡太新了,根本不受支持。

请试试二进制驱动。对于ati-drivers来说,这里有两个连接http://ati.amd.com/support/drivers/linux/linux-radeon.html(x86)和http://ati.amd.com/support/drivers/linux64/linux64-radeon.html(amd64)。如果这些也不支持,就用fbdev。虽然它比较慢,但是它可以运行的起来。

我有一个PCI显卡,但是搞不定。帮帮忙!

编辑/etc/X11/xorg.conf。在"Device" section中启用ForcePCIMode。

代码 6.1: Enabling ForcePCIMode

Option "ForcePCIMode" "True"

7.  致谢

  1. Christopher Webber,感谢他提供了一个有关改变或者重编译内核的疑难解答问题。
  2. Steve,感谢他建议在XF86Config里统一dri和DRI的大小写。

8.  参考

  1. http://forums.gentoo.org/viewtopic.php?t=46681
  2. http://forums.gentoo.org/viewtopic.php?t=29264
  3. http://dri.freedesktop.org/
  4. http://www.retinalburn.net/linux/dri_status.html