VSync传递之 HWC -> SF

HWC 简介

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

surfaceflinger_bufferqueue.png

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

hwc.png

代码层可以分为两部分去看:
1: HWComposer 先从VSync的角度看, 这是SFhwc交互的一个桥梁。
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

推荐阅读更多精彩内容