從 Android 13 開始,硬體合成器 (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。這個 API 與 HIDL HAL android.hardware.graphics.composer@2.4 類似,但包含下列變更:
移除 Fast Message Queue (FMQ),改用可打包的指令。
AIDL HAL 會根據強型別可封送類型定義指令介面,而不是 HIDL 中透過 FMQ 序列化的指令。這項功能可為指令提供穩定的介面,並以更易讀的方式定義系統解讀指令酬載的方式。
executeCommands5 方法定義於IComposerClient.aidl:CommandResultPayload[] executeCommands(in DisplayCommand[] commands);每個指令都是
DisplayCommand.aidl中定義的強型別可封送類型。指令回應是CommandResultPayload.aidl中定義的強型別可封送物件。移除
IComposerClient.getClientTargetSupport,因為沒有任何有效用戶端使用這個方法。將顏色表示為浮點數而非位元組,以便與 Android 中較高的圖形堆疊對齊,如
ASurfaceTransaction_setColor所定義。新增用來控制 HDR 內容的欄位。
在 AIDL HAL 中,混合 SDR/HDR 圖層堆疊支援在螢幕上同時顯示 HDR 圖層時,順暢調暗 SDR 圖層。
LayerCommand中的brightness欄位可讓 SurfaceFlinger 指定每個圖層的亮度。這會讓 HWC 在線性光空間 (而非 Gamma 空間) 中調暗圖層內容。ClientTargetPropertyWithBrightness中的brightness欄位可讓 HWC 指定用戶端組合的亮度空間,並指示RenderEngine是否要在用戶端組合中調暗 SDR 圖層。HWC 可透過
dimmingStage欄位設定RenderEngine調暗內容的時間。這可配合供應商定義的ColorModes,這類供應商可能偏好在 Gamma 空間中調暗,以便在色彩管道中啟用供應商定義的對比度增強功能。在
Composition.aidl中新增合成類型DISPLAY_DECORATION,用於螢幕裝飾。部分裝置有專屬硬體,可最佳化繪製 Alpha 遮罩,讓螢幕上的圓角和凹口更平滑。這類硬體的裝置必須實作
IComposerClient.getDisplayDecorationSupport,並傳回DisplayDecorationSupport.aidl中定義的DisplayDecorationSupport結構。這個結構會說明裝置所需的PixelFormat和AlphaInterpretation列舉。實作完成後,系統 UI 會將 Alpha 遮罩層標示為DISPLAY_DECORATION,這是可運用專屬硬體的合成類型。在
DisplayCommand.aidl中新增expectedPresentTime欄位。SurfaceFlinger 可透過
expectedPresentTime欄位,設定目前內容必須顯示在螢幕上的預期呈現時間。這項功能可讓 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 編譯器 HAL,而非 HIDL 版本,以便使用 AIDL 編譯器 HAL 的功能和 API。
Android 模擬器包含 AIDL HWC HAL 的參考實作。
測試
如要測試導入成果,請執行 VtsHalGraphicsComposer3_TargetTest。