[教育訓練紀錄] 關於 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。

Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue

您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw