SDV Media espone i display disponibili alle app OEM con l'API Linux DRM.
Figura 1. Interazione tra i componenti DRM.
Un framebuffer è un'origine di dati dei pixel, supportata da un buffer di memoria allocato esternamente.
Un piano è un'origine immagine utilizzata da CRTC. È associato a un framebuffer e può rappresentare una visualizzazione ritagliata del framebuffer.
CRTC rappresenta una pipeline di visualizzazione complessiva. Può combinare più piani per creare l'output video finale e inviarlo a più codificatori.
Un encoder converte l'output video da CRTC in un formato adatto a un connettore specifico.
Un connettore rappresenta un connettore del display disponibile. Ad esempio, una porta HDMI.
Per una descrizione più dettagliata, consulta:
Piattaforma API
SDV Media fornisce le interfacce DRM di Linux. Sebbene possano essere utilizzate direttamente
utilizzando la chiamata di sistema ioctl, per lo sviluppo di applicazioni è consigliabile utilizzare una
libreria helper userspace. Ad esempio:
- Cassa
drm-rsper Rust (consigliata) libdrmper C/C++. La pagina di manualedrm-kmsfornisce una panoramica completa delle API e del loro utilizzo.
Configurare il rendering su un singolo display
Apri un dispositivo DRM (
/dev/dri/card*) e utilizza le API DRM di Linux, ad esempio tramitelibdrm, sul relativo descrittore del file per selezionare il display e la relativa modalità.In genere, il sistema host espone un solo dispositivo GPU virtuale, che viene visualizzato come
/dev/dri/card0.Alloca buffer anteriori e posteriori con l'API DRM di Linux.
Ti consigliamo di utilizzare
minigbmgbm_bo_create()e ottenere il descrittore del file DMA-BUF congbm_bo_get_fd().Crea frame buffer GL supportati dai buffer allocati.
Crea un
EGLImagedal buffer DRM coneglCreateImageKHRconEGL_LINUX_DMA_BUF_EXT(dall'estensioneEGL_EXT_image_dma_buf_import).Crea una texture GL e utilizza
glEGLImageTargetTexture2DOES(dall'estensioneGL_OES_EGL_image) per impostare l'archiviazione della texture suEGLImagedel passaggio precedente.Crea un framebuffer GL e utilizza
glFramebufferTexture2Dper impostare la relativa texture di supporto su quella creata nel passaggio precedente.
Per eseguire il rendering di un frame:
Associa uno dei framebuffer GL creati.
Disegna un frame con le solite API GLES.
Visualizza il frame su uno schermo: utilizza l'API Linux DRM (
drmModeAtomicCommit()) per inviare unDRM_MODE_PAGE_FLIP_EVENTcon il descrittore di file DMA-BUF utilizzato dal framebuffer GL associato.
Comporre l'output video da più livelli
Per la composizione multilivello (multipiano) con accelerazione hardware, ci affidiamo al sistema host che espone ogni livello come connettore DRM separato (display virtuale) e li mappa alla pipeline / posizione hardware corretta.
Per maggiori dettagli, consulta Configurare il rendering su più display.
Configurare il rendering su più display
Apri il dispositivo DRM
/dev/dri/card*come nel flusso a un solo display.Elenca i connettori di visualizzazione disponibili.
Ogni display viene esposto come connettore DRM separato del dispositivo DRM.
Per ogni connettore del display:
Seleziona un CRTC compatibile con il connettore. Ogni connettore ha un elenco di codificatori disponibili e ogni codificatore indica con quali CRTC può essere utilizzato. Esiste sempre almeno un CRTC compatibile.
Seleziona un piano compatibile con il CRTC.
Crea frame buffer DRM supportati dai buffer GPU. Questa procedura è identica a quella per la variante a un solo display.
Collega il piano, il CRTC e il connettore e imposta la modalità video sul CRTC.
È possibile impostare la modalità di più display contemporaneamente utilizzando l'API atomica per impostare le seguenti proprietà DRM per ogni connettore, CRTC e set di piani.
L'elenco completo delle proprietà necessarie:
Target Proprietà Tipo Descrizione Connettore CRTC_IDID CRTC ID del CRTC da assegnare al connettore CRTC MODE_IDID blob ID di un blob di proprietà creato utilizzando drmModeCreatePropertyBlob, contenente lo structdrmModeModeInfodella modalità video selezionataCRTC ACTIVEBooleano trueper contrassegnare il CRTC come attivoAereo FB_IDID framebuffer ID del framebuffer DRM da visualizzare sullo schermo Aereo SRC_XPixel Coordinata X del rettangolo dell'immagine di origine del framebuffer Aereo SRC_YPixel Coordinata Y del rettangolo dell'immagine di origine del framebuffer Aereo SRC_W16.16 fixed point Larghezza del rettangolo dell'immagine di origine del framebuffer (pixel spostati a sinistra di 16 bit) Aereo SRC_H16.16 fixed point Altezza del rettangolo dell'immagine di origine del framebuffer (pixel spostati a sinistra di 16 bit) Aereo CRTC_XPixel Coordinata X del rettangolo dell'immagine di destinazione CRTC Aereo CRTC_YPixel Coordinata Y del rettangolo dell'immagine di destinazione CRTC Aereo CRTC_WPixel Larghezza del rettangolo dell'immagine di destinazione CRTC Aereo CRTC_HPixel Altezza del rettangolo dell'immagine di destinazione CRTC Inserisci il ciclo di rendering:
Attendi l'evento di cambio pagina su un CRTC prima di eseguire il rendering del frame successivo.
Esegui il rendering di un frame e visualizzalo sullo schermo pianificando un cambio di pagina per CRTC e framebuffer specifici.