SDV Media 會透過 Linux DRM API,向原始設備製造商 (OEM) 應用程式公開可用的螢幕。
訊框緩衝區是像素資料的來源,由某些外部配置的記憶體緩衝區支援。
Plane 是 CRTC 使用的圖片來源。這與訊框緩衝區相關聯,且可能代表訊框緩衝區的裁剪檢視區塊。
CRTC 代表整體顯示管道。這項功能可能會合併多個平面,以建立最終影片輸出內容,並將輸出內容傳送至多個編碼器。
編碼器會將 CRTC 的影片輸出內容轉換成適合特定連接器的格式。
「連接器」代表可用的螢幕連接器。例如 HDMI 連接埠。
如需更深入的說明,請參閱:
API 介面
SDV Media 提供 Linux DRM 介面。雖然可以直接使用 ioctl syscall,但建議您使用使用者空間輔助程式庫進行應用程式開發。例如:
- Rust 的
drm-rsCrate (建議使用), - C/C++ 專用的
libdrm。drm-kms手冊頁面提供 API 和其用法的完整總覽。
設定將內容算繪到單一螢幕
開啟 DRM 裝置 (
/dev/dri/card*),並使用 Linux DRM API (例如透過libdrm) 在其檔案描述元上選擇顯示器及其模式。通常主機系統只會公開單一虛擬 GPU 裝置,該裝置會顯示為
/dev/dri/card0。使用 Linux DRM API 分配前後緩衝區。
建議使用
minigbm'sgbm_bo_create(),並透過gbm_bo_get_fd()取得 DMA-BUF 檔案描述元。建立以已分配緩衝區為後盾的 GL 緩衝區。
使用
eglCreateImageKHR搭配EGL_LINUX_DMA_BUF_EXT(來自EGL_EXT_image_dma_buf_import擴充功能),從 DRM 緩衝區建立EGLImage。建立 GL 紋理,並使用
glEGLImageTargetTexture2DOES(來自GL_OES_EGL_image擴充功能) 將紋理的儲存空間設為上一步中的EGLImage。建立 GL 畫面緩衝區,並使用
glFramebufferTexture2D將其支援紋理設為上一個步驟中建立的紋理。
如要算繪影格,請按照下列步驟操作:
繫結其中一個建立的 GL 幀緩衝區。
使用一般的 GLES API 繪製影格。
在畫面上顯示影格:使用 Linux DRM API (
drmModeAtomicCommit()) 傳送DRM_MODE_PAGE_FLIP_EVENT,其中包含繫結 GL 影格緩衝區使用的 DMA-BUF 檔案描述元。
從多個圖層組合影片輸出內容
如要進行硬體加速多層 (多平面) 合成,我們需要主機系統將每個圖層顯示為個別的 DRM 連接器 (虛擬螢幕),並將這些圖層對應至正確的硬體位置 / 管道。
詳情請參閱「設定在多個螢幕上算繪」。
設定在多個螢幕上算繪
如單一螢幕流程所述,開啟
/dev/dri/card*DRM 裝置。列出可用的螢幕連接器。
每個螢幕都會顯示為 DRM 裝置的獨立 DRM 連接器。
針對每個螢幕接頭:
選取與連接器相容的 CRTC。每個連接器都有可用編碼器清單,每個編碼器都會指出可搭配使用的 CRTC。系統一律會提供至少一個相容的 CRTC。
選取符合 CRTC 規定的方案。
建立由 GPU 緩衝區支援的 DRM 緩衝區。這個程序與單一螢幕變體相同。
連接平面、CRTC 和連接器,並在 CRTC 上設定視訊模式。
您可以針對每個連接器、CRTC 和平面集,使用原子 API 設定下列 DRM 屬性,同時設定多個螢幕的模式。
必要屬性完整清單:
目標 屬性 類型 說明 連接器 CRTC_IDCRTC ID 要指派給連接器的 CRTC ID CRTC MODE_IDblob ID 使用 drmModeCreatePropertyBlob建立的屬性 Blob ID,內含所選影片模式的drmModeModeInfo結構體CRTC ACTIVEbool true將 CRTC 標示為有效搭飛機 FB_ID訊框緩衝區 ID 要在螢幕上顯示的 DRM frame buffer ID 搭飛機 SRC_X像素 framebuffer 來源圖片矩形的 X 座標 搭飛機 SRC_Y像素 framebuffer 來源圖片矩形的 Y 座標 搭飛機 SRC_W16.16 定點 framebuffer 來源圖片矩形的寬度 (向左位移 16 位元的像素) 搭飛機 SRC_H16.16 定點 framebuffer 來源圖片矩形的高度 (向左位移 16 位元的像素) 搭飛機 CRTC_X像素 CRTC 目的地圖片矩形的 X 座標 搭飛機 CRTC_Y像素 CRTC 目的地圖片矩形的 Y 座標 搭飛機 CRTC_W像素 CRTC 目的地圖片矩形的寬度 搭飛機 CRTC_H像素 CRTC 目的地圖片矩形的高度 輸入算繪迴圈:
等待 CRTC 上的頁面翻轉事件,再算繪下一個影格。
排定指定 CRTC + 幀緩衝區的頁面翻轉,在螢幕上轉譯並顯示影格。