八、绘制
ViewRootImpl.performDraw
先看CPU绘制:
1 | java复制代码ViewRootImpl.mTraversalRunnable.run() |
Surface.connect–>BBQBufferQueueProducer.connect
- 重点是注册生产者回调
1 | c++复制代码status_t Surface::lock(ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds); |
- Surface继承 ANativeWindow
- ANativeWindow 图形库的各种函数
- ANativeWindow_Buffer ANativeWindow_Buffer.bits 存储图形buffer的地址
- 用于 Surface::lock 的参数,用于图形库。
- GraphicBuffer 继承 ANativeWindowBuffer
- 封装图形内存分配接口 GraphicBufferMapper GraphicBufferAllocator ,以及进程间传递的序列化接口
- ANativeWindowBuffer
- typedef ANativeWindowBuffer ANativeWindowBuffer_t
- typedef ANativeWindowBuffer_t android_native_buffer_t;
- 内部有个成员 native_handle_t* handle; 存储buffer的fd
Surface.dequeueBuffer–>BufferQueueProducer.dequeueBuffer
BBQBufferQueueProducer 没有重载 BufferQueueProducer.dequeueBuffer
直接调用父类 BufferQueueProducer.dequeueBuffer
1 | c++复制代码status_t Surface::lock(ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds); |
Surface.queueBuffer
1 | c++复制代码// 前置流程: |
BufferQueueConsumer::acquireBuffer
1 | c++复制代码BLASTBufferQueue::onFrameAvailable(const BufferItem& item) |
九、SurfaceFlinger 合成— Android 13 (Android T)
相对于Android 12,Android13在架构上做了微调
SurfaceFlinger::onMessageInvalidate 对应于 SurfaceFlinger::commit,但是结构上做了大量的调整
一些函数像 handleMessageTransaction、handleTransaction、handleMessageInvalidate、handlePageFlip 这些都不见了
SurfaceFlinger::onMessageRefresh 对应于 SurfaceFlinger::composite
然后Android13 还做了GPU合成的优化
- 对GPU合成进行预测,如果有GPU合成,那么 chooseCompositionStrategy 和 GPU合成 并行执行。用以节约时间。
SurfaceComposerClient::Transaction::apply–>SurfaceFlinger::setTransactionState
- 事务入队。加入到队列 SurfaceFlinger.mTransactionQueue
1 | c++复制代码// frameworks/native/libs/gui/SurfaceComposerClient.cpp |
MessageQueue::scheduleFrame() — 请求vsync
1 | c++复制代码MessageQueue::scheduleFrame() |
sf-vsync事件分发流程
- Android 13 把用了好多年的 onMessageInvalidate()、onMessageRefresh 体系给改了
- 变成了 SurfaceFlinger::commit 和 SurfaceFlinger::composite ,中间不post消息了,直接无缝切换
1 | c++复制代码// frameworks/native/services/surfaceflinger/Scheduler/MessageQueue.cpp |
SurfaceFlinger::commit 流程
1 | c++复制代码// frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp |
latchBuffers()
- 因为使用 BufferStateLayer + BBQ , latchBuffer 流程相比Android12以前逻辑要少很多
1 | c++复制代码// SurfaceFlinger.mLayersWithQueuedFrames 存储有新buffer的layer |
SurfaceFlinger::composite
1 | c++复制代码SurfaceFlinger::composite(nsecs_t frameTime, int64_t vsyncId) |
Output::prepareFrame()
- 所谓 Client 合成,就是 HWC 的客户端 SurfaceFlinger 去合成,SurfaceFlinger 合成的话使用GPU合成,因此 Client 合成,即GPU合成
- prepareFrame 核心逻辑是确认使用 客户端合成 还是 使用硬件合成
- prepareFrame 函数中同 HWC服务 交互去确认是否有客户端合成,如果没有客户端合成,并可以忽略验证,那么会直接显示。流程到这里基本结束了
1 | c++复制代码CompositionEngine::present(CompositionRefreshArgs& args) |
Output::finishFrame
- 处理Client合成(GPU合成)
1 | c++复制代码Output::present(const compositionengine::CompositionRefreshArgs& refreshArgs) |
Output::postFramebuffer()
- 送显 + 获取 Layer releaseFence
- 这个 releaseFence 并不是当前送显的fence,是上一帧的
- Layer releaseFence 会合并 GPU合成的fence
- 就是说APP dequeuebuffer拿到新buffer后,需要等待GPU合成完成 + HWC使用当前Layer buffer替换上一个buffer(app dequque的buffer)后,才能在这个新buffer上填充数据
1 | c++复制代码//先看下结构体 FrameFences |
再回到APP进程端 releaseBuffer
1 | c++复制代码|-->SurfaceFlinger::postComposition() |
后记:
对于 Android 13 的 SurfaceFlinger 而言,参考资料真的是非常有限。
从 Android PAndroid Q小更新,Android QAndroid R 大的架构更新,
Android R~Android S 机制上的更新(BBQ+BufferStateLayer),Android S ~ Android T 又是大的架构更新,
Google还不断使用最新的c++标准去重构代码,从c11又更新到c20。更新的XX都不认识了。
最后导致能参考的资料基本失效了,只能一个个变量去查,并且都没类注释,要命的工作量啊。
最后不感谢CCTV,感谢 cs.android.com 吧,多亏了这个源码网站强大的检索能力。