[教育訓練紀錄] 關於 SurfaceFlinger::createSurface() 的 DisplayID
近期為幾家科技廠進行 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。