SDV Media: Administración de pantallas

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

Interacción entre los componentes del DRM

  • Framebuffer es una fuente de datos de píxeles, respaldada por un búfer de memoria asignado externamente.

  • Plane es una fuente de imágenes que usa CRTC. Está asociada con un framebuffer y puede representar una vista recortada del framebuffer.

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

  • Encoder convierte el resultado de video de CRTC en una forma adecuada para un conector específico.

  • Connector 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 Linux DRM. 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 de usuario. Por ejemplo:

Configura la renderización en una sola pantalla

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

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

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

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

  3. Crea framebuffers GL respaldados por los búferes asignados.

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

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

    3. Crea un framebuffer GL y usa glFramebufferTexture2D para establecer 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 framebuffers GL creados.

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

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

Compón el resultado de video de varias capas

Para la composición de varias capas (varios planos) 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 Configura la renderización en varias pantallas para obtener más detalles.

Configura la renderización 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 habrá al menos un CRTC compatible.

      1. Selecciona un plano compatible con el CRTC.

      2. Crea framebuffers DRM respaldados por los búferes de GPU. Este proceso es el mismo que para la variante de una sola pantalla.

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

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

    La lista completa de propiedades necesarias es la siguiente:

    Objetivo Propiedad Tipo Descripción
    conector CRTC_ID ID de CRTC ID del CRTC que se asignará al conector
    CRTC MODE_ID ID de blob ID de un blob de propiedad creado con drmModeCreatePropertyBlob, que contiene la estructura drmModeModeInfo del modo de video seleccionado
    CRTC ACTIVE bool true para marcar el CRTC como activo
    avión FB_ID ID de framebuffer ID del framebuffer DRM que se mostrará en la pantalla
    avión SRC_X píxeles Coordenada X del rectángulo de la imagen de origen del framebuffer
    avión SRC_Y píxeles Coordenada Y del rectángulo de la imagen de origen del framebuffer
    avión SRC_W punto fijo 16.16 Ancho del rectángulo de la imagen de origen del framebuffer (píxeles desplazados 16 bits a la izquierda)
    avión SRC_H punto fijo 16.16 Alto del rectángulo de la imagen de origen del framebuffer (píxeles desplazados 16 bits a la izquierda)
    avión CRTC_X píxeles Coordenada X del rectángulo de la imagen de destino del CRTC
    avión CRTC_Y píxeles Coordenada Y del rectángulo de la imagen de destino del CRTC
    avión CRTC_W píxeles Ancho del rectángulo de la imagen de destino del CRTC
    avión CRTC_H píxeles Alto 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 muéstralo en la pantalla programando un cambio de página para el CRTC y el framebuffer determinados.