從 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 之間的差異
新的 AIDL Composer HAL 名為android.hardware.graphics.composer3
,在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
中定義的強類型 Parcelable 類型。命令響應是CommandResultPayload.aidl
中定義的強類型 Parcelable。刪除
IComposerClient.getClientTargetSupport
,因為此方法沒有活動客戶端。將顏色表示為浮點數而不是字節,以便更好地與 Android 中的上層圖形堆棧對齊(如
ASurfaceTransaction_setColor
中定義)。添加用於控制 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
。