Android 13 以降では、Hardware Composer(HWC)HAL は AIDL で定義され、HIDL のバージョン android.hardware.graphics.composer@2.1
から android.hardware.graphics.composer@2.4
までは非推奨になっています。
このページでは、HWC の AIDL HAL と HIDL HAL の違い、AIDL HAL の実装とテストについて説明します。
AIDL によって得られるメリットがあるため、ベンダーには、Android 13 以降、HIDL 版ではなく、AIDL Composer HAL を実装することをおすすめします。詳細については、実装のセクションをご覧ください。
AIDL HAL と HIDL HAL の違い
android.hardware.graphics.composer3
という新しい AIDL Composer HAL が IComposer.aidl
で定義されています。これが HIDL HAL android.hardware.graphics.composer@2.4
と類似の API を公開していますが、以下のような変更点があります。
Fast Message Queue(FMQ)を削除して、Parcelable なコマンドに置き換えました。
AIDL HAL では、HIDL の FMQ にシリアル化されたコマンドとは異なり、厳密に型指定された Parcelable 型をベースとするコマンド インターフェースを定義しています。これにより、コマンドのインターフェースが安定し、コマンド ペイロードの解釈に関する定義がよりわかりやすくなります。
executeCommands
メソッドは、次のようにIComposerClient.aidl
で定義されています。CommandResultPayload[] executeCommands(in DisplayCommand[] commands);
ここでの各コマンドは、
DisplayCommand.aidl
で定義されている厳密に型指定された Parcelable 型です。コマンド レスポンスは、CommandResultPayload.aidl
で定義されている厳密に型指定された Parcelable です。IComposerClient.getClientTargetSupport
は、アクティブなクライアントがないメソッドであるため、削除しました。ASurfaceTransaction_setColor
で定義されているように、Android の上位のグラフィック スタックに合わせて、バイトではなく浮動小数点数で色を表現します。HDR コンテンツを制御するための新しいフィールドを追加しています。
AIDL HAL の SDR / HDR レイヤ混合スタックでは、SDR レイヤを、HDR レイヤが同時に画面に表示されるときにシームレスに暗くすることができます。
LayerCommand
のbrightness
フィールドを使用すると、SurfaceFlinger がレイヤごとの明るさを指定することにより、HWC がガンマ空間ではなく線形光空間でレイヤのコンテンツを減光します。ClientTargetPropertyWithBrightness
のbrightness
フィールドを使用すると、HWC がクライアント合成の輝度空間を指定し、RenderEngine
に対してクライアント合成で SDR レイヤを減光するかどうかを指示します。dimmingStage
フィールドを使用すると、RenderEngine
によりコンテンツが減光されるタイミングを HWC が設定します。これにより、ガンマ空間での減光が好まれるベンダー定義のColorModes
に対応でき、カラー パイプラインでのベンダー定義のコントラスト補正が可能になります。画面装飾用に新しい合成タイプ
DISPLAY_DECORATION
をComposition.aidl
に追加しました。一部のデバイスは、ディスプレイの角やカットアウトを滑らかにするアルファマスクの描画を最適化する専用ハードウェアを備えています。このようなハードウェアを備えているデバイスでは、新しい
DisplayDecorationSupport.aidl
で定義されているDisplayDecorationSupport
構造体を返すようにIComposerClient.getDisplayDecorationSupport
を実装する必要があります。この構造体は、デバイスに必要なPixelFormat
列挙型とAlphaInterpretation
列挙型を表します。これを実装する際には、システム UI でアルファマスク レイヤを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 を実装することは必須ではありません。しかし、HIDL 版ではなく AIDL Composer HAL を実装して、新しい機能と API を使用することが推奨されます。
AIDL HWC HAL のリファレンス実装は、Android エミュレータに実装されています。
テスト
実装をテストするには、VtsHalGraphicsComposer3_TargetTest
を実行します。