從 Android 13 開始,Hardware Composer (HWC) HAL 在AIDL中定義,並且不推薦使用從android.hardware.graphics.composer@2.1
到android.hardware.graphics.composer@2.4
的 HIDL 版本。
本頁介紹 HWC 的 AIDL 和 HIDL HAL 之間的區別以及 AIDL HAL 的實現和測試。
由於 AIDL 提供的優勢,我們鼓勵供應商從 Android 13 開始實施AIDL composer HAL,而不是 HIDL 版本。有關詳細信息,請參閱實施部分。
AIDL 和 HIDL HAL 之間的區別
名為android.hardware.graphics.composer3
的新 AIDL 作曲家 HAL 在IComposer.aidl
中定義。它公開了一個類似於 HIDL HAL android.hardware.graphics.composer@2.4
的 API,並進行了以下更改:
刪除快速消息隊列 (FMQ)以支持可打包命令。
AIDL HAL 定義了基於強類型可打包類型的命令接口,而不是 HIDL 中基於 FMQ 的序列化命令。這為命令提供了一個穩定的接口,並為如何解釋命令有效負載提供了更易讀的定義。
executeCommands
方法在IComposerClient.aidl
中定義為CommandResultPayload[] executeCommands(in DisplayCommand[] commands);
其中每個命令都是在
DisplayCommand.aidl
中定義的強類型可打包類型。命令響應是在CommandResultPayload.aidl
中定義的強類型 parcelables。刪除
IComposerClient.getClientTargetSupport
,因為此方法沒有活動客戶端。將顏色表示為浮點數而不是字節,以更好地與
ASurfaceTransaction_setColor
中定義的 Android 中的上層圖形堆棧保持一致。添加用於控制 HDR 內容的新字段。
在 AIDL HAL 中,混合 SDR/HDR 層堆棧支持當 HDR 層同時在屏幕上時 SDR 層的無縫調光。
LayerCommand
中的brightness
字段讓 SurfaceFlinger 指定每層的亮度,以便 HWC 在線性光空間中調暗層的內容,而不是伽馬空間。ClientTargetPropertyWithBrightness
中的brightness
字段讓 HWC 指定客戶端合成的亮度空間,並指示RenderEngine
是否在客戶端合成中調暗 SDR 層。dimmingStage
字段允許 HWC 配置RenderEngine
何時應使內容變暗。這適應了供應商定義的ColorModes
,它可能更喜歡在伽馬空間中變暗,以允許在其顏色管道中實現供應商定義的對比度增強。在
Composition.aidl
中添加新的合成類型DISPLAY_DECORATION
用於屏幕裝飾。一些設備具有專用硬件來優化繪製 alpha 蒙版,以平滑顯示器上的圓角和切口。具有此類硬件的設備必須實現
IComposerClient.getDisplayDecorationSupport
以返回新DisplayDecorationSupport.aidl
中定義的DisplayDecorationSupport
結構。此結構描述了設備所需的PixelFormat
和AlphaInterpretation
枚舉。在此實現中,系統 UI 將 alpha 蒙版層標記為DISPLAY_DECORATION
,這是一種利用專用硬件的新合成類型。向
DisplayCommand.aidl
添加一個新的expectedPresentTime
字段。expectedPresentTime
字段允許 SurfaceFlinger 將預期的當前時間設置為當前內容必須顯示在屏幕上的時間。借助此功能,SurfaceFlinger 會提前向實現發送當前命令,使其能夠流水線化更多的合成工作。添加新的 API 來控制引導顯示配置。
使用
BOOT_DISPLAY_CONFIG
,供應商可以指定支持啟動顯示配置。setBootDisplayConfig
、clearBootDisplayConfig
和getPreferredBootDisplayConfig
方法使用BOOT_DISPLAY_CONFIG
,如下所示:使用
setBootDisplayConfig
,框架會通知供應商啟動時間顯示配置。供應商必須緩存在啟動顯示配置中,並在下次重新啟動時在此配置中啟動。如果設備無法在此配置中啟動,供應商必須找到與此配置的分辨率和刷新率相匹配的配置。如果不存在這樣的配置,供應商應使用他們首選的顯示配置。使用
clearBootDisplayConfig
,框架會通知供應商清除啟動顯示配置,並在下次重新啟動時以他們首選的顯示配置啟動。使用
getPreferredBootDisplayConfig
,框架會查詢供應商的首選啟動模式。
當不支持引導顯示配置時,這些方法返回值
UNSUPPORTED
。添加新的 API 來控制顯示空閒計時器。
使用
DISPLAY_IDLE_TIMER
,供應商可以指定供應商為此顯示實施不活動計時器。空閒時,此功能會將刷新率更改為較低的設置以節省電量。平台使用setIdleTimerEnabled
來控制定時器的超時時間,並且在某些情況下,禁用它以防止空閒時出現不希望的刷新率切換。使用
IComposerCallback.onVsyncIdle
回調向平台指示顯示器處於空閒狀態並且vsync
節奏已更改。平台通過重置其vsync
模型來響應此回調。它在下一幀強制進行vsync
重新同步,並學習新的vsync
節奏。
執行
供應商不需要為 Android 13 實施 AIDL HAL。但是,我們鼓勵他們實施AIDL composer HAL 而不是 HIDL 版本以使用新功能和 API。
AIDL HWC HAL 的參考實現在 Android 模擬器中實現。
測試
要測試您的實現,請運行VtsHalGraphicsComposer3_TargetTest
。