先讲清楚一个核心原理:FreeBSD下实现3D加速的机制,其实并不只是FreeBSD独有的,整个*nix家族走的都是同一套逻辑。
整套架构,近似于通信领域的OSI分层模型:
(1)最顶层是应用层。说白了,就是程序发起一个3D渲染请求,然后通过函数调用,去调用下一层的3D加速接口。没什么玄乎的。
(2)再往下,是3D加速的函数接口(API)。它的作用是把应用层的各种调用,转译成系统能理解的东西,最终让X系统去和硬件交互。目前最流行的API有DirectX、OpenGL。而在*nix世界里,有个对Windows用户来说可能比较陌生的词——MESA。早期的MESA实际就是OpenGL的一个开源实现,如今已经在很多方面有了突飞猛进的扩展。有兴趣的可以去看看官网:
https://mesa3d.org/
这些API和X系统之间的桥梁,就是GLX。GLX本质上是一种运行在X之上的协议,通过它,函数调用才能跟X系统打交道。
(3)DRI。这是整个系统的关键环节。
DRI,全称Direct Rendering Infrastructure,你可以简单理解成X与硬件之间的中间层。但它并不只是一个单薄的接口,而是包含了从X到硬件各个节点的模块,甚至牵涉到内核。它最重要的工作,就是把MESA或OpenGL的调用,翻译成硬件能直接执行的指令,从而指挥GPU开始渲染。
(4)DRI驱动程序。这是最底层的,直接和物理硬件打交道。没有它,所有的上层调用都是空谈。
好了,理论说完,直接上干货——怎么才能让你的FreeBSD开启3D?
实现的条件
核心问题只有一个:你的DRI支不支持你的显卡?
目前,FreeBSD的DRI对以下系列显卡有原生支持(摘自/usr/src/sys/i386/conf/NOTES):
device drm # DRM core module
device i915drm # Intel i830 through i915
device mach64drm # ATI Rage Pro, Rage Mobility P/M, Rage XL
device mgadrm # AGP Matrox G200, G400, G450, G550
device r128drm # ATI Rage 128
device radeondrm # ATI Radeon
device sa vagedrm # S3 Sa vage3D, Sa vage4
device sisdrm # SiS 300/305, 540, 630
device tdfxdrm # 3dfx Voodoo 3/4/5 and Banshee
如果你的显卡不在上面这张表里,那基本上可以放弃治疗了。
不过,如果你用的是nVidia的显卡,先别急着悲伤——往下看,你会发现选择nVidia恰恰是明智的。而如果你的显卡在上面,也别高兴太早,这些行列里总有特例。比如我那台笔记本的ATI IGP 340M,就属于“理论上支持,实际难搞”的那一类。
一起来看看手里的卡到底行不行:
(1)执行dmesg | grep agp。如果看到类似下面的输出:
agp0: mem 0xe0000000-0xe3ffffff at device 0.0 on pci0
那说明有戏。如果啥都没出,那就恭喜了——可以彻底忘了3D这回事,关掉这篇文章,等换张新显卡再回来吧。
(2)执行kldload drm。如果没报错,基本就成功了一大半。如果恰好报错了,那希望就减少一半,或者说希望不大。
(3)前两关都过了,就可以开始真刀真枪地实验了。
3D功能的实现
普通显卡
(1)先把Xorg和KDE(或Gnome)装上。
(2)运行Xorg -configure,会在home下生成一个xorg.conf.new文件,把它复制到/etc/X11/xorg.conf。
(3)执行startx。这时你会看到三个窗口外加一个时钟。别慌,这其实是正常的,因为你还没进入KDE。
(4)退出X。在最左边的窗口里输入exit,或者按下Ctrl+Alt+BackSpace。
(5)查看日志:cat /var/log/Xorg.0.log | grep " Direct Rendering enabled"。如果看到:
(II) RADEON(0): Direct Rendering enabled
恭喜,3D已启用。如果没有,那就去仔细阅读/var/log/Xorg.0.log,它会在某一行明确告诉你原因。
nVidia显卡
如果你用的是nVidia,那事情简单很多。直接去nVIDIA官方下载最新的FreeBSD驱动,安装就行。装完后用kldstat看一下,会发现多了linux的模块。nVidia的说明说这是为了兼容性而设的,实际上驱动是纯FreeBSD的,可以在/boot/loader.conf里把它去掉。
装完重启X,应该会在KDE启动前闪过一个nVidia的logo(本人现在没有测试环境了,不然真想拍下来给大家看看)。只要那个logo出现,基本就成了。
3D功能的确认
怎么确认3D加速确实在跑?
(1)最权威的方式:打开终端,运行glxinfo。在第二行或第三行,如果看到Direct Rendering: YES,那就板上钉钉了。
(2)实践中最好用的方式:调出屏幕保护程序,选那些带GL字眼的,比如经典的“幻想”,如果不卡顿、不拖影,那也说明已经OK了。
可能会出现的问题
(1)显卡明明在列表里,但就是加载不上。→ 搜Google或百度吧,一步到位。
(2)共享内存的显卡总出问题。→ 如果BIOS里能调显存大小,设成大于16M;如果BIOS不行,就在/etc/X11/xorg.conf里把Ramsize的值设成大于4096。
(3)IBM R40e系列笔记本,老是提示“不支持AGP”。→ 升级到FreeBSD 6.1-Release。这个版本的一大改进,就是解决了这个坑(感谢FreeBSD开发团队!)。
(4)显卡明明没问题,但就是无法启用3D加速。→ 这个问题比较棘手。很多老显卡不支持24位或32位色深,试试在/etc/X11/xorg.conf里改成16位色深。多少人都在这里卡过。
(5)想启用双显模式?→ 去man吧,没什么捷径。
(6)启用3D加速到底有什么好处?→ 第一,你可以玩Quake了;第二,所有图形相关软件都会有明显的速度提升;第三,你可以享受到一个流光溢彩的屏保;第四,把大量计算工作甩给显卡,等于给你的CPU延寿;当然,还有你自己才懂的第五个理由。



