Hardware Composer HAL の AIDL

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 レイヤが同時に画面に表示されるときにシームレスに暗くすることができます。

    LayerCommandbrightness フィールドを使用すると、SurfaceFlinger がレイヤごとの明るさを指定することにより、HWC がガンマ空間ではなく線形光空間でレイヤのコンテンツを減光します。

    ClientTargetPropertyWithBrightnessbrightnessフィールドを使用すると、HWC がクライアント合成の輝度空間を指定し、RenderEngine に対してクライアント合成で SDR レイヤを減光するかどうかを指示します。

    dimmingStage フィールドを使用すると、RenderEngine によりコンテンツが減光されるタイミングを HWC が設定します。これにより、ガンマ空間での減光が好まれるベンダー定義の ColorModes に対応でき、カラー パイプラインでのベンダー定義のコントラスト補正が可能になります。

  • 画面装飾用に新しい合成タイプ DISPLAY_DECORATIONComposition.aidl に追加しました。

    一部のデバイスは、ディスプレイの角やカットアウトを滑らかにするアルファマスクの描画を最適化する専用ハードウェアを備えています。このようなハードウェアを備えているデバイスでは、新しい DisplayDecorationSupport.aidl で定義されている DisplayDecorationSupport 構造体を返すように IComposerClient.getDisplayDecorationSupport を実装する必要があります。この構造体は、デバイスに必要な PixelFormat 列挙型と AlphaInterpretation 列挙型を表します。これを実装する際には、システム UI でアルファマスク レイヤを DISPLAY_DECORATION としてマークします。これは、専用ハードウェアを活用する新しい合成タイプです。

  • 新しい expectedPresentTime フィールドが DisplayCommand.aidl に追加されています。

    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 を実装することは必須ではありません。しかし、HIDL 版ではなく AIDL Composer HAL を実装して、新しい機能と API を使用することが推奨されます。

AIDL HWC HAL のリファレンス実装は、Android エミュレータに実装されています。

テスト

実装をテストするには、VtsHalGraphicsComposer3_TargetTest を実行します。