自 Android 13 起,Hardware Composer (HWC) HAL 已在 AIDL 中定義,且從 android.hardware.graphics.composer@2.1
到 android.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
結構。這個結構描述裝置所需的PixelFormat
和AlphaInterpretation
列舉。在此實作時,系統 UI 會將 Alpha 遮罩層標示為DISPLAY_DECORATION
,這是運用專屬硬體的新組合類型。將新的
expectedPresentTime
欄位新增至DisplayCommand.aidl
。expectedPresentTime
欄位可讓 SurfaceFlinger 將預期的現在時間設為目前內容必須顯示在螢幕上的時間。有了這項功能,SurfaceFlinger 就能提前將呈現指令傳送至實作項目,讓其能管線更多合成作業。新增用於控制開機顯示設定的新 API。
廠商可以使用
BOOT_DISPLAY_CONFIG
指定支援的開機顯示設定。setBootDisplayConfig
、clearBootDisplayConfig
和getPreferredBootDisplayConfig
方法會使用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
。