Android drm-hwcomposer
生活随笔
收集整理的這篇文章主要介紹了
Android drm-hwcomposer
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
軟件環境:ubuntu20.04 aosp
硬件環境:X86 PC
模擬環境:在host ubuntu20.04啟動支持圖形(by virtio-gpu)的Android虛擬機
1. 介紹
-
HWC 會執行以下計算:
1. SurfaceFlinger 向HWC 提供一個完整的層列表,并詢問“您希望如何處理這些層?”2. Hwc的響應方式是將每個層標記為設備或客戶端合成。3. SurfaceFlinger會處理所有客戶端,將輸出緩沖區傳送到 HWC,并讓HWC 處理其余部分。由于硬件供應商可以定制決策代碼,因此可以在每臺設備上實現最佳性能。
1.1 接口
#Hal接口定義,最新版本2.4 /hardware/interfaces/graphics/composer/ #谷歌定義的hwc接口 hardware/libhardware/include/hardware/hwcomposer.h #API 參考: https://cs.android.com/android/platform/superproject/+/android-11.0.0_r3:hardware/libhardware/include/hardware/hwcomposer2.h;l=1861- API
1.2 實現
Surfaceflinger <----> HWC2 client <----> HWC server <----> Vendor implHWC三類接口: 1. Layer:合成工作 2. Display:與屏幕硬件交互 3. Vsync:Vsync控制以及對SF的回調,通知VSYNC時間-
Cuttlefish實現
每個廠商hwc實現可能不同如nxp,rockchip,drm-hwc,ranchu,也有很多廠商實現是閉源的如nxp,而谷歌的drm-hwc,ranchu是開源的
2. drm_hwcomposer
2. 1 線程
composer進程有1個主線程,幾個HwBinder線程,幾個vndbinder線程,vsync線程 thread #1: name = 'composer@2.4-se' thread #2: name = 'vndbinder:413_1' thread #3: name = 'uevent-listener' thread #4: name = 'HwBinder:413_1' thread #5: name = 'vndbinder:413_2' thread #6: name = 'HwBinder:413_2' thread #7: name = 'composer@2.4-se' thread #8: name = 'vsync' thread #9: name = 'composer@2.4-se' thread #10: name = 'vsync' thread #11: name = 'HwBinder:413_3'2. 2 模塊構成
#啟動配置文件 android.hardware.graphics.composer@2.1-service.rc #main與cmd分解,ComposerCommandEngine.h android.hardware.graphics.composer@2.4-service #binder消息接收libhidlbase.so#cmd分解,ComposerCommandEngine.handroid.hardware.graphics.composer@2.4-service#ComposerResources.cppandroid.hardware.graphics.composer@2.1-resources.so #對gralloc的處理,BsMapper.handroid.hardware.graphics.mapper@4.0.so#mapper實現,如CrosGralloc4Mapper.ccandroid.hardware.graphics.mapper@4.0-impl.minigbm.so#minigbm實現,drv.c/drv_helpers.c如drv_bo_importlibminigbm_gralloc.so#對libdrm的依賴,DRM_IOCTL_PRIME_FD_TO_HANDLElibdrm.so2. 3 初始化
2. 4 SF交互
- Hotplug
-
SurfaceFlinger更新顯示. 以2個display,每個display多個layer為例,介紹畫面更新時SurfaceFlinger與hwc交互.
SF首先讓hwc更新display 0每個layer,然后PRESENT_OR_VALIDATE_DISPLAY,最后PRESENT_DISPLAY; 然后讓hwc更新display 1每個layer,然后PRESENT_OR_VALIDATE_DISPLAY,最后PRESENT_DISPLAY.
2. 5 drm交互
drm_hwcomposer與libdrm交互接口和流程.- 不更新畫面. drm_hwc周期性drmModeAtomicCommit提交
- 更新畫面. drm_hwc不斷import buffer,創建framebuffer object,AtomicCommit提交顯示
2.6 bufferinfo
2.7 用例與demo
- hwc-drm-tests
- demo
3 drm-hwc多屏
4 DPU合成
若Drm Plane個數不足,如沒有OVERLAY_PALNE,就只能GPU合成 若Gralloc申請的僅是GPU內存,無法Convert為Drm格式,也只能GPU合成4 .1.Usage
-
GraphicBuffer格式
決定Layer能否被DPU使用.GRALLOC_USAGE_HW_FB格式的layer才能被drm-hwc ConvertBo,否則Layer只能被GPU合成
- Buffer申請
4.2.Plane
- 類型
- 數量. 決定了能否hwc合成,至少需要一個PRIMARY
- Format
4.3.Property
vendor.hwc.drm.use_overlay_planes vendor.hwc.drm.scale_with_gpu4.4.數據結構
- HwcLayer
-
private_handle_t
其中buffer_是一個gralloc申請的buffer_handle_t,轉換為private_handle_t后可看到buffer結構
總結
以上是生活随笔為你收集整理的Android drm-hwcomposer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nRF52832 — DFU升级
- 下一篇: Python 生成一个二维码