從 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
。