ComposerHALでのホットプラグ処理

ディスプレイ機能(ディスプレイモードやサポートされているHDRタイプなど)は、Android TVセットトップボックス(STB)やオーバーザトップ(OTT)など、外部接続されたディスプレイ(HDMIまたはDisplayPort経由)を備えたデバイスで動的に変更できます。デバイス。この変更は、ユーザーが1つのディスプレイから別のディスプレイに切り替えたり、ディスプレイが接続されていない状態でデバイスを起動したりした場合など、HDMIホットプラグ信号の結果として発生する可能性があります。 Android 12以降、ホットプラグと動的表示機能を処理するためにフレームワークに変更が加えられました。

このページでは、ComposerHAL実装でのディスプレイホットプラグとディスプレイ機能の変更を処理する方法について説明します。さらに、関連するフレームバッファを管理し、これらの状況で競合状態を防ぐ方法についても説明します。

表示機能の更新

このセクションでは、AndroidフレームワークがComposerHALによって開始された表示機能の変更を処理する方法について説明します。

Androidが表示機能の変更を適切に処理する前に、OEMはonHotplug(display, connection=CONNECTED)を使用して表示機能の変更をフレームワークに通知するようにComposerHALを実装する必要があります。これが実装されると、Androidは表示機能の変更を次のように処理します。

  1. 表示機能の変更を検出すると、フレームワークはonHotplug(display, connection=CONNECTED)通知を受信します。
  2. 通知を受信すると、フレームワークは表示状態をドロップし、 getActiveConfiggetDisplayConfigsgetDisplayAttributegetColorModesgetHdrCapabilities 、およびgetDisplayCapabilitiesメソッドを使用して、HALの新しい機能で通知を再作成します。
  3. フレームワークが新しい表示状態を再作成すると、そのようなイベントをリッスンしているアプリにonDisplayChangedコールバックを送信します。

フレームワークは、後続のonHotplug(display, connection=CONNECTED)イベントでフレームバッファーを再割り当てします。これを処理する方法の詳細については、フレームバッファメモリの管理を参照してください。

一般的な接続シナリオの処理

このセクションでは、プライマリディスプレイが接続および切断されたときに、実装でさまざまな接続シナリオを適切に処理する方法について説明します。

Androidフレームワークは、モバイルデバイス用に構築されているため、切断されたプライマリディスプレイのサポートは組み込まれていません。代わりに、HALは、プライマリディスプレイが物理的に切断されている場合に、フレームワークとの相互作用においてプライマリディスプレイをプレースホルダーディスプレイに置き換える必要があります。

次のシナリオは、切断可能なディスプレイが外部接続されているセットトップボックスおよびTVドングルで発生する可能性があります。これらのシナリオのサポートを実装するには、以下の表の情報を使用してください。

シナリオ取り扱い
起動時に接続されたディスプレイがありません
  • onHotplug(display, connection=CONNECTED)シグナルをComposerHALからフレームワークに送信します。
  • ComposerHAL内の物理的な表示状態をプレースホルダーの表示状態に置き換えます。

    注:この表示モードはほとんどのアプリでサポートされているため、プレースホルダーディスプレイには、解像度1080x1920、リフレッシュレート60hzの単一のサポートモードを使用することをお勧めします。

プライマリディスプレイが物理的に接続されている
  • 別のonHotplug(display, connection=CONNECTED)イベントをComposerHALからフレームワークに送信します。

    これにより、フレームワークはすべての表示機能をリロードします。

プライマリディスプレイが物理的に切断されている
  • 別のonHotplug(display, connection=CONNECTED)イベントをComposerHALからフレームワークに送信します。
  • ComposerHAL内の物理的な表示状態をプレースホルダーの表示状態に置き換えます。フレームワークがonDisplayChangedコールバックをアプリに送信するように、プレースホルダー表示には単一の表示モードが必要です(サポートされているモードのセットが変更されているため)。この単一の表示モードは、アプリが構成変更イベントを受け取らないように、切断前の物理表示の最後のアクティブモードと一致する必要があります。

フレームバッファメモリの管理

すでに接続されているディスプレイが後続のonHotplug(display, connection=CONNECTED)通知イベントを受信すると、フレームワークはこのディスプレイに関連付けられているフレームバッファーを再割り当てします。デバイスの実装では、この動作を予測し、フレームバッファメモリを適切に管理する必要があります。実装では、次のガイドラインを使用してください。

  • 後続のonHotplug(display, connection=CONNECTED)通知イベントを送信する前に、システムがそれらを再割り当てする前に適切に割り当てを解除できるように、フレームバッファへのハンドルを解放してください。割り当て解除が成功しない場合、メモリ不足のために再割り当てが失敗する可能性があります。

  • グラフィックメモリバッファの残りの部分とは別のフレームバッファに専用のメモリプールを割り当てることをお勧めします。

