SDV Media udostępnia dostępne wyświetlacze aplikacjom OEM za pomocą interfejsu Linux DRM API.
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:
drm-rspakiet dla języka Rust (zalecany),libdrmdla języka C/C++.drm-kmsstrona podręcznika zawiera szczegółowy opis interfejsów API i ich użycia.
Konfigurowanie renderowania na jednym wyświetlaczu
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.Przydziel bufor przedni i tylny za pomocą interfejsu Linux DRM API.
Zalecamy używanie
minigbm'sgbm_bo_create()i pobieranie deskryptora pliku DMA-BUF za pomocągbm_bo_get_fd().Utwórz bufory ramki GL oparte na przydzielonych buforach.
Utwórz
EGLImagez bufora DRM za pomocąeglCreateImageKHRzEGL_LINUX_DMA_BUF_EXT(zEGL_EXT_image_dma_buf_importrozszerzenia).Utwórz teksturę GL i użyj
glEGLImageTargetTexture2DOES(zGL_OES_EGL_imagerozszerzenia), aby ustawić pamięć tekstury naEGLImagez poprzedniego kroku.Utwórz bufor ramki GL i użyj
glFramebufferTexture2D, aby ustawić jego teksturę zapasową na teksturę utworzoną w poprzednim kroku.
Aby wyrenderować klatkę:
Powiąż jeden z utworzonych buforów ramki GL.
Narysuj klatkę za pomocą zwykłych interfejsów GLES API.
Wyświetl klatkę na ekranie: użyj interfejsu Linux DRM API (
drmModeAtomicCommit()), aby wysłaćDRM_MODE_PAGE_FLIP_EVENTz 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
Otwórz urządzenie DRM
/dev/dri/card*tak jak w przypadku renderowania na jednym wyświetlaczu.Wyświetl listę dostępnych złączy wyświetlacza.
Każdy wyświetlacz jest udostępniany jako osobne złącze DRM urządzenia DRM.
W przypadku każdego złącza wyświetlacza:
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.
Wybierz płaszczyznę zgodną z CRTC.
Utwórz bufory ramki DRM oparte na buforach GPU. Ten proces wygląda tak samo jak w przypadku renderowania na jednym wyświetlaczu.
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ść Typ Opis Wtyczka CRTC_IDIdentyfikator CRTC Identyfikator CRTC do przypisania do złącza CRTC MODE_IDIdentyfikator bloba Identyfikator bloba właściwości utworzonego za pomocą funkcji drmModeCreatePropertyBlob, który zawiera strukturędrmModeModeInfowybranego trybu wideoCRTC ACTIVEWartość logiczna true, aby oznaczyć CRTC jako aktywnyPłaszczyzna FB_IDIdentyfikator bufora ramki Identyfikator bufora ramki DRM do wyświetlenia na ekranie Płaszczyzna SRC_XPiksele Współrzędna X prostokąta obrazu źródłowego bufora ramki Płaszczyzna SRC_YPiksele Współrzędna Y prostokąta obrazu źródłowego bufora ramki Płaszczyzna SRC_WPunkt stały 16.16 Szerokość prostokąta obrazu źródłowego bufora ramki (piksele przesunięte w lewo o 16 bitów) Płaszczyzna SRC_HPunkt stały 16.16 Wysokość prostokąta obrazu źródłowego bufora ramki (piksele przesunięte w lewo o 16 bitów) Płaszczyzna CRTC_XPiksele Współrzędna X prostokąta obrazu docelowego CRTC Płaszczyzna CRTC_YPiksele Współrzędna Y prostokąta obrazu docelowego CRTC Płaszczyzna CRTC_WPiksele Szerokość prostokąta obrazu docelowego CRTC Płaszczyzna CRTC_HPiksele Wysokość prostokąta obrazu docelowego CRTC Wejdź do pętli renderowania:
Przed wyrenderowaniem następnej klatki poczekaj na zdarzenie przełączenia strony w CRTC.
Wyrenderuj klatkę i wyświetl ją na ekranie, planując przełączenie strony dla danego CRTC i bufora ramki.