從 Android 13 開始,硬體合成器 (HWC) HAL 是以 AIDL 定義,且 HIDL 版本 android.hardware.graphics.composer@2.1
至 android.hardware.graphics.composer@2.4
已遭淘汰。
本頁說明 HWC 的 AIDL 和 HIDL HAL 之間的差異,以及 AIDL HAL 的實作和測試。
由於 AIDL 具有優勢,建議供應商從 Android 13 開始實作 AIDL 組合器 HAL,而非 HIDL 版本。詳情請參閱「實作」一節。
AIDL 和 HIDL HAL 的差異
新的 AIDL 組合器 HAL 名為 android.hardware.graphics.composer3
,定義於 IComposer.aidl
。它會公開類似 HIDL HAL android.hardware.graphics.composer@2.4
的 API,並進行下列變更:
移除 Fast Message Queue (FMQ),改用可 Parcelable 的指令。
AIDL HAL 會根據強型別可打包類型定義指令介面,而非 HIDL 中透過 FMQ 序列化的指令。這項功能可為指令提供穩定的介面,並以更易讀的方式定義指令酬載的解讀方式。
executeCommands
方法定義於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 圖層。dimmingStage
欄位可讓 HWC 設定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 版本,以便使用新功能和 API。
Android 模擬器中實作了 AIDL HWC HAL 的參考實作。
測試
如要測試導入成果,請執行 VtsHalGraphicsComposer3_TargetTest
。