Android 4.4.4 双屏研究
双屏实现
综述:
SurfaceFlinger通过控制不同的DisplayDevice来完成对不同屏幕的控制。
图示:
详细描述:
1.前提条件:SurfaceFlinger支持HWComposer多个Display数据。
a) SurfaceFlinger中:
DefaultKeyedVector< wp<IBinder>, sp<DisplayDevice> >mDisplays;
mDisplays 保存多屏的display信息,以及每屏DisplayDevice和display的对应关系
b) HWCompser中:
struct hwc_display_contents_1* mLists[MAX_HWC_DISPLAYS];
mLists来保存多屏的数据,在HWComposer在调用HWC device的时候,会同时传入多屏数据
2.判断逻辑
根据Client在创建SurfaceControl时通过createSurface传入的flag包含 ISurfaceComposerClient::eSubDisplay(添加Flag位标志)来进行标识。
如上图所示,createSurface传入的flag会通过SurfaceFlinger进行createNormalLayer创建Layer。在Layer创建过程中,通过该flag判断,设定layerFlags = layer_state_t::eSubDisplayLayer。
在后续SurfaceFlinger的处理流程中,当进行rebuildLayerStacks()时,通过layerFlags来进行判断并将相应displayType的Layers数据通过setVisibleLayersSortedByZ()函数保存到对应的DisplayDevice中。
3.HWComposer数据流程
在rebuildLayerStacks()之后,进行setUpHWComposer()中,对不同DisplayType的Display数据信息,添加到HWComposer的mList中。在后续SurfaceFlinger调用hwc.prepare()时准备不同display的数据,并在hwc.commit()中,提交到HWC模块去进行显示处理。
(以上提到具体流程请参考SurfaceComposerClient时序.jpg,在特定处理中通过flag判断来管理Layers和DisplayDevice)