Direct Rendering Infrastructure (DRI) 简介

Copyright

Copyright (c) 2000 by Brian Paul. All Rights Reserved.

Permission is granted to make and distribute verbatim copies of this document provided the copyright notice and this permission notice are preserved on all copies.

Permission to modify this document may be granted to those who get approval from Brian Paul.

Trademarks

OpenGL is a registered trademark and SGI is a trademark of Silicon Graphics, Inc. Unix is a registered trademark of The Open Group. The `X' device and X Window System are trademarks of The Open Group. XFree86 is a trademark of The XFree86 Project. Linux is a registered trademark of Linus Torvalds. Intel is a registered trademark of Intel Corporation. 3Dlabs, GLINT, and Oxygen are either registered trademarks or trademarks of 3Dlabs Inc. Ltd. 3dfx, Voodoo3, Voodoo4, and Voodoo5 are registered trademarks of 3dfx Interactive, Incorporated. Matrox is a registered trademark of Matrox Electronic Systems Ltd. Rage is a registered trademark of ATI Technologies, Inc. All other trademarks mentioned are the property of their respective owners.

简介

简单的讲,Direct Rendering Infrastructure (DRI) 为 linux 提供了带硬件 加速的 3D 图形功能。具体来说,DRI 是一个软件体系结构,它包括 Linux Kernel, X Window, 3D 图形硬件和 OpenGL 渲染引擎,它们相互配合为 Linux 带来了 3D 图形功能。

DRI 的设计目标:

  • 使用图形硬件带来高效的图形能力
  • 支持多种不同的图形硬件
  • 支持多个客户程序同步渲染
  • 提供安全保障,避免滥用系统(Security to prevent malicious misuse of the system)
  • 足够可靠,避免硬件和系统死锁
  • 具有跨平台性,支持多种操作系统和体系结构
  • 遵守 OpenGL 和 GLX 规范
  • 与 XFree86 项目集成
  • 开源实现

历史

具备硬件加速的 3D 计算机图形技术并不新鲜,十年前,图形工作站制造商就开 发了这个技术。现在,随着图形硬件越来越便宜,这个技术也被用到了 PC 上。

在 Linux 上实现 3D 图形加速非常有必要,但这个技术十分复杂,需要大家一 起协作。

OpenGL 和 Mesa

1993 年,Brian Paul 开始根据 OpenGL 规范写一个 OpenGL 库。Brian 使用了 IRIS GL subset emulator (简称 VOGL)。作为一个图形爱好者,Brian 想如果 使用 OpenGL API 实现一个简单的 3D 图形库来替代 VOGL 将会非常有趣。经过 18 个月的开发,他在 internet 上发布了他的项目,并为其取名为 Mesa。很多 网友参与进来,为项目贡献代码。

具备好高的准确性和效率,Mesa 很快被用户认可,被认为是不具备 OpenGL 系 统的可靠选择。

1997 年,第一个图形硬件支持加入了 Mesa (3dfx Voodoo 图形卡),它采用 Glide 形式的驱动。随后,高性能的 3D 图形硬件大幅降价,有些人开始考虑使 用价格低廉的 Linux 系统代替昂贵的图形工作站进行日常工作,但这需要很长 的路要走。

硬件和软件都需要改善。 3dfx Voodoo 图形卡仅限于低分辨率下的全屏操作。 Mesa/Glide 驱动还没有与窗口系统集成,只是 OpenGL 应用的一个子集。

另外,一个真正的 3D 工作站解决方案还需要 Linux Kernel, X Server, 硬件 驱动和渲染库的支持。

Precision Insight 和 DRI

Precision Insight 公司 (PI)是一个家专门为 XFree86 开发硬件驱动的公司。 在开发 2D 驱动的同时,PI 公司也扩展到了 3D 图形,他们开始组织人开发 Direct Rendering Infrastructure (DRI),这也是 Linux 3D 图形的基础。

DRI 将提供基础设施,以将 3D 硬件支持集成进 X Server 和 Linux 内核。而 且它还会提供一个框架来 build 模块化的驱动程序。

2000 年, DRI 被集成进了 XFree86 4.0,至少 5 个不同的硬件设备驱动被开 发出来。

然而,DRI 并没有完成,DRI 被设计的更加灵活,以满足各种硬件体系结构的需 要。由于硬件设计不断改变,而且越来越复杂,DRI 也不断发展来适应这些改变。

在 XFree86, Mesa, GLX 和 Linux 内核等开发人员的共同努力下,几个单独的 工程被组合成了一个新的强大的系统。

DRI 构件

DRI 不是一个单独的软件,它由许多模块组成。下面简要介绍了这些模块,以及 如何 fit into linxu 系统。

Kernel 模块

对应每个 3D 硬件驱动都有一个内核模块这个模块负责 DMA、AGP 内存管理、资 源管理和硬件互斥访问。为了支持多个 3D 应用同时运行,3D 图形硬件必须被 看成一个共享资源。需要使用“锁”来实现互斥访问。DMA 传输和 AGP 接口用于 发送图形命令到硬件。另外,还需要防止 out-of-control 的客户端 crash 硬 件。

由于 Linux 内核内部的数据结构和接口可能会改变,DRI 内核模块必须针对不 同的内核版本做不同的编译。DRI 内核模块位于 /lib/modules/kernel-version/misc/ 目录。DRI 内核模块一般命名为 device.o,常见的 device 如 tdfx, mga, r128 等。

一般情况下,X server 自动装载 DRI 内核模块。

2D XFree86 驱动

对于每种图形卡,都有一个 XFree86 2D (或者 DDX)驱动,它负责初始化、管理 显示和完成 2D 渲染。XFree86 4.0 引入了一个新的设备驱动接口(XAA),它使 得 XFree86 驱动向后兼容。

XFree86 驱动一般在 /usr/X11R6/lib/modules/drivers 目录下,名字为 device_drv.o。

每个 2D 驱动都包含一些代码 bootstrap 3D/DRI 特征。

3D DRI 驱动

图形卡的 3D 能力通过 3D DRI 驱动来访问。本质上讲,这个驱动将 OpenGL 命 令序列转换成硬件命令,然后它通过内核模块传输命令到硬件。3D 驱动和内核 模块基本上是实现了真个 OpenGL 渲染管道。3D 驱动的大部分工作在用户空间 完成,内核模块的工作在内核空间完成。

3D DRI 驱动通常在 /usr/X11R6/lib/modules/dri 目录下,名字通常为 device_dri.so。

这些驱动由 libGL.so 库装载,它实现了 OpenGL API。

今天,大多数 DRI 3D 驱动都是基于 Mesa 的。然而,Mesa 不是必须的,驱动 开发人员可以实现自己的 3D DRI 驱动。

libGL 库

基于 OpenGL 的程序必须与 libGL 链接。libGL 是实现了 GLX 接口和主要的 OpenGL API 入口点。当使用间接渲染时,libGL 创建 GLX 协议消息,通过 socket 将它们发送到 X Server。当使用直接渲染时,libGL 装载相应的 3D DRI 驱动,然后将 OpenGL 调用分发给该驱动。

libGL 也支持异构、多显卡,即一个系统中有多块不同类型的显卡。libGL 可使 用应用程序同时使用这些显卡。

一般来讲,libGL 从 /usr/X11R6/lib/modules/dri 目录装载 3D DRI 驱动,也 可通过设置环境变量 LIBGL_DRIVERS_PATH 来改变装载路径。

XFree86 DRI 扩展

XFree86-DRI X Server 扩展主要用于 DRI 构件之间的通信,如 X server,kernel module, libGL.so, 3D DRI Driver 等。

DRI 模块维护 DRI 特定的数据结构,包括 screen,window, rendering context 等。当用户移动窗口时,需要通知其它 DRI 构件从而保证显示的准确性。

XFRee86-DRI 模块通常位于 /usr/X11R6/lib/modules/extesions/libdri.a。

XFree86 GLX 扩展

X server 的 GLX 扩展负责处理 GLX 协议服务器端的任务,包括设置 GLX-enhanced visuals, GLX context 创建、context 绑定和 context 销毁。

当使用间接渲染时,GLX 扩展解码 GLX 命令包,将它们分发到核心渲染引擎。

这个扩展一般位于 /usr/X11R6/lib/modules/extensions/libglx.a。

XFree86 GLcore 扩展

在间接渲染时,GLCore 模块负责渲染工作。当前使用 Mesa 进行软件渲染,将 来,间接渲染也会使用硬件加速。

这个扩展位于 /usr/X11R6/lib/modules/extensions/libGLcore.a。

模块化 和 版本检查

每个 DRI 构件都有版本号,并会被检查兼容性。若有兼容的情况出现,系统将 会 recover gracefully,并提供诊断信息。

服务器端的 error 信息将会出现在 X Server messages 中。

libGL 产生的客户端的 error 信息将会被打印在 stderr 上,前提是 环境变量 LIBGL_DEBUG 被设置。

感谢 XFree86 和 DRI 的模块化,使得在系统中改变图形硬件,重启之后可以继 续使用该系统而不需要安装新的软件。

使用 DRI

软件包被安装并配置之后,启动 X server 就可以使用 3D 渲染了。

与 libGL 链接的应用程序自动获得硬件加速支持。若没有 3D 硬件,OpenGL 应 用基于软件渲染的基础上运行。

SeeAlso

原文还有一些内容,但相对于今天来讲已不是太重要,有兴趣的读者可以参考原 文。

原文:Introduction to the Direct Rendering Infrastructure

略掉的内容包括:

  • 支持的硬件
  • 支持的操作系统
  • 开源开发
  • 将来的工作

参考文献

  1. A Multipipe Direct Rendering Architecture for 3D, Precision Insight, Inc.
  2. Direct Rendering Infrastructure, Low-Level Design Document, Precision Insight, Inc.
  3. The Direct Rendering Manager: Kernel Support for the Direct Rendering Infrastructure Precision Insight, Inc.
  4. Hardware Locking for the Direct Rendering Infrastructure Precision Insight, Inc.
  5. A Security Analysis of the Direct Rendering Infrastructure Precision Insight, Inc.
  6. DRI Extension for supporting Direct Rendering Protocol Specification Precision Insight, Inc.
  7. DRI Home Page
  8. DRI User Guide Precision Insight, Inc.
  9. DRI Compilation Guide Precision Insight, Inc.

你可能感兴趣的:(GPU)