從 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 合成器 HAL,而非 HIDL 版本。詳情請參閱「導入」一節。
AIDL 和 HIDL HAL 的差異
新的 AIDL 組合器 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結構,如DisplayDecorationSupport.aidl中所定義。這個結構會說明裝置所需的 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。