目录
Android 中 对display 操作时, 从APP, DisplayManagerService, SurfaceFlinger到HWC通信都需要用到display id, 但是, 实际上,每个模块的display id 并不一致, 他们之间有一定的对应关系。 本文梳理各模块间display id对应关系。
四个基本ID
- DisplayID: DisplayManagerService用于管理display 使用的id, 也是app 能够通过Display.getDisplayId() 得到的ID. 该ID 是按display 加载的顺序确定的, 每加载一个display, id依次增一。 代码:rameworks/base/services/core/java/com/android/server/display/DisplayManagerService.java中assignDisplayIdLocked.
- PhysicalDisplayID: SurfaceFlinger 中管理display 使用的ID, DisplayManagerService与SurfaceFlinger通信借助该ID. surfaceflinger中根据 mPhysicalDisplayId 找到HWC::Display, 通过HWC::Display中的mid 与hwc 通信, 其中的mId 为HWC给出, 即为下面的client_id.
- client_id: HWC中定义的ID, 会传递给SurfaceFlinger, 与SurfaceFlinger 通信使用该ID. HWC按照可支持的display 数量和类型的定义:hardware/qcom/display/sdm/libs/hwc2/hwc_session.cpp中HWCSession::InitSupportedDisplaySlots看map_info.client_id赋值。 client_id 与 surfaceflinger 中HWC::Display中的mId 相同。 hwc_session中根据该client_id通过hwc_display_[client_id]找到相应的 HWCDisplay, 该HWCDisplay中记录了sdm_id, 对应底层的display id.
- sdm_id: display driver传递给HWC的ID.如下log显示display的smd_id:
06-01 06:00:55.319 413 1236 I SDM : HWCSession::HandlePluggableDisplays: Handling hotplug... display_info.sdm_id = 3001, info.display_type= 0 06-01 06:00:55.319 413 1236 I SDM : HWCSession::HandlePluggableDisplays: Handling hotplug... display_info.sdm_id = 3002, info.display_type= 1 06-01 06:00:55.319 413 1236 I SDM : HWCSession::HandlePluggableDisplays: Handling hotplug... display_info.sdm_id = 3003, info.display_type= 1 06-01 06:00:55.320 413 1236 I SDM : HWCSession::HandlePluggableDisplays: Handling hotplug... display_info.sdm_id = 3004, info.display_type= 1