硬體 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。這個 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 結構,如 DisplayDecorationSupport.aidl 中所定義。這個結構會說明裝置所需的 PixelFormat 和 AlphaInterpretation 列舉。實作完成後,系統 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