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

  • Bufor ramki to źródło danych pikseli, które jest obsługiwane przez zewnętrzny bufor pamięci.

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

  • CRTC to ogólny potok wyświetlania. Może łączyć wiele płaszczyzn, aby utworzyć końcowy film, i przesyłać go do wielu enkoderów.

  • Koder konwertuje wyjście wideo z CRTC na format odpowiedni dla określonego złącza.

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

Szczegółowy opis 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 syscall, ale w przypadku tworzenia aplikacji zalecamy używanie biblioteki pomocniczej przestrzeni użytkownika. Przykład:

Konfigurowanie renderowania na jednym wyświetlaczu

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

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

  2. Przydzielanie buforów przednich i tylnych za pomocą interfejsu Linux DRM API.

    Zalecamy użycie minigbm gbm_bo_create() i pobranie 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ą eglCreateImageKHREGL_LINUX_DMA_BUF_EXT (z rozszerzenia EGL_EXT_image_dma_buf_import).

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

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

  4. Aby wyrenderować klatkę:

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

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

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

Tworzenie wyjścia wideo z wielu warstw

W przypadku wielowarstwowej kompozycji z akceleracją sprzętową (wielopłaszczyznowej) polegamy na tym, że system hosta udostępnia każdą warstwę jako osobne złącze DRM (wirtualny wyświetlacz) i mapuje je na odpowiednią lokalizację sprzętową 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 przepływu z jednym wyświetlaczem.

  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. Dla każdego złącza wyświetlacza:

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

      1. Wybierz samolot zgodny z wymaganiami CRTC.

      2. Tworzenie buforów ramki DRM opartych na buforach GPU. Ten proces wygląda tak samo jak w przypadku wariantu z jednym wyświetlaczem.

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

        Tryb wielu wyświetlaczy można ustawić jednocześnie, korzystając z 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ść Typ Opis
    łącznik CRTC_ID CRTC ID Identyfikator CRTC do przypisania do oprogramowania sprzęgającego
    CRTC MODE_ID identyfikator obiektu blob, Identyfikator obiektu usługi utworzonego za pomocą drmModeCreatePropertyBlob, zawierającego strukturę drmModeModeInfo wybranego trybu wideo.
    CRTC ACTIVE bool true, aby oznaczyć CRTC jako aktywny.
    samolotem FB_ID Identyfikator bufora ramki Identyfikator bufora ramki DRM do wyświetlania na ekranie
    samolotem SRC_X pikseli Współrzędna X prostokąta obrazu źródłowego bufora ramki
    samolotem SRC_Y pikseli Współrzędna Y prostokąta obrazu źródłowego bufora ramki
    samolotem SRC_W 16.16 fixed point szerokość prostokąta obrazu źródłowego bufora ramki (piksele przesunięte w lewo o 16 bitów);
    samolotem SRC_H 16.16 fixed point wysokość prostokąta obrazu źródłowego bufora ramki (piksele przesunięte w lewo o 16 bitów);
    samolotem CRTC_X pikseli Współrzędna X prostokąta obrazu docelowego CRTC
    samolotem CRTC_Y pikseli Współrzędna Y prostokąta obrazu docelowego CRTC
    samolotem CRTC_W pikseli szerokość prostokąta obrazu miejsca docelowego CRTC;
    samolotem CRTC_H pikseli wysokość prostokąta obrazu docelowego CRTC,
  4. Wpisz pętlę renderowania:

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

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