SDV Media expose les écrans disponibles aux applications OEM avec l'API Linux DRM.
Figure 1. Interaction entre les composants DRM.
Un framebuffer est une source de données de pixels, soutenue par une mémoire tampon allouée en externe.
Un plan est une source d'image utilisée par CRTC. Il est associé à un framebuffer et peut représenter une vue recadrée de celui-ci.
CRTC représente un pipeline d'affichage global. Il peut combiner plusieurs plans pour créer la sortie vidéo finale et la distribuer à plusieurs encodeurs.
Un encodeur convertit la sortie vidéo de CRTC dans un format adapté à un connecteur spécifique.
Un connecteur représente un connecteur d'affichage disponible. Par exemple, un port HDMI.
Pour une description plus détaillée, consultez les ressources suivantes :
Surface d'API
SDV Media fournit les interfaces Linux DRM. Bien qu'elles puissent être utilisées 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 :
drm-rscaisse pour Rust (recommandé)libdrmpour C/C++.drm-kmspage de manuel fournit une présentation complète 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 règle générale, le système hôte n'expose qu'un seul appareil GPU virtuel, qui s'affiche sous la forme
/dev/dri/card0.Allouez des tampons avant et arrière avec l'API Linux DRM.
Il est recommandé d'utiliser
minigbm'sgbm_bo_create()et d'obtenir le descripteur de fichier DMA-BUF avecgbm_bo_get_fd().Créez des framebuffers GL soutenus par les tampons alloués.
Créez un
EGLImageà partir du tampon DRM aveceglCreateImageKHRavecEGL_LINUX_DMA_BUF_EXT(à partir deEGL_EXT_image_dma_buf_importextension).Créez une texture GL et utilisez
glEGLImageTargetTexture2DOES(à partir de l'extensionGL_OES_EGL_image) pour définir le stockage de la texture sur leEGLImagede l'étape précédente.Créez un framebuffer GL et utilisez
glFramebufferTexture2Dpour définir sa texture de sauvegarde sur celle créée à l'étape précédente.
Pour afficher un frame :
Associez l'un des framebuffers GL créés.
Dessinez un frame avec les API GLES habituelles.
Affichez le frame à l'é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 calque en tant que connecteur DRM distinct (affichage virtuel) et qui les mappe à l'emplacement / au pipeline matériel approprié.
Pour en savoir plus, consultez la section Configurer le rendu sur plusieurs écrans.
Configurer le rendu sur plusieurs écrans
Ouvrez l'appareil DRM
/dev/dri/card*comme dans le flux d'affichage unique.Répertoriez les connecteurs d'affichage disponibles.
Chaque écran est exposé en tant que connecteur DRM distinct de l'appareil DRM.
Pour chaque connecteur d'affichage :
Sélectionnez un CRTC compatible avec le connecteur. Chaque connecteur comporte une liste d'encodeurs disponibles, et chaque encodeur indique les CRTC avec lesquels il peut être utilisé. Il existe toujours au moins un CRTC compatible.
Sélectionnez un plan compatible avec le CRTC.
Créez des framebuffers DRM soutenus par des tampons GPU. Ce processus est identique à celui de la variante à affichage unique.
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 à l'aide de l'API atomique pour définir les propriétés DRM suivantes pour chaque ensemble de connecteurs, de CRTC et de plans.
Liste complète des propriétés nécessaires :
Cible Propriété Type Description Connecteur CRTC_IDID du CRTC ID du CRTC à attribuer au connecteur CRTC MODE_IDID de blob ID d'un blob de propriété créé à l'aide de drmModeCreatePropertyBlob, contenant la structuredrmModeModeInfodu mode vidéo sélectionnéCRTC ACTIVEBooléen truepour marquer le CRTC comme actifPlan FB_IDID du framebuffer ID du framebuffer DRM à afficher à l'écran Plan SRC_XPixels Coordonnée X du rectangle de l'image source du framebuffer Plan SRC_YPixels Coordonnée Y du rectangle de l'image source du framebuffer Plan SRC_WPoint fixe 16.16 Largeur du rectangle de l'image source du framebuffer (pixels décalés de 16 bits vers la gauche) Plan SRC_HPoint fixe 16.16 Hauteur du rectangle de l'image source du framebuffer (pixels décalés de 16 bits vers la gauche) Plan CRTC_XPixels Coordonnée X du rectangle de l'image de destination du CRTC Plan CRTC_YPixels Coordonnée Y du rectangle de l'image de destination du CRTC Plan CRTC_WPixels Largeur du rectangle de l'image de destination du CRTC Plan CRTC_HPixels Hauteur du rectangle de l'image de destination du CRTC Saisissez la boucle de rendu :
Attendez l'événement de retournement de page sur un CRTC avant d'afficher le frame suivant.
Affichez un frame à l'écran en planifiant un retournement de page pour un CRTC+framebuffer donné.