HWC 简介
HWC这个东西, 之前也是比较困扰我理解的东西, 一直想问个明白, 这东西是个啥, 具体有啥作用。

surfaceflinger_bufferqueue.png
看图扯淡下
hwc 设备, 可以想象成一个物理混合器, SF把多个Surface输出给hwc, hwc按照Surface的属性, 把多个Surface混合成一个Surface, 最后输出到Display.

hwc.png
代码层可以分为两部分去看:
1: HWComposer 先从VSync的角度看, 这是SF与hwc交互的一个桥梁。
2: hwc_composer_device_1 物理设备与上层交互的接口。
VSync初始化流程
之前看代码的时候一直不是太喜欢看整个初始化流程, 只喜欢看关键调用流程, 这样看问题的话, 不容易理解的全面。 想了解VSync的整个运作流程, 其实看完初始化的流程再看VSync的响应流程, 就特别清晰明了。

vsync.png
关键看图中的红线
SF初始化的时候, 先创建 HWComposer。
HWComposer是一个桥梁的作用, 具体由cb_context进行连接。
mCBContext->hwc = this;
mCBContext->procs.invalidate = &hook_invalidate;
mCBContext->procs.vsync = &hook_vsync;
if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1))
mCBContext->procs.hotplug = &hook_hotplug;
else
mCBContext->procs.hotplug = NULL;
memset(mCBContext->procs.zero, 0, sizeof(mCBContext->procs.zero));
mHwc->registerProcs(mHwc, &mCBContext->procs);
代码逻辑其实就是红线部分, 把回调接口连接上。
VSync响应流程
流程就是蓝色线条。
硬件产生信号, 最后传到SF。