Overlay屏幕不对应实际的物理屏幕设备,即不存在与之对应的framebuffer设备;其实现思路是在实际屏幕设备的layerstack上创建一个layer,作为虚拟屏幕的显示载体。这个layer申请的显存来源是来自实际屏幕的hwc,而这个layer上的图层是由egl合成的。
标准的显示流程是这样,应用的窗体创建后向surfaceflinger申请到一个layer即surface, 应用的视图使用egl在内存绘制图形,然后在vsync时机将内存图形swap到layer对应的显存中去。每个layer对应的显存都是从窗体所在屏幕hwc分配的。最后surfaceflinger一次性将所有layer合成到屏幕的前缓存中,等待屏幕总线从缓存取走显示,一般是16ms一个周期。
而针对在虚拟屏幕上创建的窗体,不同的地方在申请layer所对应的显存分配方式;虚拟屏幕上窗体layer显存的分配是复用的虚拟屏幕所在的实际屏幕hwc,并且所有窗体对应的layer是通过egl合成为一个layer, 输出到实际屏幕的framebuffer区域做合成的。
当然,对上层应用来说这些都是透明的。
built-in display:
window1 --disp_0--layer1
| - FramebufferSurface - hwc1
window2 --disp_0-- layer2
virtual display:
window1 --disp_0_1-- layer1
| --VirtualDisplaySurface -->FramebufferSurface - hwc1
window2 --disp_0_1--layer2