SDV Media expone las pantallas disponibles a las apps del OEM con la API de DRM de Linux.
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:
- Crate
drm-rspara Rust (recomendado) libdrmpara C/C++. La página de manual dedrm-kmsproporciona una descripción general extensa de las APIs y su uso.
Cómo configurar la renderización en una sola pantalla
Abre un dispositivo DRM (
/dev/dri/card*) y usa las APIs de DRM de Linux, por ejemplo, a través delibdrm, 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.Asigna búferes frontales y posteriores con la API de DRM de Linux.
Se recomienda usar el
gbm_bo_create()deminigbmy obtener el descriptor de archivo DMA-BUF congbm_bo_get_fd().Crea búferes de fotogramas de GL respaldados por los búferes asignados.
Crea un
EGLImagea partir del búfer de DRM coneglCreateImageKHRyEGL_LINUX_DMA_BUF_EXT(de la extensiónEGL_EXT_image_dma_buf_import).Crea una textura de GL y usa
glEGLImageTargetTexture2DOES(de la extensiónGL_OES_EGL_image) para establecer el almacenamiento de la textura en elEGLImagedel paso anterior.Crea un búfer de fotogramas de GL y usa
glFramebufferTexture2Dpara configurar su textura de respaldo en la que se creó en el paso anterior.
Para renderizar un fotograma, haz lo siguiente:
Vincula uno de los búferes de fotogramas de GL creados.
Dibuja un fotograma con las APIs de GLES habituales.
Muestra el fotograma en una pantalla: Usa la API de DRM de Linux (
drmModeAtomicCommit()) para enviar unDRM_MODE_PAGE_FLIP_EVENTcon 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
Abre el dispositivo DRM
/dev/dri/card*como en el flujo de una sola pantalla.Enumera los conectores de pantalla disponibles.
Cada pantalla se expone como un conector DRM independiente del dispositivo DRM.
Para cada conector de pantalla, haz lo siguiente:
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.
Selecciona un plano compatible con el CRTC.
Crea búferes de fotogramas DRM respaldados por búferes de GPU. Este proceso es igual que para la variante de una sola pantalla.
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 Propiedad Tipo Descripción Conector CRTC_IDID del CRTC ID del CRTC que se asignará al conector CRTC MODE_IDID de BLOB Es el ID de un blob de propiedad creado con drmModeCreatePropertyBlob, que contiene el structdrmModeModeInfodel modo de video seleccionado.CRTC ACTIVEBooleano truepara marcar el CRTC como activoAvión FB_IDID del búfer de fotogramas ID del búfer de fotogramas de DRM que se mostrará en la pantalla Avión SRC_XPíxeles Coordenada X del rectángulo de la imagen de origen del búfer de fotogramas Avión SRC_YPíxeles Coordenada Y del rectángulo de la imagen de origen del búfer de fotogramas Avión SRC_W16.16 punto fijo Ancho del rectángulo de la imagen de origen del búfer de fotogramas (píxeles desplazados 16 bits hacia la izquierda) Avión SRC_H16.16 punto fijo Altura del rectángulo de la imagen fuente del búfer de fotogramas (píxeles desplazados 16 bits hacia la izquierda) Avión CRTC_XPíxeles Coordenada X del rectángulo de la imagen de destino del CRTC Avión CRTC_YPíxeles Coordenada Y del rectángulo de la imagen de destino del CRTC Avión CRTC_WPíxeles Ancho del rectángulo de la imagen de destino del CRTC Avión CRTC_HPíxeles Altura del rectángulo de la imagen de destino del CRTC Ingresa al bucle de renderización:
Espera el evento de cambio de página en un CRTC antes de renderizar el siguiente fotograma.
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.