SDV Media:管理螢幕

SDV Media 會透過 Linux DRM API,向原始設備製造商 (OEM) 應用程式公開可用的螢幕。

DRM 元件之間的互動

  • 訊框緩衝區是像素資料的來源,由某些外部配置的記憶體緩衝區支援。

  • Plane 是 CRTC 使用的圖片來源。這與訊框緩衝區相關聯,且可能代表訊框緩衝區的裁剪檢視區塊。

  • CRTC 代表整體顯示管道。這項功能可能會合併多個平面,以建立最終影片輸出內容,並將輸出內容傳送至多個編碼器

  • 編碼器會將 CRTC 的影片輸出內容轉換成適合特定連接器的格式。

  • 「連接器」代表可用的螢幕連接器。例如 HDMI 連接埠。

如需更深入的說明,請參閱:

API 介面

SDV Media 提供 Linux DRM 介面。雖然可以直接使用 ioctl syscall,但建議您使用使用者空間輔助程式庫進行應用程式開發。例如:

設定將內容算繪到單一螢幕

  1. 開啟 DRM 裝置 (/dev/dri/card*),並使用 Linux DRM API (例如透過 libdrm) 在其檔案描述元上選擇顯示器及其模式。

    通常主機系統只會公開單一虛擬 GPU 裝置,該裝置會顯示為 /dev/dri/card0

  2. 使用 Linux DRM API 分配前後緩衝區。

    建議使用 minigbm's gbm_bo_create(),並透過 gbm_bo_get_fd() 取得 DMA-BUF 檔案描述元。

  3. 建立以已分配緩衝區為後盾的 GL 緩衝區。

    1. 使用 eglCreateImageKHR 搭配 EGL_LINUX_DMA_BUF_EXT (來自 EGL_EXT_image_dma_buf_import 擴充功能),從 DRM 緩衝區建立 EGLImage

    2. 建立 GL 紋理,並使用 glEGLImageTargetTexture2DOES (來自 GL_OES_EGL_image 擴充功能) 將紋理的儲存空間設為上一步中的 EGLImage

    3. 建立 GL 畫面緩衝區,並使用 glFramebufferTexture2D 將其支援紋理設為上一個步驟中建立的紋理。

  4. 如要算繪影格,請按照下列步驟操作:

    1. 繫結其中一個建立的 GL 幀緩衝區。

    2. 使用一般的 GLES API 繪製影格。

    3. 在畫面上顯示影格:使用 Linux DRM API (drmModeAtomicCommit()) 傳送 DRM_MODE_PAGE_FLIP_EVENT,其中包含繫結 GL 影格緩衝區使用的 DMA-BUF 檔案描述元。

從多個圖層組合影片輸出內容

如要進行硬體加速多層 (多平面) 合成,我們需要主機系統將每個圖層顯示為個別的 DRM 連接器 (虛擬螢幕),並將這些圖層對應至正確的硬體位置 / 管道。

詳情請參閱「設定在多個螢幕上算繪」。

設定在多個螢幕上算繪

  1. 如單一螢幕流程所述,開啟 /dev/dri/card* DRM 裝置。

  2. 列出可用的螢幕連接器。

    每個螢幕都會顯示為 DRM 裝置的獨立 DRM 連接器

  3. 針對每個螢幕接頭:

    1. 選取與連接器相容的 CRTC。每個連接器都有可用編碼器清單,每個編碼器都會指出可搭配使用的 CRTC。系統一律會提供至少一個相容的 CRTC。

      1. 選取符合 CRTC 規定的方案。

      2. 建立由 GPU 緩衝區支援的 DRM 緩衝區。這個程序與單一螢幕變體相同。

      3. 連接平面、CRTC 和連接器,並在 CRTC 上設定視訊模式。

        您可以針對每個連接器、CRTC 和平面集,使用原子 API 設定下列 DRM 屬性,同時設定多個螢幕的模式。

    必要屬性完整清單:

    目標 屬性 類型 說明
    連接器 CRTC_ID CRTC ID 要指派給連接器的 CRTC ID
    CRTC MODE_ID blob ID 使用 drmModeCreatePropertyBlob 建立的屬性 Blob ID,內含所選影片模式的 drmModeModeInfo 結構體
    CRTC ACTIVE bool true 將 CRTC 標示為有效
    搭飛機 FB_ID 訊框緩衝區 ID 要在螢幕上顯示的 DRM frame buffer ID
    搭飛機 SRC_X 像素 framebuffer 來源圖片矩形的 X 座標
    搭飛機 SRC_Y 像素 framebuffer 來源圖片矩形的 Y 座標
    搭飛機 SRC_W 16.16 定點 framebuffer 來源圖片矩形的寬度 (向左位移 16 位元的像素)
    搭飛機 SRC_H 16.16 定點 framebuffer 來源圖片矩形的高度 (向左位移 16 位元的像素)
    搭飛機 CRTC_X 像素 CRTC 目的地圖片矩形的 X 座標
    搭飛機 CRTC_Y 像素 CRTC 目的地圖片矩形的 Y 座標
    搭飛機 CRTC_W 像素 CRTC 目的地圖片矩形的寬度
    搭飛機 CRTC_H 像素 CRTC 目的地圖片矩形的高度
  4. 輸入算繪迴圈:

    1. 等待 CRTC 上的頁面翻轉事件,再算繪下一個影格。

    2. 排定指定 CRTC + 幀緩衝區的頁面翻轉,在螢幕上轉譯並顯示影格。