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
初始化的時候, 先創(chuàng)建 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
。