GUI系統之SurfaceFlinger(1)OpenGLES與EGL

文章都是通過閱讀源碼分析出來的,還在不斷完善與改進中,其中難免有些地方理解得不對,歡迎大家批評指正
轉載請註明:From LXS. http://blog.csdn.net/uiop78uiop78/





第1章  GUI系統之SurfaceFlinger

在進入GUI系統的學習前,建議大家可以先閱讀本書應用篇中的“OpenGLES”章節,並參閱OpenGL ES官方指南。因爲Android的GUI系統是基於OpenGL/EGL來實現的,如果沒有一定基礎的話,分析源碼時有可能會“事倍功半”。

1.1 OpenGLES與EGL

SurfaceFlinger雖然是GUI的核心,但相對於OpenGL ES來講,它其實只是一個“應用”。

對於沒有做過OpenGLES開發的人來講,理解這部分的內容還是有一定難度的,特別是容易對系統中既有EGL/OpenGLES,又有SurfaceFlinger、GraphicPlane、DisplayHardware、Gralloc、FramebufferNativeWindow等一系列陌生的模塊感到混亂而無序。

的確如此,假如不先理清這些模塊的相互關係,對於我們深入研究整個Android顯示系統就是一個很大的障礙。有鑑於此,我們先來從框架的高度審視一下它們之間看似錯綜複雜、剪不斷理還亂的依賴。


圖 11‑1 SurfaceFlinger與OpenGLES等模塊關係

 

我們根據上面這個圖,由底層往上層來逐步分析整個架構:

1. Linux內核提供了統一的framebuffer顯示驅動,設備節點/dev/graphics/fb*或者/dev/fb*,以fb0表示第一個Monitor,當前實現中只用到了一個顯示屏

2. Android的HAL層提供了Gralloc,分爲fb和gralloc兩個設備。前者負責打開內核中的framebuffer、初始化配置,以及提供post、setSwapInterval等操作,後者則管理幀緩衝區的分配和釋放。上層只能通過Gralloc訪問幀緩衝區,這樣一來就實現了有序的封裝保護

3. 由於OpenGL ES是一個通用的函數庫,在不同的平臺系統上需要被“本地化”——即把它與具體平臺上的窗口系統建立起關聯,這樣才能保證它正常工作。從FramebufferNativeWindow這個名稱就能判斷出來,它就是將OpenGL ES在Android平臺上本地化的中介之一。後面我們還會看到應用程序端所使用的另一個“本地窗口”。爲OpengGL ES配置本地窗口的是EGL

4. OpenGL或者OpenGL ES 更多的只是一個接口協議,實現上既可以採用軟件,也能依託於硬件。這一方面給產品開發帶來了靈活性,我們可以根據成本與市場定位來決定具體的硬件設計,從而達到很好的定製需求;另一方面,既然有多種實現的可能,那麼OpenGL ES在運行時是如何取捨的呢?這也是EGL的作用之一。它會去讀取egl.cfg這個配置文件,然後根據用戶的設定來動態加載libagl(軟件實現)或者libhgl(硬件實現)。然後上層纔可以正常使用各種glXXX接口

5. SurfaceFlinger中持有一個GraphicPlane成員變量mGraphicPlanes來描述“顯示屏”;GraphicPlane類中又包含了一個DisplayHardware對象實例(mHw)。具體是在SurfaceFlinger::readyToRun中,完成對它們的創建與初始化。並且DisplayHardware在初始化時還將調用eglInitialize、eglCreateWindowSurface等接口,利用EGL來完成對OpenGLES環境的搭建。其中:

    surface =eglCreateWindowSurface(display, config, mNativeWindow.get(), NULL);

mNativeWindow 就是一個FramebufferNativeWindow對象。DisplayHardware爲OpenGL ES設置了“本地化”所需的窗口

6. 很多模塊都可以調用OpenGLES提供的API(這些接口以“gl”爲前綴,比如glViewport、glClear、glMatrixMode、glLoadIdentity等等),包括SurfaceFlinger、DisplayHardware等

7. 與OpenGL ES相關的模塊,可以分爲如下幾類:

Ø  配置類

即幫助OpenGL ES完成配置的,包括EGL、DisplayHardware都可以認爲是這一類

Ø  依賴類

也就是OpenGL ES要正常運行起來所依賴的“本地化”的東西,上圖中是指FramebufferNativeWindow

Ø  使用類

使用者也可能是配置者,比如DisplayHardware既扮演了“幫助”OpenGL的角色,同時它也是其使用方。另外只要處在與OpenGL ES同一個環境(Context)中的模塊,都可以使用它來完成操作,比如SurfaceFlinger

 

如果是對EGL的作用、工作方式以及它所提供的重要接口等有不明白的,強烈建議大家先閱讀官方文檔以及本書應用篇中的章節,否則會大大影響後面的學習和理解。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章