硬體 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 版的 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 結構。這個結構會說明裝置所需的 PixelFormatAlphaInterpretation 列舉。實作完成後,系統 UI 會將 Alpha 遮罩層標示為 DISPLAY_DECORATION,這是可運用專屬硬體的合成類型。

  • DisplayCommand.aidl 中新增 expectedPresentTime 欄位。

    SurfaceFlinger 可透過 expectedPresentTime 欄位,設定目前內容必須顯示在螢幕上的預期呈現時間。這項功能可讓 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 版本,以便使用 AIDL 編譯器 HAL 的功能和 API。

Android 模擬器包含 AIDL HWC HAL 的參考實作

測試

如要測試導入成果,請執行 VtsHalGraphicsComposer3_TargetTest