surfaceflinger類圖

frameworks/base/libs/ui 和 frameworks/base/libs/surfaceflinger

ISurface 定義了基礎的Surface接口,供圖形系統客戶端 (應用)和server端(即surfaceflinger)交互。ISurface.cpp

BpSurface是ISurface的派生類,提供接口供server 調用客戶端功能;ISurface.cpp

BnSurface是ISurface的另一個派生類,提供接口供客戶端調用server功能。當 server 收到來自客戶端 (通過BnSurace)的調用請求後,如registerBuffers, postBuffer等,BnSurface::onTransact被觸發。ISurface.h

Surface (LayerBaseClient的私有類)是BnSurface的派生類。layerBase.h


SurfaceBuffer (SurfaceBuffer的私有類)是Surface的派生類。layerBuffer.h

ISurfaceComposer 定義了基礎的接口,供客戶端和server端交互。ISurfaceComposer.h

BpSurfaceComposer是一個派生類,提供接口供server調用客戶端功能;ISurfaceComposer.cpp

BnSurfaceComposer是另一派生類,提供接口供客戶端調用server功能。類 SurfaceFlinger 由BnSurfaceComposer派生而來。ISurfaceComposer.h

SurfaceComposerClient直接供客戶端使用,調用ISurface (BnSurface)和 ISurfaceComposer (BnSurfaceComposer)以及 ISurfaceFlingerClient 接口,與server交互。SurfaceComposerClient.h

BClient 派生自ISurfaceFlingerClient (BnSurfaceFlingerClient),調用server的createSurface,真正創建一個surface。每個surface對應一個layer.surfaceflinger.h

egl_native_window_t 定義了一個本地window類 。這個類提供了對本地window 的所有描述以及用於egl (opengl 與本地圖形系統的接口)操作本地windwo的所有方法。eglnatives.h

EGLNativeSurface是egl_native_window_t的一個派生類。EGLNativeSurface.h

EGLDisplaySurface是EGLNativeSurface的派生類。 EGLDisplaySurface 是一個非常重要的類,在這個類裏,真正打開framebuffer設備(/dev/graphics/fb0 或者/dev/fb0),並將這個設備封裝成EGLDisplaySurface的形式供server使用。函數mapFrameBuffer打開framebuffer, 創建兩個緩衝區,(一個是on screen front 緩衝區, 另一個back buffer, 可能位於offscreen framebuffer,也可能位於系統內存)。 函數swapBuffers將back buffer內容拷貝到front buffer中。

DisplayHardware 類中初始化了egl系統,併爲本地窗口對象EGLDisplaySurface 創建了對應的EGLSurface 對象。surfaceflinger 使用DisplayHardware去和本地窗口打交道。














研究一個surface如何創建的關鍵路徑如下:

1. frameworks/base/core/java/android/view/Surface.java — Surface::Surface ()。

2. frameworks/base/core/jni/android_view_Surface.cpp — Surface_init ()。

在這個函數中SurfaceComposerClient 對象被創建。

3. frameworks/base/libs/ui/SurfaceComposerClient.cpp — SurfaceComposerClient::SurfaceComposerClient ().

這個函數非常重要,在這裏建立了client和server之間的橋樑。通過函數_get_surface_manager()獲得了一個指向 server的IBinder 對象(具有ISurfaceComposer接口),之後通過這個IBinder就可以跨進程訪問Server的功能。接着調用 ISurfaceComposer::createConnection()創建並返回了一個ISurfaceFlingerClient的 IBinder。

4. frameworks/base/libs/ui/SurfaceComposerClient.cpp — SurfaceComposerClient::createSurface().

這個函數中,利用前面獲得的ISurfaceFlingerClient的IBinder,調用其createSurface接口。

5.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp — BClient::createSurface ()。

BClient由ISurfaceFlingerClient派生而來。

    6.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp — SurfaceFlinger:: createSurface()。

這個函數爲Surface創建一個對應的Layer。

上述關鍵路徑中,1,2,3,4運行於client進程中,而5,6運行與server進程中。server作爲一個service提供給client訪問。
與圖形相關的代碼分析

與圖形相關的代碼主要位於下列目錄:

1. frameworks/base/graphics/java/android/graphics

2.frameworks/base/core/java/android/view

