從 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 序列化的指令。這項功能可為指令提供穩定的介面,並以更易讀的方式定義系統解讀指令酬載的方式。
executeCommands
5 方法定義於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
。