Linux 上 3-D 图形的难题
在过去一年中,游戏玩家对 Linux 的看法发生了巨大的变化。Linux 不再仅仅被 relegated 为专用服务器的角色,越来越多的游戏玩家将 Linux 用作他们的主要操作系统和游戏平台。似乎使用 Linux 本身就已足够具有挑战性,任何试图设置 Linux 机器来玩 3-D 游戏的人都会发现这条道路充满了令人困惑的首字母缩略词和名称。从 OpenGL 到 DRI 再到 DGA,每个术语都指代 Linux 图形完整场景的特定部分。在这里,我们将这些碎片拼凑在一起,为我们的读者提供更广阔的视野,了解 Linux 现在提供什么以及在不久的将来将提供什么。
我们首先来看 OpenGL,这个名字最近被广泛使用,尤其是在指代游戏和专业设计应用程序时。OpenGL(开放图形库)最初名为 IRIS GL,是一个编程库,提供丰富的图形函数,包括 2-D 和 3-D,允许程序员在屏幕上表示他们设计的任何对象。它由 Silicon Graphics (SGI) 开发,并已成为许多平台上的标准图形应用程序编程接口 (API),包括 UNIX、Linux、Microsoft Windows 和 Apple Macintosh。虽然 OpenGL 是高端图形应用程序的标准,程序员发现它功能强大且易于使用,但大多数人听说 OpenGL 是在参考 id Software 的 Quake 系列游戏时。自 Quake 1 以来,它一直被用作图形渲染器的一部分,在那里它已证明自己是一个强大的游戏图形 API。OpenGL 的标准是开放的,独立于硬件平台、窗口系统和操作系统。因此,“开放”一词是名称的一部分。
为了在操作系统中使用 OpenGL,必须有人创建一个库来实现 OpenGL 程序发出的函数调用。但是,要将您的实现称为 “OpenGL”,您实际上必须从 SGI(或 Microsoft)获得许可。事实上,获得许可将为您赢得一个代码包,称为示例实现,用 C 编写,您可以从中在您的平台上构建您的 OpenGL 库。但由于 OpenGL 的标准是开放的,因此不需要从 SI 开始工作。事实上,这就是 Mesa 的全部意义所在:它是一个从头开始创建的实现,没有 SGI 的许可,也没有来自 SGI 的任何代码。但是,要使用 OpenGL 商标,您必须从 SGI 获得许可,并且您的实现必须足够健壮,才能通过 OpenGL 架构审查委员会 (ARB) 开发的一组一致性测试。ARB 历史上主要由高端硬件制造商和 SGI 本身组成,但现在包括一些游戏硬件制造商。值得注意的是,虽然 SGI 创建了 OpenGL,但 API 的未来由 ARB 控制,SGI 只是众多成员之一。
最近,SGI 发布了一个示例实现 (SI),可用于在任何具有适当编译器的硬件平台上实现 API。此源代码与出售给硬件供应商的源代码非常相似,硬件供应商为其显卡实现 OpenGL 驱动程序。虽然有人说 SI 现在是开源软件,但这并不完全正确。在撰写本文时,SI 附带的许可证仍然存在一些问题,阻止它真正开放。
许多人将 OpenGL 与硬件加速联系起来。虽然 OpenGL 在硬件辅助下确实运行得非常快,但运行 OpenGL 应用程序不需要这种加速。使用软件 OpenGL 库,OpenGL 应用程序可以运行并渲染与硬件加速相同的图像,尽管速度会慢得多,除非程序非常简单。当硬件加速可用时(以 3-D 显卡和为该显卡编写的驱动程序的形式),OpenGL 应用程序可以非常快速流畅地运行,因为大多数密集操作已从 CPU 卸载到专用图形板。但是,并非每个加速器都能够执行 OpenGL 的所有功能。当硬件不支持某个功能时,库可能会回退到使用 CPU 的软件实现。例如,极少数消费级显卡会进行变换和光照 (T&L),因此正常的三角形设置通常部分在硬件中完成,其余部分在软件中完成。
自最初创建以来,OpenGL 经历了多次修订,现在版本为 1.2。
在 Linux 中,最常用的 OpenGL 实现是由 Brian Paul 创建的 Mesa。
Mesa 是 OpenGL 标准的未经许可的实现,可在多个平台上使用,包括 Linux、Windows 和 Macintosh。它最初于 1995 年启动,此后一直由 Brian Paul 领导的开发团队进行开发。Mesa 是免费提供的且是开源的,因此任何人都可以使用源代码并将其移植到另一个操作系统。在大多数情况下,OpenGL 应用程序可以针对 Mesa 库进行编译和运行,就像它们针对许可的 OpenGL 库一样。
硬件加速的规定已纳入 Mesa。例如,3dfx 卡的所有者可以选择从 3dfx 下载并安装 Glide SDK,然后从其源代码重新编译 Mesa。当 Mesa 配置自身进行编译时,它应该检测到已安装的 Glide 标头和库,并因此添加必要的代码,以允许 3dfx 卡加速许多 OpenGL 函数(通过 Glide 2.x)。
与 OpenGL 一样,Mesa 也经历了多次修订。截至 Mesa 2.x,已支持 OpenGL 1.1 标准。后来的 Mesa 3.x 库是 OpenGL 1.2 标准的实现,因此应该与 OpenGL 本身几乎一样新。Mesa 还包括对 GLUT 和 GLU 的支持。
现在我们有了 OpenGL,一个用于创建 3-D 图形的编程接口,以及一个名为 Mesa 的开源实现。难题的下一部分是将 OpenGL 和 X Window 系统连接在一起的粘合剂。
由于 OpenGL 是平台和系统独立的,因此它也是窗口系统独立的。因此,它需要窗口系统绑定才能使其与窗口系统交互。此绑定为在屏幕上查找窗口位置或如何处理输入等操作提供功能。对于 UNIX 和 Linux 系统,它是 GLX,一个允许 OpenGL 和 X 一起运行的库。(对于 Microsoft Windows,它被称为 WGL。)也就是说,使用 GLX,OpenGL 可以利用 X 窗口进行输出。即使您使用的是 Mesa(全屏或非 DRI;我们稍后会解释 DRI),也有一个伪 GLX 实现,使系统认为它正在正常的窗口系统绑定下运行。Linux 中当前使用的 GLX 基于 SGI 于 1999 年 2 月发布的源代码。
你们中的一些人甚至可能遇到过术语 Utah-GLX。什么是 Utah-GLX,它在这个难题中扮演什么角色?
Utah-GLX 是一个项目,旨在为一些当前的视频加速器(如 Matrox G400/G200 卡以及 ATI Rage Pro 和 Rage 128 卡)添加 OpenGL 功能,同时仍然使用 XFree86 3.3.x。Utah-GLX 驱动程序使用间接渲染(在某些情况下,使用直接渲染的一种形式)来提供这种加速。但是,正如稍后将解释的那样,这种渲染会产生性能损失,从而阻止硬件充分发挥其潜力。
在其他成就中,Utah-GLX 项目促成了 Linux PPC 平台上的第一个硬件加速以及笔记本电脑的第一个硬件加速。在这两种情况下,显卡都是 ATI Rage Pro。
现在 XFree86 4.0 已经发布,希望 Utah-GLX 项目中的大部分工作可以移植到 DRI。虽然已经有人谈论开始这项迁移,但在撰写本文时,它尚未发生。
关于间接和直接渲染的讨论自然会留下一些未解答的问题。让我们仔细看看,了解两者之间的区别以及它们的使用位置。
间接渲染和直接渲染之间的区别在于数据必须通过的级别数。也就是说,在实际将数据放入显卡的帧缓冲区以在监视器上显示之前,数据必须经过多少处理。正如人们所期望的那样,级别越少,图像速度越快,因此强调直接渲染(通过 DRI)作为 XFree86 4.0 的一部分。
当使用间接渲染时,数据从发出图形输出的应用程序复制到 X 服务器,然后再从 X 服务器复制到硬件。这会产生性能损失,因为来自应用程序的输出必须打包成 X 服务器的形式,然后,一旦 X 完成其工作,最终输出必须适当地打包并发送到硬件。在正常的 2-D 应用程序中,此过程的速度是足够的。但是,在当今 CPU 和内存密集型 3-D 应用程序中,这种开销对于获得足够的性能来说太笨重了。
直接渲染尝试简化此数据流,并允许应用程序更直接地访问硬件。也就是说,它允许应用程序将其绘图命令直接发送到图形硬件,而只需 X 服务器进行最少量的必要干预。XFree86 中存在此功能,即 Precision Insight 开发的直接渲染基础设施 (DRI)。
最后,我们来谈谈我们讨论中多次出现的这个神秘的 DRI。所以,事不宜迟,请继续阅读以了解有关 DRI 及其对 Linux 用户的意义的更多信息。
直接渲染基础设施 (DRI) 是 Precision Insight 开发的一项技术,旨在为 X 服务器添加直接渲染功能。更常见的说法是,DRI 允许应用程序在与 X 服务器协作的同时安全有效地直接访问硬件。与 Utah-GLX 不同,它不需要特权用户或特权程序。此外,工作发生在应用程序中,而不是在 X 服务器中。
更技术地说,可以将 DRI 视为三个部分:一个特殊的 X 服务器、一个直接渲染客户端和一个内核级设备驱动程序。Linux 的特殊 X 服务器是 XFree86 4.0,其代码包含特殊的 DRI 修改。直接渲染客户端由几个较小的组件组成。其中最重要的是 OpenGL 实现(在大多数情况下是 Mesa)、PI 从 SGI 代码开发的 GLX 以及来自 PI 的特定于 Linux(但与硬件无关)的驱动程序库。内核级设备驱动程序是一个模块,它抽象化硬件的直接内存访问。它的设计方式应使将来只需进行最少的内核修改。
简而言之,DRI 是“正确完成”的硬件加速。由于它不需要特殊程序或特权,因此存在当前硬件加速实现可能不具备的固有安全性级别。此外,它是 XFree86 服务器的一部分,并经过了大量的测试。借助这样的开发系统,希望用户可以指望与 XFree86 相关的通常的稳定性。最后,直接访问硬件使 Linux 和 XFree86 有机会充当专业图形应用程序和要求苛刻的 3-D 游戏的稳固、快速平台。
除了 DRI、OpenGL、Mesa 和其他术语外,还有一些图片的较小部分,您,忠实的读者,可能已经遇到过。让我们花一点时间简要回顾一下它们中的每一个。
GLUT 最初是一个名为 aux 的库,由 Mark Kilgard(前 SGI 员工,现任职于 NVIDIA)开发,旨在使他的著作 OpenGL Programming for the X Window System 中的编程示例更易于理解。该库最终得到改进并成熟为 GLUT。
DGA 是直接图形架构。它是 X 服务器的一个非常简单的扩展,允许应用程序直接访问帧缓冲区。用户和应用程序需要具有使用 DGA 的权限。有了这些权限,他们可以访问帧缓冲区内存并在屏幕上进行未加速的绘制。随着 XFree86 4.0 的发布,DGA 2.0 将被包含在内,为基本的 2-D 绘图功能带来一些硬件加速。除了图形功能外,DGA 还允许应用程序更直接地读取鼠标和键盘等外围设备。通常,来自这些输入设备的信号在被应用程序使用之前会通过 X 服务器。
VidMode—vidmode 扩展允许应用程序查询 X 服务器以获取其支持的分辨率,并告诉 X 服务器更改为特定分辨率。这通常用于希望在桌面设置为不同分辨率时以特定大小运行的游戏中。
Glide 是 3dfx 为其 Voodoo 系列卡开发的 3-D API,旨在提供快速、全屏硬件加速。其功能旨在与 3dfx 创建的 Voodoo 硬件相匹配。许多早期的 3-D 加速游戏(如 Tomb Raider)都使用了 Glide。随着 OpenGL 在生产力和娱乐应用程序中得到广泛接受,Glide 的重要性有所降低。因此,3dfx 选择向公众发布源代码和规范,此举使其能够传播到其他平台。
让我们回顾一下:OpenGL 是一个库,有助于创建 3-D 图形。在 Linux 下,有一个名为 Mesa 的开源库,它提供 OpenGL 兼容性。我们有 GLX,为 OpenGL 应用程序提供与 X 协同工作的标准方法。对于仍在使用 XFree86 3.3.x 和某些显卡的人员,Utah-GLX 提供了一些类似于 XFree86 4.0 和 DRI 提供的 OpenGL 功能类型。但是,使用 XFree86 4.0,用户可以获得最大化的 2-D 和 3-D 性能、更好的集成和更安全的操作。
这就是您所拥有的。我们可以看到所有部件如何组合在一起以及它们彼此之间的依赖关系。

