SDV メディア: ディスプレイを管理する

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

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

図 1.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_IDCRTC IDコネクタに割り当てる CRTC の ID
    CRTCMODE_IDBlob ID drmModeCreatePropertyBlob を使用して作成されたプロパティ Blob の ID。選択した動画モードの drmModeModeInfo 構造体が含まれています。
    CRTCACTIVEブール値CRTC をアクティブとしてマークする場合は true
    プレーンFB_IDフレームバッファ ID画面に表示する DRM フレームバッファの ID
    プレーンSRC_Xピクセルフレームバッファ ソース画像の長方形の X 座標
    プレーンSRC_Yピクセルフレームバッファ ソース画像の長方形の Y 座標
    プレーンSRC_W16.16 固定小数点フレームバッファ ソース画像の長方形の幅(ピクセルを左に 16 ビットシフト)
    プレーンSRC_H16.16 固定小数点フレームバッファ ソース画像の長方形の高さ(ピクセルを左に 16 ビットシフト)
    プレーンCRTC_XピクセルCRTC 宛先画像の長方形の X 座標
    プレーンCRTC_YピクセルCRTC 宛先画像の長方形の Y 座標
    プレーンCRTC_WピクセルCRTC 宛先画像の長方形の幅
    プレーンCRTC_HピクセルCRTC 宛先画像の長方形の高さ
  4. レンダリング ループに入ります。

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

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