Android圖形顯示系統之HWC


引用:https://www.jianshu.com/p/944d2fb9cead 

HWC是Android中進行窗口layer合成和顯示的HAL層模塊。HWC通常由顯示設備制造商(OEM)完成,為SF服務提供硬件支持。

重要筆記:

1.surfaceflinger向HWC提供所有layer的完整列表,讓HWC根據其硬件能力,決定如何處理這些layer。

2.HWC會為每個layer標注合成方式,是通過GPU合成還是通過HWC合成。

3.SurfaceFlinger負責把所有標注GPU合成的layer合成到一個輸出buffer(可以使用OpenGL ES合成layer),然后把這個輸出buffer和其他標注HWC合成的layer一起交給HWC,讓HWC完成剩余layer的合成和顯示。

 

HWC layer的合成方式:

// 顯示屏類型 enum class DisplayType : int32_t { Invalid = HWC2_DISPLAY_TYPE_INVALID, // 物理顯示屏,顯示設備有一個主屏幕,然后可以通過熱插拔添加或者刪除外接顯示屏 Physical = HWC2_DISPLAY_TYPE_PHYSICAL, // 虛擬顯示屏,內容會渲染到離屏緩沖區,Android錄屏功能就是基於虛擬屏實現的 Virtual = HWC2_DISPLAY_TYPE_VIRTUAL, }; // Layer合成類型,HWC2_COMPOSITION_XX取自hwc2_composition_t枚舉 enum class Composition : int32_t { Invalid = HWC2_COMPOSITION_INVALID, Client = HWC2_COMPOSITION_CLIENT, Device = HWC2_COMPOSITION_DEVICE, SolidColor = HWC2_COMPOSITION_SOLID_COLOR, Cursor = HWC2_COMPOSITION_CURSOR, Sideband = HWC2_COMPOSITION_SIDEBAND, };

1.Client:這里的client是相對於HWC硬件設備來說的,即不通過HWC來合成圖層,而是通過GPU先把所有的這類圖層合成到client target buffer(一個離屏的圖形緩沖區,buffer_handle_t表示這塊顯存的指針,顯存有Gralloc模塊分配),
然后再通過Display::setClientTarget把這塊圖形buffer的地址傳遞給HWC設備,最后由HWC設備把其他layer和這個圖形buffer進一步合成,並最終展示在display上。
2.Device:通過HWC硬件來合成圖層,默認情況下,SurfaceFlinger會配置每個layer都通過Device方式合成,但是HWC設備會根據硬件設備的性能改變某些圖層的合成方式。
3.SolidColor:HWC設備將通過Layer::setColor設置的顏色渲染這個圖層,如果HWC設備不支持這種合成方式,那么會請求SurfaceFlinger改變合成方式為client。
4.Cursor:與Device類似,但是這個圖層的位置可以通過setCursorPosition異步設置。如果HWC設備不支持這種合成方式,那么將會請求SurfaceFlinger改變合成方式為client或者device。
5.Sideband:
HWC硬件會處理該類圖層的合成,以及它的緩沖區更新和內容同步,但是只有擁有HWC2_CAPABILITY_SIDEBAND_STREAM能力的設備才支持這種圖層,若設備不支持,那么將會請求SurfaceFlinger改變合成方式為Client或者Device。
一個layer的合成方式的大致流程如下所示:

 

1.當Vsync信號到來時,SurfaceFlinger被喚醒,處理layer的新建,銷毀和更新,並且為相應layer設置期望的合成方式。

2.所有layer更新后,SurfaceFlinger調用validateDisplay,讓HWC決定每個layer的合成方式。

3.SurfaceFlinger調用getChangedCompositionTypes檢查HWC是否對任何layer的合成方式做出了改變,若是,那么SurfaceFlinger則調整對應layer的合成方式,並且調用acceptDisplayChanges通知HWC。

4.SurfaceFlinger把所有client類型的layer合成到Target圖形緩沖區,然后調用setClientTarget把Target Buffer設置給HWC。(如果沒有Client類型的layer,則可以跳過該方法)

5.最后,SurfaceFlinger調用presentDisplay,讓HWC完成剩余layer的合成,並且在顯示屏上展示最終的合成結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM