硬件作曲家 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 之間的差異

新的 AIDL Composer 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中定義的強型別 Parcelable 類型。指令回應是CommandResultPayload.aidl中定義的強型別 Parcelable。

  • 刪除IComposerClient.getClientTargetSupport ,因為此方法沒有活動客戶端。

  • 將顏色表示為浮點數而不是位元組,以便更好地與 Android 中的上層圖形堆疊對齊(如ASurfaceTransaction_setColor中定義)。

  • 新增用於控制 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