本文待整理!!!
问:Xserver使用的是Framebuffer吗?
答:Xserver有多种实现,如Xfree86、Xorg等,Xfree86默认不采用Framebuffer;而对于Xorg,可以根据xorg.conf里的配置判断
如
-Section "Device"
- Identifier "Configured Video Device"
- Driver "fbdev"
-EndSection
其中的fbdev表示使用Framebuffer画图,需要内核的支持(2.2以上内核)和相应的framebuffer驱动, framebuffer驱动与硬件相关,可由显卡硬件厂商提供(如vpmfbDrv.ko),也可用xorg提供的通用的FB驱动:xserver-xorg-video-fbdev,它是基于内核里的fbdevhw(fbdevhw - os-specific submodule for framebuffer device access,将显卡的硬件相关操作已经封装了,它也可以被其他的video drivers使用)
http://liyanrui.is-programmer.com/2009/2/8/glx-notes.7061.html
直接渲染、本地渲染:
相关好文章记录:
http://lp007819.wordpress.com/2010/11/19/%E5%85%B3%E4%BA%8Eglx-direct%E5%92%8Cindirect-rendering/ 是否支持3D图形和direct ,indirect rendering 没有任何关系。事实上它与3D硬件加速也没有关系。 有图 这里的硬件加速应该是2d的情况,对于3d的情况,必须是直接渲染才行!(个人猜想)
http://liyanrui.is-programmer.com/2009/2/8/glx-notes.7061.html
GLX 与显卡驱动
为了取得广泛的平台支持,OpenGL 是不依赖任何窗口系统的,但是我们使用 OpenGL 绘制的三维场景却需要嵌入在某种窗口程序中才可以为人所见。似乎也是约好了的,目前主流的窗口系统(X Window, MS Windows, Mac OS)只是提供了完善的二维图形交互环境,而将复杂的三维图形渲染任务交给 OpenGL (MS Windows 更热衷于用 Direct3D 来取代 OpenGL)。当 OpenGL 与窗口系统们达成了相互依存的默契之后,便出现了用于衔接 OpenGL 与窗口系统的扩展库,这些扩展库的主要目标就是实现 OpenGL 图形与对应窗口画面之间的转换。GLX 库解决了 X Window 中的 OpenGL 图形渲染问题。同样的,WGL 和 AGL 库分别解决了 MS Windows 和 Mac OS 窗口系统中的 OpenGL 图形渲染问题。
GLX 像胶水一样,建立了 X Window、OpenGL 以及 3D 硬件加速驱动之间的联系。在 Linux 中,如果未有安装相应的支持 3D 加速的显卡驱动,那么 GLX 可以调用 Mesa (Unix-like 系统中应用最为广泛的 OpenGL 实现) 的 3D 软件加速来取得 X Window 与 OpenGL 的集成;当然,这种做法所实现的 3D 渲染效率就要大打折扣,并且也会累的 CPU 气喘。多了解一下 X Window 是如何驱动硬件 3D 加速,可以更加深刻的理解 GLX 的工作机理。不过,目前这方面的文档实在太少了,下面文字是我个人的一些猜测,未必正确。
目前,Nvidia 和 ATI 这两大主流显卡均面向 Linux 提供了驱动程序,但是它们的做法不相同。Nvidia 驱动提供了自己的 GLX 库,在安装驱动时,会替换掉 X Window 的标准 GLX 库,另外也会将 Mesa 提供的并且只具备 3D 软件加速支持的 libGL 库替换为自己的 libGL 库。Nvidia 驱动还会提供一个 Linux 内核模块,这样可以让 X Window 通过内核访问显卡的帧缓冲区。与 Nvidia 驱动相比, ATI 则显得比较规范(此处不论其驱动的质量优劣),它利用 DRI + Mesa 来实现 3D 硬件加速,而不是像 Nvidia 驱动那样,什么都是自己去实现。最近,ATI 的开源 3D 加速驱动也渐渐浮出水面,以后买显卡,得多考证考证 ATI 了。
直接渲染与间接渲染
GLX 所支持的 OpenGL 三维图形渲染分为直接渲染与间接渲染,其区别如下图所示:
这里,勿将直接渲染与“硬件加速”的概念混淆了。无论是直接渲染还是间接渲染,都可以利用硬件加速,当然前提是显卡驱动要提供硬件加速支持。同样,也不要将间接渲染与“软件加速”的概念混淆。直接渲染,可以简单理解为本地渲染,即在同一台机器上的 X Client/Server 环境中实现三维图形渲染;相应地,间接渲染可以理解为远程渲染,也就是在网络环境中实现三维图形硬件加速渲染。
http://wiki.linuxquestions.org/wiki/Framebuffer
A framebuffer is a block of memory that holds one frame (one whole display or picture) of pixel data.
In the Linux kernel, there is a framebuffer device available. This device provides a hardware independent API for graphics devices. Applications see a framebuffer and can manipulate it though this API. It is accessed through a special device, normally /dev/fb* (e.g. /dev/fb0). It behaves much like othermemory devices in linux, in that you can also read and write it with normal tools. For example copying the framebuffer to a file (effectively making a raw screenshot) can be done with:
cat /dev/fb0 > somefile
The main application of this in the Linux kernel is allowing the Tux logo at boot and a high resolution text console (a "Framebuffer console" -- the module for this is called fbcon). It's also for use on