app向surfaceflinger提交事务之后,surfaceflinger会缓存事务;当vsync到来之后,会执行SurfaceFlinger::onMessageInvalidate
进行处理。
onMessageInvalidate的主要功能:
-
处理事务
-
刷新图像
void SurfaceFlinger::onMessageInvalidate(int64_t vsyncId, nsecs_t expectedVSyncTime) {
... ...
refreshNeeded = handleMessageTransaction();
refreshNeeded |= handleMessageInvalidate();
... ...
onMessageRefresh();
}
事务处理
handleMessageTransaction主要功能是处理事务:
大致流程如下图:
flushTransactionQueues会将app提交的事务一个一个取出来,并把surface对应的layer放入mCurrentState.layersSortedByZ
,并根据transaction信息设置layer属性。
handleTransaction会将mCurrentState
的内容copy到mDrawingState
。
图像合成并刷新
这个流程有点长,贴代码有点太繁琐,来张图
个人这里有几个比较有意思的地方:
-
ensureOutputLayer中hwc layer的创建,不是所有layer都会创建对应的hwc layer。
-
将layer的属性写入hwc layer。
-
gpu合成后mRenderSurface->queueBuffer;最终会调用mHwc.setClientTarget,将合成后的buffer写到hwc,作为hwc的一层。
-
postFramebuffer中调用presentAndGetFrameFences,实际会调用到Display::presentAndGetFrameFences。因为图中的Output实际上全是Display,Display继承Output。