SDV Media udostępnia dostępne wyświetlacze aplikacjom OEM za pomocą interfejsu Linux DRM API.
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:
drm-rspakietu dla Rusta (zalecany),libdrmw przypadku języków C/C++.drm-kmsStrona podręcznika zawiera obszerne omówienie interfejsów API i ich zastosowań.
Konfigurowanie renderowania na jednym wyświetlaczu
Otwórz urządzenie DRM (
/dev/dri/card*) i użyj interfejsów API DRM systemu Linux (np. przezlibdrm) 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.Przydzielanie buforów przednich i tylnych za pomocą interfejsu Linux DRM API.
Zalecamy użycie
minigbmgbm_bo_create()i pobranie 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(z rozszerzeniaEGL_EXT_image_dma_buf_import).Utwórz teksturę GL i użyj
glEGLImageTargetTexture2DOES(z rozszerzeniaGL_OES_EGL_image), aby ustawić pamięć tekstury naEGLImagez poprzedniego kroku.Utwórz bufor ramki GL i użyj
glFramebufferTexture2D, aby ustawić teksturę zapasową na teksturę utworzoną w poprzednim kroku.
Aby wyrenderować klatkę:
Powiąż jeden z utworzonych buforów ramki GL.
Narysuj ramkę za pomocą zwykłych interfejsów API GLES.
Wyświetl ramkę 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 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
Otwórz urządzenie DRM
/dev/dri/card*, tak jak w przypadku przepływu z jednym wyświetlaczem.Wyświetl listę dostępnych złączy wyświetlacza.
Każdy wyświetlacz jest udostępniany jako osobne złącze DRM urządzenia DRM.
Dla każdego złącza wyświetlacza:
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.
Wybierz samolot zgodny z wymaganiami CRTC.
Tworzenie buforów ramki DRM opartych na buforach GPU. Ten proces wygląda tak samo jak w przypadku wariantu z jednym wyświetlaczem.
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_IDCRTC ID Identyfikator CRTC do przypisania do oprogramowania sprzęgającego CRTC MODE_IDidentyfikator obiektu blob, Identyfikator obiektu usługi utworzonego za pomocą drmModeCreatePropertyBlob, zawierającego strukturędrmModeModeInfowybranego trybu wideo.CRTC ACTIVEbool true, aby oznaczyć CRTC jako aktywny.samolotem FB_IDIdentyfikator bufora ramki Identyfikator bufora ramki DRM do wyświetlania na ekranie samolotem SRC_Xpikseli Współrzędna X prostokąta obrazu źródłowego bufora ramki samolotem SRC_Ypikseli Współrzędna Y prostokąta obrazu źródłowego bufora ramki samolotem SRC_W16.16 fixed point szerokość prostokąta obrazu źródłowego bufora ramki (piksele przesunięte w lewo o 16 bitów); samolotem SRC_H16.16 fixed point wysokość prostokąta obrazu źródłowego bufora ramki (piksele przesunięte w lewo o 16 bitów); samolotem CRTC_Xpikseli Współrzędna X prostokąta obrazu docelowego CRTC samolotem CRTC_Ypikseli Współrzędna Y prostokąta obrazu docelowego CRTC samolotem CRTC_Wpikseli szerokość prostokąta obrazu miejsca docelowego CRTC; samolotem CRTC_Hpikseli wysokość prostokąta obrazu docelowego CRTC, Wpisz pętlę renderowania:
Przed renderowaniem następnej klatki poczekaj na zdarzenie przełączenia strony na kontrolerze CRTC.
Wyrenderuj ramkę i wyświetl ją na ekranie, planując przełączenie strony dla danego kontrolera CRTC i bufora ramki.