使用3d合成,需要大面積的像素混合計算和大量的記憶體傳輸(gpu讀寫graphicbuffer所需),對gpu和ddr來說是一個巨大的負擔。在gpu/ddr重度使用的場景(比如玩遊戲),會造成發熱、卡頓等。
為了提升性能,減少功耗,可以将合成這個過程交由另一個晶片完成,減輕gpu負擔。進一步,直接讓這個晶片連lcd,在lcd需要顯示某一行時線上合成。
hwcomposer便是這一個/多個專用合成晶片的驅動hal層。
驅動由內建晶片系統的廠商自行設計,但需要遵循一定的标準,這個标準就是android規定的hwcomposer接口。
hwcomposer的接口定義位于此檔案:
hardware/libhardware/include/hardware/hwcomposer.h
其中部分宏定義在:
hardware/libhardware/include/hardware/hwcomposer_defs.h
在surfaceflinger中,layer對應于window表示一個buffer循環體系,對hwcomposer而言,layer僅指代目前buffer,也即surfaceflinger中的layer的目前幀。
這裡面最難了解和最易出錯的是 sourcecrop、displayframe和visibleregion,在處理soc上的顯示問題時,這往往是首先考慮的因素:

如圖所示,該layer的顯示區域部分被l2完全擋住,source crop 為該layer參與合成的範圍,display frame 為該layer合成的目标區域,visibleregion為該layer被擋住後,剩餘的可見區域集。
看完了這個結構體,上一篇
<a href="http://blog.csdn.net/jxt1234and2010/article/details/46057267">http://blog.csdn.net/jxt1234and2010/article/details/46057267</a>
所提到的adb shell dumpsys surfaceflinger 所得到的表格,各參數表示什麼意思自然一下就清楚了。
實體顯示屏表示連接配接實際的顯示儀器如lcd,目的是産生顯示效果,可以使用線上合成。
虛拟顯示屏表示目的是合成一個buffer,不需要理會這個buffer後續如何産生顯示效果,這時需要把所有圖層合成到指定的buffer上。這種情況下必須離線合成。典型場景是手機連wfd/hdmi,手機合成好的buffer通過wifi/hdmi傳輸到電視上顯示。
最後是device的函數指針定義