フレームバッファの割り当て解除と再割り当ての間に、サードパーティのプロセスがグラフィックメモリの割り当てを試みる可能性があるため、これは重要です。同じグラフィックメモリプールがフレームバッファによって使用され、グラフィックメモリがいっぱいの場合、サードパーティプロセスがフレームバッファによって以前に割り当てられたグラフィックメモリを占有する可能性があるため、フレームバッファの再割り当てに十分なメモリが残りません(またはメモリスペースが断片化する可能性があります) 。

競合状態を防ぐための順次構成IDの使用

Composer HALが、 setActiveConfigまたはsetActiveConfigWithConstraintsを呼び出すフレームワークと同時にサポートされている表示構成を更新すると、競合状態が発生する可能性があります。解決策は、Composer HALを実装してシーケンシャルIDを使用し、この問題を防ぐことです。

このセクションでは、競合状態がどのように発生するかについて説明し、続いて、Composer HALを実装して、そのような状態を防ぐためにシーケンシャルIDを使用する方法について詳しく説明します。

新しいシーケンシャルIDが新しい表示構成に割り当てられず、競合状態が発生する場合は、次の一連のイベントを考慮してください。

  1. サポートされている表示構成IDは次のとおりです。

    • id = 1、1080x1920 60hz
    • id = 2、1080x1920 50hz
  2. フレームワークはsetActiveConfig(display, config=1)呼び出します。

  3. 同時に、Composer HALは表示構成の変更を処理し、その内部状態を次のように表示構成の新しいセットに更新します。

    • id = 1、2160x384060hz
    • id = 2、2160x384050hz
    • id = 3、1080x1920 60hz
    • id = 4、1080x1920 50hz
  4. Composer HALは、 onHotplugイベントをフレームワークに送信して、サポートされているモードのセットが変更されたことを通知します。

  5. Composer HALはsetActiveConfig(display, config=1)を受け取ります(ステップ2から)。

  6. HALは、フレームワークが2160x3840 60hzへの構成変更を要求したと解釈しますが、実際には1080x192060hzが望まれていました。

非順次ID割り当てを使用するプロセスは、ここで、目的の構成変更の誤った解釈で終了します。

シーケンシャルIDを使用するようにComposerHALを構成する

このような競合状態を回避するには、OEMは次のようにComposerHALを実装する必要があります。

  • Composer HALは、サポートされている表示構成を更新すると、新しい順次IDを新しい表示構成に割り当てます。
  • フレームワークが無効な構成IDを使用してsetActiveConfigまたはsetActiveConfigWithConstraintsを呼び出すと、ComposerHALはその呼び出しを無視します。

これらの手順は、以下の説明に示すように、競合状態を防ぐのに役立ちます。

新しいシーケンシャルIDが新しい表示構成に割り当てられる場合は、次の一連のイベントを考慮してください。

  1. サポートされている表示構成IDは次のとおりです。

    • id = 1、1080x1920 60hz
    • id = 2、1080x1920 50hz
  2. フレームワークはsetActiveConfig(display, config=1)呼び出します。

  3. 表示構成の変更が処理されると、次の未使用の整数から次の構成IDのセットが割り当てられます(次のように表示されます)。

    • id = 3、2160x384060hz

    • id = 4、2160x384050hz

    • id = 5、1080x1920 60hz

    • id = 6、1080x1920 50hz

  4. Composer HALは、 onHotplugイベントをフレームワークに送信して、サポートされているモードのセットが変更されたことを通知します。

  5. Composer HALはsetActiveConfig(display, config=1)を受け取ります(ステップ2から)。

  6. IDが無効になったため、ComposerHALは呼び出しを無視します。

  7. フレームワークは、ステップ4からonHotplugイベントを受信して​​処理します。フレームワークは、関数getDisplayConfigsおよびgetDisplayAttributeを使用してComposerHALを呼び出します。これらの機能により、フレームワークは、1080x1920および60Hzの望ましい解像度とリフレッシュレートの新しいID(5)を識別します。

  8. フレームワークは、更新されたIDが5の別のsetActiveConfigイベントを送信します。

  9. Composer HALは、ステップ5からsetActiveConfig(display, config=5)を受け取ります。

  10. HALは、フレームワークが1080x192060hzへの構成変更を要求したことを正しく解釈します。

上記の例に示されているように、順次ID割り当てを使用するプロセスにより、競合状態が防止され、正しい表示構成の変更が更新されます。