SDV Media は、Linux DRM API を使用して、利用可能なディスプレイを OEM アプリケーションに公開します。
フレームバッファ は、外部に割り当てられたメモリバッファにバックアップされたピクセルデータのソースです。
プレーン は、CRTC で使用される画像ソースです。フレームバッファに関連付けられており、フレームバッファの切り抜きビューを表す場合があります。
CRTC は、ディスプレイ パイプライン全体を表します。複数のプレーンを組み合わせて最終的な動画出力を生成し、出力を複数のエンコーダにディスパッチできます。
エンコーダ は、CRTC からの動画出力を特定のコネクタに適した形式に変換します。
コネクタ は、利用可能なディスプレイ コネクタを表します。たとえば、HDMI ポートなどです。
詳細については、以下をご覧ください。
API サーフェス
SDV Media は、Linux DRM インターフェースを提供します。ioctl システムコールを使用して直接使用できますが、アプリケーション開発では、ユーザー空間ヘルパー ライブラリを使用することをおすすめします。例:
drm-rsRust 用のクレート(推奨)libdrmfor C/C++。drm-kmsman page では、API とその使用方法について 詳しく説明しています。
単一のディスプレイへのレンダリングを設定する
DRM デバイス(
/dev/dri/card*)を開き、そのファイル記述子で Linux DRM API(libdrmなど)を使用して、ディスプレイとそのモードを選択します。通常、ホスト システムは単一の仮想 GPU デバイスのみを公開し、
/dev/dri/card0として表示されます。Linux DRM API を使用して、フロントバッファとバックバッファを割り当てます。
minigbm'sgbm_bo_create()を使用し、 DMA-BUF ファイル記述子をgbm_bo_get_fd()で取得することをおすすめします。割り当てられたバッファにバックアップされた GL フレームバッファを作成します。
EGLImageを使用して、eglCreateImageKHRで DRM バッファからEGL_LINUX_DMA_BUF_EXT(EGL_EXT_image_dma_buf_import拡張機能)を作成します。GL テクスチャを作成し、
glEGLImageTargetTexture2DOES(GL_OES_EGL_image拡張機能)を使用して、テクスチャのストレージを前の手順のEGLImageに設定します。GL フレームバッファを作成し、
glFramebufferTexture2Dを使用して、その バッキング テクスチャを前の手順で作成したテクスチャに設定します。
フレームをレンダリングするには:
作成した GL フレームバッファのいずれかをバインドします。
通常の GLES API を使用してフレームを描画します。
画面にフレームを表示します。Linux DRM API(
drmModeAtomicCommit())を使用して、バインドされた GL フレームバッファで使用される DMA-BUF ファイル記述子でDRM_MODE_PAGE_FLIP_EVENTを送信します。
複数のレイヤから動画出力を構成する
ハードウェア アクセラレーションによるマルチレイヤ(マルチプレーン)構成では、各レイヤを個別の DRM コネクタ(仮想ディスプレイ)として公開し、適切なハードウェア ロケーション / パイプラインにマッピングします。
詳細については、複数のディスプレイへのレンダリングを設定するをご覧ください。
複数のディスプレイへのレンダリングを設定する
単一ディスプレイ フローと同様に、
/dev/dri/card*DRM デバイスを開きます。利用可能なディスプレイ コネクタを一覧表示します。
各ディスプレイは、DRM デバイスの個別の DRM コネクタとして公開されます。
ディスプレイ コネクタごとに:
コネクタと互換性のある CRTC を選択します。各コネクタには、利用可能なエンコーダのリストがあります。各エンコーダは、使用できる CRTC を示します。互換性のある CRTC が常に 1 つ以上存在します。
CRTC と互換性のあるプレーンを選択します。
GPU バッファにバックアップされた DRM フレームバッファを作成します。このプロセスは、単一ディスプレイ バリアントの場合と同じです。
プレーン、CRTC、コネクタを接続し、CRTC に動画モードを設定します。
各コネクタ、CRTC、プレーンセットに次の DRM プロパティを設定するアトミック API を使用すると、複数のディスプレイのモードを同時に設定できます。
必要なプロパティの完全なリスト:
ターゲット プロパティ 型 説明 コネクタ CRTC_IDCRTC ID コネクタに割り当てる CRTC の ID CRTC MODE_IDblob ID drmModeCreatePropertyBlobを使用して作成されたプロパティ blob の ID。選択した動画モードのdrmModeModeInfo構造体が含まれます。CRTC ACTIVEブール値 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 宛先画像の長方形の高さ レンダリング ループを入力します。
次のフレームをレンダリングする前に、CRTC でページフリップ イベントを待ちます。
指定された CRTC + フレームバッファのページフリップをスケジュールして、フレームをレンダリングし、画面に表示します。