硬件作曲家 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 composer HAL,而不是 HIDL 版本。有關詳細信息,請參閱實施部分。

AIDL 和 HIDL HAL 之間的區別

名為android.hardware.graphics.composer3的新 AIDL 作曲家 HAL 在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中定義的強類型 parcelables。

  • 刪除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 ,這是一種利用專用硬件的新合成類型。

  • DisplayCommand.aidl添加一個新的expectedPresentTime字段。

    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 composer HAL 而不是 HIDL 版本以使用新功能和 API。

AIDL HWC HAL 的參考實現在 Android 模擬器中實現。

測試

要測試您的實現,請運行VtsHalGraphicsComposer3_TargetTest