衆所周知,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圖形渲染。如下圖所示: