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 を実行します。