SDV メディア: ディスプレイの管理

SDV Media は、Linux DRM API を使用して、利用可能なディスプレイを OEM アプリケーションに公開します。

DRM コンポーネント間のインタラクション

  • フレームバッファ は、外部に割り当てられたメモリバッファにバックアップされたピクセルデータのソースです。

  • プレーン は、CRTC で使用される画像ソースです。フレームバッファに関連付けられており、フレームバッファの切り抜きビューを表す場合があります。

  • CRTC は、ディスプレイ パイプライン全体を表します。複数のプレーンを組み合わせて最終的な動画出力を生成し、出力を複数のエンコーダにディスパッチできます。

  • エンコーダ は、CRTC からの動画出力を特定のコネクタに適した形式に変換します。

  • コネクタ は、利用可能なディスプレイ コネクタを表します。たとえば、HDMI ポートなどです。

詳細については、以下をご覧ください。

API サーフェス

SDV Media は、Linux DRM インターフェースを提供します。ioctl システムコールを使用して直接使用できますが、アプリケーション開発では、ユーザー空間ヘルパー ライブラリを使用することをおすすめします。例:

  • drm-rs Rust 用のクレート(推奨)
  • libdrm for C/C++。drm-kms man page では、API とその使用方法について 詳しく説明しています。

単一のディスプレイへのレンダリングを設定する

  1. DRM デバイス(/dev/dri/card*)を開き、そのファイル記述子で Linux DRM API(libdrm など)を使用して、ディスプレイとそのモードを選択します。

    通常、ホスト システムは単一の仮想 GPU デバイスのみを公開し、/dev/dri/card0 として表示されます。

  2. Linux DRM API を使用して、フロントバッファとバックバッファを割り当てます。

    minigbm's gbm_bo_create() を使用し、 DMA-BUF ファイル記述子を gbm_bo_get_fd() で取得することをおすすめします。

  3. 割り当てられたバッファにバックアップされた GL フレームバッファを作成します。

    1. EGLImage を使用して、eglCreateImageKHR で DRM バッファから EGL_LINUX_DMA_BUF_EXTEGL_EXT_image_dma_buf_import 拡張機能)を作成します。

    2. GL テクスチャを作成し、glEGLImageTargetTexture2DOESGL_OES_EGL_image 拡張機能)を使用して、テクスチャのストレージを前の手順の EGLImage に設定します。

    3. GL フレームバッファを作成し、glFramebufferTexture2D を使用して、その バッキング テクスチャを前の手順で作成したテクスチャに設定します。

  4. フレームをレンダリングするには:

    1. 作成した GL フレームバッファのいずれかをバインドします。

    2. 通常の GLES API を使用してフレームを描画します。

    3. 画面にフレームを表示します。Linux DRM API(drmModeAtomicCommit())を使用して、バインドされた GL フレームバッファで使用される DMA-BUF ファイル記述子で DRM_MODE_PAGE_FLIP_EVENT を送信します。

複数のレイヤから動画出力を構成する

ハードウェア アクセラレーションによるマルチレイヤ(マルチプレーン)構成では、各レイヤを個別の DRM コネクタ(仮想ディスプレイ)として公開し、適切なハードウェア ロケーション / パイプラインにマッピングします。

詳細については、複数のディスプレイへのレンダリングを設定するをご覧ください。

複数のディスプレイへのレンダリングを設定する

  1. 単一ディスプレイ フローと同様に、/dev/dri/card* DRM デバイスを開きます。

  2. 利用可能なディスプレイ コネクタを一覧表示します。

    各ディスプレイは、DRM デバイスの個別の DRM コネクタとして公開されます。

  3. ディスプレイ コネクタごとに:

    1. コネクタと互換性のある CRTC を選択します。各コネクタには、利用可能なエンコーダのリストがあります。各エンコーダは、使用できる CRTC を示します。互換性のある CRTC が常に 1 つ以上存在します。

      1. CRTC と互換性のあるプレーンを選択します。

      2. GPU バッファにバックアップされた DRM フレームバッファを作成します。このプロセスは、単一ディスプレイ バリアントの場合と同じです。

      3. プレーン、CRTC、コネクタを接続し、CRTC に動画モードを設定します。

        各コネクタ、CRTC、プレーンセットに次の DRM プロパティを設定するアトミック API を使用すると、複数のディスプレイのモードを同時に設定できます。

    必要なプロパティの完全なリスト:

    ターゲット プロパティ 説明
    コネクタ CRTC_ID CRTC ID コネクタに割り当てる CRTC の ID
    CRTC MODE_ID blob ID drmModeCreatePropertyBlob を使用して作成されたプロパティ blob の ID。選択した動画モードの drmModeModeInfo 構造体が含まれます。
    CRTC ACTIVE ブール値 CRTC をアクティブとしてマークする場合は true
    プレーン FB_ID フレームバッファ ID 画面に表示する DRM フレームバッファの ID
    プレーン SRC_X ピクセル フレームバッファ ソース画像の長方形の X 座標
    プレーン SRC_Y ピクセル フレームバッファ ソース画像の長方形の Y 座標
    プレーン SRC_W 16.16 固定小数点 フレームバッファ ソース画像の長方形の幅(ピクセルを左に 16 ビットシフト)
    プレーン SRC_H 16.16 固定小数点 フレームバッファ ソース画像の長方形の高さ(ピクセルを左に 16 ビットシフト)
    プレーン CRTC_X ピクセル CRTC 宛先画像の長方形の X 座標
    プレーン CRTC_Y ピクセル CRTC 宛先画像の長方形の Y 座標
    プレーン CRTC_W ピクセル CRTC 宛先画像の長方形の幅
    プレーン CRTC_H ピクセル CRTC 宛先画像の長方形の高さ
  4. レンダリング ループを入力します。

    1. 次のフレームをレンダリングする前に、CRTC でページフリップ イベントを待ちます。

    2. 指定された CRTC + フレームバッファのページフリップをスケジュールして、フレームをレンダリングし、画面に表示します。