[教育訓練紀錄] 關於 SurfaceFlinger::createSurface() 的 DisplayID

jollen 發表於 February 4, 2013 8:53 PM

近期為幾家科技廠進行 Android 的企業內訓,課程主題著重於 Framework 層。最近的內訓主題是 Android Graphics 系統。今天 (2/4) 在講解 SurfaceFlinger Server 建立 Surface 時,提到這個方法:

1287 sp<ISurface> SurfaceFlinger::createSurface(
1288         ISurfaceComposerClient::surface_data_t* params,
1289         const String8& name,
1290         const sp<Client>& client,
1291         DisplayID d, uint32_t w, uint32_t h, PixelFormat format,
1292         uint32_t flags)

其中 DisplayID 參數的部份,代表 Screen。這部份可以參照 /system/lib/egl/egl.cfg 設定檔,例如,以下的設定:

0 1 qcom

第一個數字代表 Display,第二個數字代表 Implementation,最後的字串為 TAG,用來與 HGL 程式庫匹配。上述設定指定 Display 設定為 0,代表 Default (LCD),有些 Android 系統可為 1,代表 HDMI。

此外,Display 參數在實例化 Layer 時也會用到:

1303     //LOGD("createSurface for pid %d (%d x %d)", pid, w, h);
1304     sp<Layer> normalLayer;
1305     switch (flags & eFXSurfaceMask) {
1306         case eFXSurfaceNormal:
1307             normalLayer = createNormalSurface(client, d, w, h, flags, format);
1308             layer = normalLayer;
1309             break;
1310         case eFXSurfaceBlur:
1311             // for now we treat Blur as Dim, until we can implement it
1312             // efficiently.
1313         case eFXSurfaceDim:                                                
1314             layer = createDimSurface(client, d, w, h, flags);
1315             break;
1316         case eFXSurfaceScreenshot:
1317             layer = createScreenshotSurface(client, d, w, h, flags);
1318             break;
1319     }

在實例化 Layer 時,可指定 Layer 的 Display。附帶一提,Android 的 Surface 分為四大類,一般 App 使用的是 Normal Surface,其它還有 Blur Surface、Dim Surface 與 Screenshot Surface。Dim Surface 是支援 Android Power Management (Wakelock) 的特殊 Surface。

讀者留言 (0)

留言功能維護中。將於近日重新開放。

連絡作者

Jollen Chen,Moko365(仕橙3G教室)講師,熱愛研究 Linux 與 Android 技術。曾為 Motorola、HTC、Foxconn、LG、OPPO、騰迅、廣達電腦、緯創、仁寶等超過 50 家企業講授課程。目前在 MokoVersity 擔任軟體工程師,撰寫 Node.js 程式,也在幾家科技廠兼任 Android Framework 研發顧問。您可透過電子郵件 <jollen (at) jollen (dot) org> 或這裡與我連絡。