aiglx glx fr net

Aiglx学习总结

Aiglx 是Accelerated Indirect GLX的缩写,它的主要功能是为了使基于X的客户应用程序能通过glx(X的一个扩展)完成3D的硬件加速。在一个窗口系统中,有两种方法可以让OpenGL的接口函数访问显卡设备:第一种(也是Aiglx所使用的方法)是通过glx协议把gl的命令传送给X Server,然后X Server会把该命令发送给显卡设备,让其完成相应的显示动作;第二种是让OpenGL函数接口直接给显卡设备发送命令。

由于aiglx使用的是间接访问的方式,因此我们下面就来说一下在aiglx架构下3D应用程序的流程。在说此之前不得不先介绍一下X Window, Mesa和GLX。

X Window 是linux下最流行的窗口系统,它采用客户/服务器模式。所有的资源(屏幕、字体、window、gc等)都由服务器来管理,客户端唯一所能做的就是请求服务器做某些操作,如画一条直线,创建窗口等。对X的客户/服务器模式的理解,可能大家都会有些迷惑,需要指出的是X的客户/服务器模式与网页的客户服务器模式有所不同,一般网页的显示会通过网页服务器(如apache)的解析,然后把内容发给客户机显示,然而,X的显示是在服务器机上进行的,为了更好的理解X的客户/服务器模式我们举个例子:

找两台装有linux的并且网络相联的机子,把其中一台当服务器,另一台当客户机,在服务器上启动X server(通过在终端输入X 或 xinit 或 startx), 然后运行xhost +客户机的ip地址, 然后再在客户机上运行export DISPLAY=服务器ip:0.0,最后在客户机上随便运行一个基于X的程序,你会发现它能在X server上显示出来。

X Window 主要分为3部分:客户端、协议和服务器。所有基于X的程序都可以看成是一个客户端,该程序可以看成是命令集,这些命令通过协议发送到服务器,服务器根据协议定义的格式解析这些命令,然后按照命令去执行相应的操作。

由于X Core已经远远不能满足需求,所以需要通过扩展来完成一些特殊的功能,如GLX就是X Window的一个扩展,它的主要功能是将OpenGL和X Window有效的结合在一起,OpenGL 的接口函数可以通过GLX协议发送到X Server,X Server再解析执行。

Mesa 是OpenGL标准的一种实现,OpenGL标准接口的实现是相当复杂的,我们就不去讨论具体函数的实现了。但是我们应该知道,Mesa用软件实现了OpenGL标准接口,并且还可以使用硬件加速实现OpenGL标准接口(通过调用3D驱动实现,按我的理解,3D驱动是DRI的一部分)。 GLX的Server会调用Mesa 来满足Client的请求。

GLX是X Window中OpenGL的扩展,它的主要功能是为X窗口系统实现3D效果,当然,3D效果的真正实现并不是由GLX来实现的,而是由MESA实现的,GLX就是为X Window和MESA起到了桥梁的作用。

总上所述,Aiglx就是一种X窗口系统上实现3D特效的架构,它采用扩展的方式使用最小的改动来实现具有硬件加速的3D效果,它的结构图如下:

aiglx glx fr net_第1张图片


GLX是X Window的一个扩展,按我的理解,它是专门为X Window实现3D渲染而开发的一个扩展。X Window没有开发自己的3D渲染的实现,而是使用了Mesa(不准确的说是OpenGL的一种实现),为了实现X Window 与OpenGL的结合,制定了GLX标准。GLX的实现主要有两个版本,一个是基于Xorg的,一个是基于XFree86的,两者差别不大,下面我们讨论的都是基于XFree86的实现。

 

一、X Window与OpengGL的结合的思路

    X Window 走的是2D的Path,而OpenGL走的是3D的path,那么两者怎么样才能有效地结合在一起,使原本走2D path的X Window具有3D的效果呢?X Window采用的方法就是由它自己创建Drawable,然后把Drawable交给OpenGL来渲染,再由OpenGL将渲染结果显示到屏幕上,从而使X Window具有3D的效果。如何把Drawable交给OpenGL就是GLX所要做的工作。

    X提供了两种Drawable: Window(onscreen)和Pixmap(offscreen)。与之对应的GLX也有GLXWindow和GLXPixmap,此外,GLX还有自己特有的位于offscreen上的GLXPbuffer,GLXPbuffer与GLXPixmap不同是它比GLXPixmap创建(在不可见的frame buffer中)更加方便。

    对于X Window和OpengGL及glx的关系图请参阅“Aiglx学习总结”。

 

二、应用程序的一般过程

     应用程序一般先用 XOpenDisplay 打开一个链接,然后通过glXQueryExtension查询是否有Glx扩展,如果不存在就做相应的处理,否则就创建一个窗口,然后通过glXGetFBConfigs得到一个GLXFBConfig,它是主要用来描述颜色缓存和一些辅助缓存的格式、类型和大小的,创建glxWindow和glxContext的时候需要指定一个GLXFBConfig。接着把刚才创建的XWindow和GLXFBConfig传给glXCreateWindow创建一个可以让OpenGL渲染的窗口。同时,通过把刚才创建的GLXFBConfig传给glXCreateNewContext创建一个Render Context。然后通过glXMakeContextCurrent把刚刚创建的Reder Context绑定到刚才创建的GLXWindow上,那么以后的GL操作都将是按照Render Context对GLXWindow的操作。其大概的流程图如下所示:  
aiglx glx fr net_第2张图片

三、GL扩展的实现

    由于在AIGLX中,GL的实现是indirect方式的,即需要通过X Server来实现,所以需要某个扩展来支持GL命令从客户端到服务器的发送,然而我找了很久都没有发现这个扩展,后来才发现原来它是通过GLX扩展来实现GL命令的传送的。

既然GLX是X的一个扩展,那么它就是满足X的扩展机制的,关于X的扩展机制可以参考absurd的X Window研究笔记。一个扩展的实现必须包含三个部分,Client,Protocol和Server,基本上一个函数(需要X Server来实现的函数)就需要在Protocol中定义一个请求的结构,然而对于GL的命令GLX却没有为每个GL函数设立一个Request,而是将所有的GL命令的发送都通过一个Reques即GLXRender请求来发送,只是每个GL命令的内部操作码不同而已。具体的代码可以参考SGI的GLX的实现中的G_render.

你可能感兴趣的:(linux,server,服务器,buffer,扩展,Path)