SDV Media: zarządzanie wyświetlaczami

SDV Media udostępnia dostępne wyświetlacze aplikacjom OEM za pomocą interfejsu Linux DRM API.

Interakcja między komponentami DRM

Rysunek 1. Interakcja między komponentami DRM.

  • Bufor ramki jest źródłem danych pikseli, które są przechowywane w buforze pamięci przydzielonym zewnętrznie.

  • Płaszczyzna to źródło obrazu używane przez CRTC. Jest powiązana z buforem ramki i może reprezentować przycięty widok bufora ramki.

  • CRTC reprezentuje ogólny potok wyświetlania. Może łączyć wiele płaszczyzn, aby utworzyć ostateczny obraz wideo, i wysyłać go do wielu koderów.

  • Koder konwertuje obraz wideo z CRTC na format odpowiedni dla konkretnego złącza.

  • Złącze reprezentuje dostępne złącze wyświetlacza. Na przykład port HDMI.

Więcej informacji znajdziesz w tych artykułach:

Powierzchnia interfejsu API

SDV Media udostępnia interfejsy Linux DRM. Można ich używać bezpośrednio za pomocą wywołania systemowego ioctl, ale w przypadku tworzenia aplikacji zalecamy używanie biblioteki pomocniczej w przestrzeni użytkownika. Na przykład:

Konfigurowanie renderowania na jednym wyświetlaczu

  1. Otwórz urządzenie DRM (/dev/dri/card*) i użyj interfejsów Linux DRM API, np. za pomocą libdrm, na jego deskryptorze pliku, aby wybrać wyświetlacz i jego tryb.

    Zwykle system hosta udostępnia tylko 1 wirtualne urządzenie GPU, które jest widoczne jako /dev/dri/card0.

  2. Przydziel bufor przedni i tylny za pomocą interfejsu Linux DRM API.

    Zalecamy używanie minigbm's gbm_bo_create() i pobieranie deskryptora pliku DMA-BUF za pomocą gbm_bo_get_fd().

  3. Utwórz bufory ramki GL oparte na przydzielonych buforach.

    1. Utwórz EGLImage z bufora DRM za pomocą eglCreateImageKHR z EGL_LINUX_DMA_BUF_EXT (z EGL_EXT_image_dma_buf_import rozszerzenia).

    2. Utwórz teksturę GL i użyj glEGLImageTargetTexture2DOES (z GL_OES_EGL_image rozszerzenia), aby ustawić pamięć tekstury na EGLImage z poprzedniego kroku.

    3. Utwórz bufor ramki GL i użyj glFramebufferTexture2D, aby ustawić jego teksturę zapasową na teksturę utworzoną w poprzednim kroku.

  4. Aby wyrenderować klatkę:

    1. Powiąż jeden z utworzonych buforów ramki GL.

    2. Narysuj klatkę za pomocą zwykłych interfejsów GLES API.

    3. Wyświetl klatkę na ekranie: użyj interfejsu Linux DRM API (drmModeAtomicCommit()), aby wysłać DRM_MODE_PAGE_FLIP_EVENT z deskryptorem pliku DMA-BUF używanym przez powiązany bufor ramki GL.

Tworzenie obrazu wideo z wielu warstw

W przypadku kompozycji wielowarstwowej (wielopłaszczyznowej) z akceleracją sprzętową polegamy na tym, że system hosta udostępnia każdą warstwę jako osobne złącze DRM (wyświetlacz wirtualny) i mapuje je na odpowiednią lokalizację sprzętu lub potok.

Więcej informacji znajdziesz w artykule Konfigurowanie renderowania na wielu wyświetlaczach.

Konfigurowanie renderowania na wielu wyświetlaczach

  1. Otwórz urządzenie DRM /dev/dri/card* tak jak w przypadku renderowania na jednym wyświetlaczu.

  2. Wyświetl listę dostępnych złączy wyświetlacza.

    Każdy wyświetlacz jest udostępniany jako osobne złącze DRM urządzenia DRM.

  3. W przypadku każdego złącza wyświetlacza:

    1. Wybierz CRTC zgodny ze złączem. Każde złącze ma listę dostępnych koderów, a każdy koder wskazuje, z którymi CRTC może być używany. Zawsze jest dostępny co najmniej 1 zgodny CRTC.

      1. Wybierz płaszczyznę zgodną z CRTC.

      2. Utwórz bufory ramki DRM oparte na buforach GPU. Ten proces wygląda tak samo jak w przypadku renderowania na jednym wyświetlaczu.

      3. Połącz płaszczyznę, CRTC i złącze oraz ustaw tryb wideo w CRTC.

        Możesz jednocześnie ustawić tryb wielu wyświetlaczy, używając atomowego interfejsu API do ustawiania tych właściwości DRM dla każdego zestawu złącza, CRTC i płaszczyzny.

    Pełna lista niezbędnych właściwości:

    Cel WłaściwośćTypOpis
    WtyczkaCRTC_IDIdentyfikator CRTCIdentyfikator CRTC do przypisania do złącza
    CRTCMODE_IDIdentyfikator bloba Identyfikator bloba właściwości utworzonego za pomocą funkcji drmModeCreatePropertyBlob, który zawiera strukturę drmModeModeInfo wybranego trybu wideo
    CRTCACTIVEWartość logicznatrue, aby oznaczyć CRTC jako aktywny
    PłaszczyznaFB_IDIdentyfikator bufora ramkiIdentyfikator bufora ramki DRM do wyświetlenia na ekranie
    PłaszczyznaSRC_XPikseleWspółrzędna X prostokąta obrazu źródłowego bufora ramki
    PłaszczyznaSRC_YPikseleWspółrzędna Y prostokąta obrazu źródłowego bufora ramki
    PłaszczyznaSRC_WPunkt stały 16.16Szerokość prostokąta obrazu źródłowego bufora ramki (piksele przesunięte w lewo o 16 bitów)
    PłaszczyznaSRC_HPunkt stały 16.16Wysokość prostokąta obrazu źródłowego bufora ramki (piksele przesunięte w lewo o 16 bitów)
    PłaszczyznaCRTC_XPikseleWspółrzędna X prostokąta obrazu docelowego CRTC
    PłaszczyznaCRTC_YPikseleWspółrzędna Y prostokąta obrazu docelowego CRTC
    PłaszczyznaCRTC_WPikseleSzerokość prostokąta obrazu docelowego CRTC
    PłaszczyznaCRTC_HPikseleWysokość prostokąta obrazu docelowego CRTC
  4. Wejdź do pętli renderowania:

    1. Przed wyrenderowaniem następnej klatki poczekaj na zdarzenie przełączenia strony w CRTC.

    2. Wyrenderuj klatkę i wyświetl ją na ekranie, planując przełączenie strony dla danego CRTC i bufora ramki.