SDV Media espone i display disponibili alle applicazioni OEM con l'API DRM di Linux.
Il framebuffer è un'origine di dati pixel, supportata da un buffer di memoria allocato esternamente.
Il 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 inviare l'output a più codificatori.
Il codificatore converte l'output video da CRTC in un formato adatto a un connettore specifico.
Il connettore rappresenta un connettore di visualizzazione disponibile. Ad esempio, una porta HDMI.
Per una descrizione più approfondita, consulta:
Piattaforma API
SDV Media fornisce le interfacce DRM di Linux. Sebbene sia possibile utilizzarle direttamente tramite la chiamata di sistema ioctl, per lo sviluppo di applicazioni è consigliabile utilizzare una libreria di assistenza dello spazio utente. Ad esempio:
drm-rscrate per Rust (consigliato),libdrmper C/C++.drm-kmspagina man fornisce 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 es. tramitelibdrm) sul relativo descrittore di 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 i buffer anteriori e posteriori con l'API DRM di Linux.
Ti consigliamo di utilizzare
minigbm'sgbm_bo_create()e di recuperare il descrittore del file DMA-BUF congbm_bo_get_fd().Crea framebuffer GL supportati dai buffer allocati.
Crea un
EGLImagedal buffer DRM coneglCreateImageKHRconEGL_LINUX_DMA_BUF_EXT(dall'EGL_EXT_image_dma_buf_importestensione).Crea una texture GL e utilizza
glEGLImageTargetTexture2DOES(dall'GL_OES_EGL_imageestensione) per impostare l'archiviazione della texture suEGLImagedal passaggio precedente.Crea un framebuffer GL e utilizza
glFramebufferTexture2Dper impostare la sua texture di supporto su quella creata nel passaggio precedente.
Per eseguire il rendering di un frame:
Collega uno dei framebuffer GL creati.
Disegna un frame con le normali API GLES.
Visualizza il frame su uno schermo: utilizza l'API DRM di Linux (
drmModeAtomicCommit()) per inviare unDRM_MODE_PAGE_FLIP_EVENTcon il descrittore di file DMA-BUF utilizzato dal framebuffer GL collegato.
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 un connettore DRM separato (display virtuale) e li mappa alla posizione / pipeline 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 display singolo.Elenca i connettori di visualizzazione disponibili.
Ogni display viene esposto come un connettore DRM separato del dispositivo DRM.
Per ogni connettore di visualizzazione:
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. Sarà sempre presente almeno un CRTC compatibile.
Seleziona un piano compatibile con il CRTC.
Crea framebuffer DRM supportati dai buffer GPU. Questa procedura è identica a quella della variante a display singolo.
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 set di connettori, CRTC e 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 la strutturadrmModeModeInfodella modalità video selezionataCRTC ACTIVEbool trueper contrassegnare il CRTC come attivopiano FB_IDID framebuffer ID del framebuffer DRM da visualizzare sullo schermo piano SRC_Xpixel Coordinata X del rettangolo dell'immagine di origine del framebuffer piano SRC_Ypixel Coordinata Y del rettangolo dell'immagine di origine del framebuffer piano SRC_WPunto fisso 16.16 Larghezza del rettangolo dell'immagine di origine del framebuffer (pixel spostati a sinistra di 16 bit) piano SRC_HPunto fisso 16.16 Altezza del rettangolo dell'immagine di origine del framebuffer (pixel spostati a sinistra di 16 bit) piano CRTC_Xpixel Coordinata X del rettangolo dell'immagine di destinazione CRTC piano CRTC_Ypixel Coordinata Y del rettangolo dell'immagine di destinazione CRTC piano CRTC_Wpixel Larghezza del rettangolo dell'immagine di destinazione CRTC piano CRTC_Hpixel Altezza del rettangolo dell'immagine di destinazione CRTC Inserisci il loop di rendering:
Attendi l'evento di inversione di pagina su un CRTC prima di eseguire il rendering del frame successivo.
Esegui il rendering di un frame e visualizzalo sullo schermo pianificando un'inversione di pagina per il CRTC+framebuffer specificato.