众所周知,Mobile Linux上的3D APP是基于OpenGL,或者OpenGL ES,后者是前者面向嵌入式设备的一个简化版本。目前基于是OpenGL/ES上的一个图形封装类库Clutter也渐渐为人们所熟知。这些都是众所周知的废话,下面想探讨的是基于OPENGL/ES等 3D APP与Linux原来的面向2D的X Server是什么关系?
当然不是吃饱了撑着平白无故想这个问题,对这个问题的疑惑来自于Moblin平台上的Clutter Destop上一个GTK程序调用gtk_widget_show时的CoreDump问题,该GTK程序在Gnome Destop下运行正常。于是想,是不是3D的UI仍然依赖于XServer?
想深一层:Linux原有的XServer系统会接管屏幕的各种输入事件,例如,键盘、鼠标、触摸屏,其配置放在Xorg.conf中。这一点从Xerver的原理图及维基百科上对Xserver的描述可以了解到。an X server communicates with various client programs. The server accepts requests for graphical output (windows) and sends back user input (from keyboard, mouse, or touchscreen). 如果3D的应用不挂在XServer上,用户的输入事件如何到达应用?
在网上查找资料的时候发现了台湾黄敬群大牛的讲解的PPT《支援硬体加速的OPENGL/ES实做》,该大牛不愧为敬业乐群的好名字,技术精湛,乐于分享,读后深有启发。
GLX (OpenGL Extension to the X Window System)为X Windows System提供Open GL的扩展。因此3D的APP不是抛离X Server,而是与之共存。下图是敬群大牛PPT中GLX的图。
GLX包含了下面的内容:
1、X Window System application中的OpenGL API扩展
2、X 协议的扩展, 上图中的除了原有的Xpackets,新扩展一种GLX Packets。使客户端(the OpenGL application)发送 3D 渲染命令给 X server (the software responsible for the display)。 我的理解是,原有的X 协议不变基础上添加新的GLX扩展,因此,原有的用户事件输入处理流程是不变的。
3、X server的功能扩展,使之可以接收渲染命令。 (如果无硬件加速的OpenGL类库则使用 Mesa 类库)。
如果X Window System application和X server运行在同一台机器上,并且3D加速的图形卡及驱动能够支持,可以使用DRI(Direct Rendering Infrastructure)直接访问图形硬件设备。
直接的3D图形渲染和间接的3D图形渲染。如下图所示: