硬體 Composer HAL 的 AIDL

從 Android 13 開始,硬體編寫工具 (HWC) HAL 會在 AIDL 中定義,android.hardware.graphics.composer@2.1android.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 中定義。它會公開類似於 HIDL HAL android.hardware.graphics.composer@2.4 的 API,並且具有以下變更:

  • 移除快速訊息佇列 (FMQ),改用可分割的命令。

    AIDL HAL 會根據強型別可分割類型定義指令介面,而非 HIDL 中透過 FMQ 的序列化指令。這可為指令提供穩定的介面,並提供更易讀的定義,說明如何解讀指令酬載。

    executeCommands 方法在 IComposerClient.aidl 中定義為

    CommandResultPayload[] executeCommands(in DisplayCommand[] commands);
    

    其中每個指令都是在 DisplayCommand.aidl 中定義的強型別可分割類型。指令回應是 CommandResultPayload.aidl 中定義的強型別 parcelable。

  • 移除 IComposerClient.getClientTargetSupport,因為這個方法沒有任何有效的用戶端。

  • 以浮點值而非位元組呈現顏色,以便與 ASurfaceTransaction_setColor 中定義的 Android 上層圖形堆疊相符。

  • 新增用於控制 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 結構。這個結構描述裝置所需的 PixelFormatAlphaInterpretation 列舉。在這個實作項目中,系統 UI 會將 Alpha 遮罩層標示為 DISPLAY_DECORATION,這是一種可充分利用專屬硬體的新組合類型。

  • 將新的 expectedPresentTime 欄位新增至 DisplayCommand.aidl

    expectedPresentTime 欄位可讓 SurfaceFlinger 將預期的現在時間設為目前內容必須顯示在螢幕上的時間。有了這項功能,SurfaceFlinger 就能提前將呈現指令傳送至實作,讓其能管線更多合成作業。

  • 新增 API 以控制啟動螢幕設定。

    供應商可以使用 BOOT_DISPLAY_CONFIG 指定支援的開機顯示設定。setBootDisplayConfigclearBootDisplayConfiggetPreferredBootDisplayConfig 方法使用 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