SDV Media: Administra pantallas

SDV Media expone las pantallas disponibles a las apps del OEM con la API de DRM de Linux.

Interacción entre los componentes del DRM

Figura 1: Interacción entre los componentes del DRM

  • Un búfer de fotogramas es una fuente de datos de píxeles respaldada por algún búfer de memoria asignado de forma externa.

  • Un plano es una fuente de imágenes que usa el CRTC. Se asocia con un búfer de fotogramas y puede representar una vista recortada del búfer de fotogramas.

  • CRTC representa una canalización de pantalla general. Puede combinar varios planos para crear el video final y enviar el resultado a varios codificadores.

  • Un codificador convierte la salida de video de la CRTC en un formato adecuado para un conector específico.

  • Un conector representa un conector de pantalla disponible. Por ejemplo, un puerto HDMI.

Para obtener una descripción más detallada, consulta los siguientes recursos:

Superficie de la API

SDV Media proporciona las interfaces de DRM de Linux. Si bien se pueden usar directamente con la llamada al sistema ioctl, para el desarrollo de aplicaciones, se recomienda usar una biblioteca auxiliar del espacio del usuario. Por ejemplo:

Cómo configurar la renderización en una sola pantalla

  1. Abre un dispositivo DRM (/dev/dri/card*) y usa las APIs de DRM de Linux, por ejemplo, a través de libdrm, en su descriptor de archivos para seleccionar la pantalla y su modo.

    Por lo general, el sistema host solo expone un dispositivo de GPU virtual, que aparece como /dev/dri/card0.

  2. Asigna búferes frontales y posteriores con la API de DRM de Linux.

    Se recomienda usar el gbm_bo_create() de minigbm y obtener el descriptor de archivo DMA-BUF con gbm_bo_get_fd().

  3. Crea búferes de fotogramas de GL respaldados por los búferes asignados.

    1. Crea un EGLImage a partir del búfer de DRM con eglCreateImageKHR y EGL_LINUX_DMA_BUF_EXT (de la extensión EGL_EXT_image_dma_buf_import).

    2. Crea una textura de GL y usa glEGLImageTargetTexture2DOES (de la extensión GL_OES_EGL_image) para establecer el almacenamiento de la textura en el EGLImage del paso anterior.

    3. Crea un búfer de fotogramas de GL y usa glFramebufferTexture2D para configurar su textura de respaldo en la que se creó en el paso anterior.

  4. Para renderizar un fotograma, haz lo siguiente:

    1. Vincula uno de los búferes de fotogramas de GL creados.

    2. Dibuja un fotograma con las APIs de GLES habituales.

    3. Muestra el fotograma en una pantalla: Usa la API de DRM de Linux (drmModeAtomicCommit()) para enviar un DRM_MODE_PAGE_FLIP_EVENT con el descriptor de archivo DMA-BUF que usa el búfer de fotogramas de GL vinculado.

Cómo componer la salida de video a partir de varias capas

Para la composición multicapa (multiplano) acelerada por hardware, dependemos de que el sistema host exponga cada capa como un conector DRM independiente (pantalla virtual) y las asigne a la ubicación o canalización de hardware correctos.

Consulta Cómo configurar la renderización en varias pantallas para obtener más detalles.

Cómo configurar el renderizado en varias pantallas

  1. Abre el dispositivo DRM /dev/dri/card* como en el flujo de una sola pantalla.

  2. Enumera los conectores de pantalla disponibles.

    Cada pantalla se expone como un conector DRM independiente del dispositivo DRM.

  3. Para cada conector de pantalla, haz lo siguiente:

    1. Selecciona un CRTC compatible con el conector. Cada conector tiene una lista de codificadores disponibles, y cada codificador indica con qué CRTC se puede usar. Siempre hay al menos un CRTC compatible.

      1. Selecciona un plano compatible con el CRTC.

      2. Crea búferes de fotogramas DRM respaldados por búferes de GPU. Este proceso es igual que para la variante de una sola pantalla.

      3. Conecta el plano, el CRTC y el conector, y configura el modo de video en el CRTC.

        Es posible establecer el modo de varias pantallas al mismo tiempo usando la API atómica para establecer las siguientes propiedades de DRM para cada conector, CRTC y conjunto de planos.

    A continuación, se muestra la lista completa de las propiedades necesarias:

    Objetivo PropiedadTipoDescripción
    ConectorCRTC_IDID del CRTCID del CRTC que se asignará al conector
    CRTCMODE_IDID de BLOB Es el ID de un blob de propiedad creado con drmModeCreatePropertyBlob, que contiene el struct drmModeModeInfo del modo de video seleccionado.
    CRTCACTIVEBooleanotrue para marcar el CRTC como activo
    AviónFB_IDID del búfer de fotogramasID del búfer de fotogramas de DRM que se mostrará en la pantalla
    AviónSRC_XPíxelesCoordenada X del rectángulo de la imagen de origen del búfer de fotogramas
    AviónSRC_YPíxelesCoordenada Y del rectángulo de la imagen de origen del búfer de fotogramas
    AviónSRC_W16.16 punto fijoAncho del rectángulo de la imagen de origen del búfer de fotogramas (píxeles desplazados 16 bits hacia la izquierda)
    AviónSRC_H16.16 punto fijoAltura del rectángulo de la imagen fuente del búfer de fotogramas (píxeles desplazados 16 bits hacia la izquierda)
    AviónCRTC_XPíxelesCoordenada X del rectángulo de la imagen de destino del CRTC
    AviónCRTC_YPíxelesCoordenada Y del rectángulo de la imagen de destino del CRTC
    AviónCRTC_WPíxelesAncho del rectángulo de la imagen de destino del CRTC
    AviónCRTC_HPíxelesAltura del rectángulo de la imagen de destino del CRTC
  4. Ingresa al bucle de renderización:

    1. Espera el evento de cambio de página en un CRTC antes de renderizar el siguiente fotograma.

    2. Renderiza un fotograma y lo muestra en la pantalla programando un cambio de página para el CRTC y el búfer de fotogramas determinados.