SDV Media expose les écrans disponibles aux applications OEM avec l'API Linux DRM.
Un Framebuffer est une source de données de pixels, soutenue par un tampon de mémoire alloué en externe.
Plane est une source d'image utilisée par CRTC. Il est associé à un tampon de frame et peut représenter une vue recadrée du tampon de frame.
CRTC représente un pipeline d'affichage global. Il peut combiner plusieurs plans pour créer la vidéo de sortie finale et l'envoyer à plusieurs encodeurs.
L'encodeur convertit la sortie vidéo du CRTC en un format adapté à un connecteur spécifique.
Connecteur représente un connecteur d'écran disponible. Par exemple, un port HDMI.
Pour une description plus détaillée, consultez :
Surface d'API
SDV Media fournit les interfaces Linux DRM. Bien qu'ils puissent être utilisés directement à l'aide de l'appel système ioctl, il est recommandé d'utiliser une bibliothèque d'assistance de l'espace utilisateur pour le développement d'applications. Exemple :
- Caisse
drm-rspour Rust (recommandée) libdrmpour C/C++. La page de manueldrm-kmsfournit une présentation détaillée des API et de leur utilisation.
Configurer le rendu sur un seul écran
Ouvrez un appareil DRM (
/dev/dri/card*) et utilisez les API Linux DRM (par exemple, vialibdrm) sur son descripteur de fichier pour sélectionner l'écran et son mode.En général, le système hôte n'expose qu'un seul GPU virtuel, qui s'affiche sous la forme
/dev/dri/card0.Allouez des tampons avant et arrière avec l'API Linux DRM.
Nous vous recommandons d'utiliser
gbm_bo_create()deminigbmet d'obtenir le descripteur de fichier DMA-BUF avecgbm_bo_get_fd().Créez des framebuffers GL sauvegardés par les tampons alloués.
Créez un
EGLImageà partir du tampon DRM aveceglCreateImageKHRavecEGL_LINUX_DMA_BUF_EXT(à partir de l'extensionEGL_EXT_image_dma_buf_import).Créez une texture GL et utilisez
glEGLImageTargetTexture2DOES(à partir de l'extensionGL_OES_EGL_image) pour définir le stockage de la texture surEGLImageà partir de l'étape précédente.Créez un framebuffer GL et utilisez
glFramebufferTexture2Dpour définir sa texture de support sur celle créée à l'étape précédente.
Pour afficher un frame :
Associez l'un des tampons de frame GL créés.
Dessinez un frame avec les API GLES habituelles.
Affichez le frame sur un écran : utilisez l'API Linux DRM (
drmModeAtomicCommit()) pour envoyer unDRM_MODE_PAGE_FLIP_EVENTavec le descripteur de fichier DMA-BUF utilisé par le framebuffer GL lié.
Composer une sortie vidéo à partir de plusieurs calques
Pour la composition multicouche (multiplan) accélérée par le matériel, nous nous appuyons sur le système hôte qui expose chaque couche en tant que connecteur DRM distinct (affichage virtuel) et les mappe à l'emplacement / au pipeline matériel approprié.
Pour en savoir plus, consultez Configurer le rendu sur plusieurs écrans.
Configurer le rendu sur plusieurs écrans
Ouvrez l'appareil DRM
/dev/dri/card*comme dans le flux à un seul écran.Liste les connecteurs d'écran disponibles.
Chaque écran est exposé en tant que connecteur DRM distinct du périphérique DRM.
Pour chaque connecteur d'écran :
Sélectionnez un CRTC compatible avec le connecteur. Chaque connecteur dispose d'une liste d'encodeurs disponibles, et chaque encodeur indique les CRTC avec lesquels il peut être utilisé. Il y aura toujours au moins un CRTC compatible.
Sélectionnez un forfait compatible avec le CRTC.
Créez des framebuffers DRM sauvegardés par les tampons GPU. Ce processus est identique à celui d'une variante à un seul écran.
Connectez le plan, le CRTC et le connecteur, puis définissez le mode vidéo sur le CRTC.
Il est possible de définir le mode de plusieurs écrans en même temps en utilisant l'API atomique pour définir les propriétés DRM suivantes pour chaque ensemble de connecteurs, de CRTC et de plans.
Voici la liste complète des propriétés nécessaires :
Cible Propriété Type Description connecteur CRTC_IDID CRTC ID du CRTC à attribuer au connecteur CRTC MODE_IDID du blob ID d'un blob de propriété créé à l'aide de drmModeCreatePropertyBlob, contenant la structuredrmModeModeInfodu mode vidéo sélectionnéCRTC ACTIVEBool truepour marquer le CRTC comme actifavion FB_IDID du framebuffer ID du framebuffer DRM à afficher à l'écran avion SRC_Xpixels Coordonnée X du rectangle de l'image source du framebuffer avion SRC_Ypixels Coordonnée Y du rectangle de l'image source du framebuffer avion SRC_W16.16 fixed point Largeur du rectangle de l'image source du framebuffer (pixels décalés de 16 bits vers la gauche) avion SRC_H16.16 fixed point Hauteur du rectangle de l'image source du framebuffer (pixels décalés de 16 bits vers la gauche) avion CRTC_Xpixels Coordonnée X du rectangle de l'image de destination du CRTC avion CRTC_Ypixels Coordonnée Y du rectangle de l'image de destination du CRTC avion CRTC_Wpixels Largeur du rectangle de l'image de destination du CRTC avion CRTC_Hpixels Hauteur du rectangle de l'image de destination du CRTC Saisissez la boucle de rendu :
Attendez l'événement d'inversion de page sur un CRTC avant d'afficher le frame suivant.
Affichez un frame à l'écran en planifiant un changement de page pour le CRTC et le framebuffer donnés.