Hardware Composer HAL 適用的 AIDL

自 Android 13 起,Hardware Composer (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),改用 Parcel 指令。

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

    executeCommands 方法在 IComposerClient.aidl 中定義如下:

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

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

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

  • 以浮點值而非位元組表示顏色,以便與 ASurfaceTransaction_setColor 中定義的 Android 上層圖形堆疊保持一致。

  • 新增用於控制 HDR 內容的新欄位。

    在 AIDL HAL 中,當螢幕同時顯示 HDR 層時,混合 SDR/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