转载请注明:From LXS. http://blog.csdn.net/uiop78uiop78/
GUI系统之SurfaceFlinger章节目录:
blog.csdn.net/uiop78uiop78/article/details/8954508
1.1.1 handleRepaint
经过handleTransaction和handlePageFlip等步骤的准备工作后,现在可以合成各图层数据了。
void SurfaceFlinger::handleRepaint()
{…
mSwapRegion.orSelf(mDirtyRegion);
const DisplayHardware&hw(graphicPlane(0).displayHardware());
…
uint32_t flags =hw.getFlags();//系统支持的渲染方式
if (flags &DisplayHardware::SWAP_RECTANGLE) {
mDirtyRegion.set(mSwapRegion.bounds());
} else {
if (flags & DisplayHardware::PARTIAL_UPDATES) {
mDirtyRegion.set(mSwapRegion.bounds());
} else {
mDirtyRegion.set(hw.bounds());
mSwapRegion =mDirtyRegion;
}
}
setupHardwareComposer();
composeSurfaces(mDirtyRegion);//合成各图层数据
mSwapRegion.orSelf(mDirtyRegion);
mDirtyRegion.clear();
}
系统支持多种类型的渲染方式,可以从DisplayHardware获取到:
l SWAP_RECTANGLE
我们只需要渲染“脏”区域,或者说系统在软件层面上支持部分区域更新,但更新区域必须是长方形规则的。由于这个限制,mDirtyRegion应该是覆盖所有“脏”区域的最小矩形
l PARTIAL_UPDATES
系统支持硬件层面部分区域更新,同样也需要是矩形区域
l 其它
其它情况下,我们需要重绘整个屏幕,即hw.bounds()
接着setupHardwareComposer()对所有mVisibleLayersSortedByZ中的layers进行数据初始化,比如合成类型(compositionType)。包括HWC_FRAMEBUFFER和HWC_OVERLAY两种。如果是前者的话,那么图层合成将由SurfaceFlinger通过OpenGL ES来完成;否则就由一种叫overlay的硬件来执行。Overlay通常被用于处理视频回放和录制时的预览,这种硬件合成可以加快处理,减小CPU的负担。不过从Android 4.0开始,源码中关于Overlay部分的实现被移除了。
HWComposer内部维持着一个各layer属性的list:
hwc_layer_list_t* mList;
这个结构体定义如下:
typedef struct hwc_layer_list {
uint32_t flags;//各标志
size_tnumHwLayers;//图层数量
hwc_layer_t hwLayers[0];//各图层属性详细描述
} hwc_layer_list_t;
当SurfaceFlinger进行handleWorkList时,它根据当前可见图层的数量调用HWComposer::createWorkList(size_tnumLayers)