SDV Media : gérer les écrans

SDV Media expose les écrans disponibles aux applications OEM avec l'API Linux DRM.

Interaction entre les composants 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 :

Configurer le rendu sur un seul écran

  1. Ouvrez un appareil DRM (/dev/dri/card*) et utilisez les API Linux DRM (par exemple, via libdrm) 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.

  2. Allouez des tampons avant et arrière avec l'API Linux DRM.

    Nous vous recommandons d'utiliser gbm_bo_create() de minigbm et d'obtenir le descripteur de fichier DMA-BUF avec gbm_bo_get_fd().

  3. Créez des framebuffers GL sauvegardés par les tampons alloués.

    1. Créez un EGLImage à partir du tampon DRM avec eglCreateImageKHR avec EGL_LINUX_DMA_BUF_EXT (à partir de l'extension EGL_EXT_image_dma_buf_import).

    2. Créez une texture GL et utilisez glEGLImageTargetTexture2DOES (à partir de l'extension GL_OES_EGL_image) pour définir le stockage de la texture sur EGLImage à partir de l'étape précédente.

    3. Créez un framebuffer GL et utilisez glFramebufferTexture2D pour définir sa texture de support sur celle créée à l'étape précédente.

  4. Pour afficher un frame :

    1. Associez l'un des tampons de frame GL créés.

    2. Dessinez un frame avec les API GLES habituelles.

    3. Affichez le frame sur un écran : utilisez l'API Linux DRM (drmModeAtomicCommit()) pour envoyer un DRM_MODE_PAGE_FLIP_EVENT avec 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

  1. Ouvrez l'appareil DRM /dev/dri/card* comme dans le flux à un seul écran.

  2. Liste les connecteurs d'écran disponibles.

    Chaque écran est exposé en tant que connecteur DRM distinct du périphérique DRM.

  3. Pour chaque connecteur d'écran :

    1. 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.

      1. Sélectionnez un forfait compatible avec le CRTC.

      2. Créez des framebuffers DRM sauvegardés par les tampons GPU. Ce processus est identique à celui d'une variante à un seul écran.

      3. 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_ID ID CRTC ID du CRTC à attribuer au connecteur
    CRTC MODE_ID ID du blob ID d'un blob de propriété créé à l'aide de drmModeCreatePropertyBlob, contenant la structure drmModeModeInfo du mode vidéo sélectionné
    CRTC ACTIVE Bool true pour marquer le CRTC comme actif
    avion FB_ID ID du framebuffer ID du framebuffer DRM à afficher à l'écran
    avion SRC_X pixels Coordonnée X du rectangle de l'image source du framebuffer
    avion SRC_Y pixels Coordonnée Y du rectangle de l'image source du framebuffer
    avion SRC_W 16.16 fixed point Largeur du rectangle de l'image source du framebuffer (pixels décalés de 16 bits vers la gauche)
    avion SRC_H 16.16 fixed point Hauteur du rectangle de l'image source du framebuffer (pixels décalés de 16 bits vers la gauche)
    avion CRTC_X pixels Coordonnée X du rectangle de l'image de destination du CRTC
    avion CRTC_Y pixels Coordonnée Y du rectangle de l'image de destination du CRTC
    avion CRTC_W pixels Largeur du rectangle de l'image de destination du CRTC
    avion CRTC_H pixels Hauteur du rectangle de l'image de destination du CRTC
  4. Saisissez la boucle de rendu :

    1. Attendez l'événement d'inversion de page sur un CRTC avant d'afficher le frame suivant.

    2. Affichez un frame à l'écran en planifiant un changement de page pour le CRTC et le framebuffer donnés.