3.frameworks/base/core/java/android/widget

4.frameworks/base/opengl/

5.frameworks/base/libs/ui

6.frameworks/base/libs/surfaceflinger

7.frameworks/base/core/jni/android/graphics

8.frameworks/base/core/jni/android/opengl

9.frameworks/base/core/jni/android/android_view_*.cpp

10.external/skia
android.graphics, android.view和android.widget

1.frameworks/base/graphics/java/android/graphics

2.frameworks/base/core/java/android/view

3.frameworks/base/core/java/android/widget

android.graphics, android.view和android.widget功能和其他類似的圖形庫如 Qt/Gtk+差不多,分別提供基本的圖形原語(如畫點畫線,設置圖形上下文等),事件機制,以及開發圖形用戶界面的控件等。canvas 用於開發2D圖形, Surface 代表一個可供圖形系統繪製的surface。可在其上繪製2D活3D圖形。
frameworks/base/opengl/

這個目錄包含opengel的接口以及軟件實現。在

http://developer.android.com/guide/topics/graphics/opengl.html

有詳細介紹如何使用android.opengl開發3d graphics。
external/skia

skia與cairo功能相當,封裝底 層的圖形硬件,爲上面的圖形庫提供最基礎的操作圖形硬件的原語。關於 skia 可參考《淺談 Google Skia 圖形處理引擎》2和 《Android 的圖形引擎 Skia》3兩篇文章。
frameworks/base/libs/ui 和 frameworks/base/libs/surfaceflinger

ISurface 定義了基礎的Surface接口,供圖形系統客戶端 (應用)和server端(即surfaceflinger)交互。

BpSurface是ISurface的派生類,提供接口供server 調用客戶端功能;

BnSurface是ISurface的另一個派生類,提供接口供客戶端調用server功能。當 server 收到來自客戶端 (通過BnSurace)的調用請求後,如registerBuffers, postBuffer等,BnSurface::onTransact被觸發。

Surface (LayerBaseClient的私有類)是BnSurface的派生類。

SurfaceBuffer (SurfaceBuffer的私有類)是Surface的派生類。

ISurfaceComposer 定義了基礎的接口,供客戶端和server端交互。

BpSurfaceComposer是一個派生類,提供接口供server調用客戶端功能;

BnSurfaceComposer是另一派生類,提供接口供客戶端調用server功能。類 SurfaceFlinger 由BnSurfaceComposer派生而來。

SurfaceComposerClient直接供客戶端使用,調用ISurface (BnSurface)和 ISurfaceComposer (BnSurfaceComposer)以及 ISurfaceFlingerClient 接口,與server交互。

BClient 派生自ISurfaceFlingerClient (BnSurfaceFlingerClient),調用server的createSurface,真正創建一個surface。每個surface對應一個layer.

egl_native_window_t 定義了一個本地window類 。這個類提供了對本地window 的所有描述以及用於egl (opengl 與本地圖形系統的接口)操作本地windwo的所有方法。

EGLNativeSurface是egl_native_window_t的一個派生類。

EGLDisplaySurface是EGLNativeSurface的派生類。 EGLDisplaySurface 是一個非常重要的類,在這個類裏,真正打開framebuffer設備(/dev/graphics/fb0 或者/dev/fb0),並將這個設備封裝成EGLDisplaySurface的形式供server使用。函數mapFrameBuffer打開framebuffer, 創建兩個緩衝區,(一個是on screen front 緩衝區, 另一個back buffer, 可能位於offscreen framebuffer,也可能位於系統內存)。 函數swapBuffers將back buffer內容拷貝到front buffer中。

DisplayHardware 類中初始化了egl系統,併爲本地窗口對象EGLDisplaySurface 創建了對應的EGLSurface 對象。surfaceflinger 使用DisplayHardware去和本地窗口打交道。
jni

7.frameworks/base/core/jni/android/graphics

8.frameworks/base/core/jni/android/opengl

9.frameworks/base/core/jni/android/android_view_*.cpp

這些目錄下的代碼在Java層的graphics 組件和native (c++)組件之間銜接,將java層的功能調用轉換到對應的本地調用。

hardware/libhardware實現了HAL(Hardware Abstraction Layer)層,copybit device是其中一個模塊。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章