SDV Media expone las pantallas disponibles a las aplicaciones OEM con la API de Linux 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:
drm-rscrate para Rust (recomendado)libdrmpara C/C++.drm-kmspágina de manual proporciona una descripción general extensa de las APIs y su uso.
Configura la renderización en una sola pantalla
Abre un dispositivo DRM (
/dev/dri/card*) y usa las APIs de Linux DRM (p.ej., a través delibdrm) 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.Asigna búferes frontales y posteriores con la API de Linux DRM.
Se recomienda usar
minigbm'sgbm_bo_create()y obtener el descriptor de archivo DMA-BUF congbm_bo_get_fd().Crea framebuffers GL respaldados por los búferes asignados.
Crea una
EGLImagea partir del búfer DRM coneglCreateImageKHRconEGL_LINUX_DMA_BUF_EXT(de laEGL_EXT_image_dma_buf_importextensión).Crea una textura GL y usa
glEGLImageTargetTexture2DOES(de laGL_OES_EGL_imageextensión) para establecer el almacenamiento de la textura en laEGLImagedel paso anterior.Crea un framebuffer GL y usa
glFramebufferTexture2Dpara establecer su textura de respaldo en la que se creó en el paso anterior.
Para renderizar un fotograma, haz lo siguiente:
Vincula uno de los framebuffers GL creados.
Dibuja un fotograma con las APIs de GLES habituales.
Muestra el fotograma en una pantalla: usa la API de Linux DRM (
drmModeAtomicCommit()) para enviar unDRM_MODE_PAGE_FLIP_EVENTcon 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
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 habrá al menos un CRTC compatible.
Selecciona un plano compatible con el CRTC.
Crea framebuffers DRM respaldados por los búferes de GPU. Este proceso es el mismo que para la variante de una sola pantalla.
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_IDID de CRTC ID del CRTC que se asignará al conector CRTC MODE_IDID de blob ID de un blob de propiedad creado con drmModeCreatePropertyBlob, que contiene la estructuradrmModeModeInfodel modo de video seleccionadoCRTC ACTIVEbool truepara marcar el CRTC como activoavión FB_IDID de framebuffer ID del framebuffer DRM que se mostrará en la pantalla avión SRC_Xpíxeles Coordenada X del rectángulo de la imagen de origen del framebuffer avión SRC_Ypíxeles Coordenada Y del rectángulo de la imagen de origen del framebuffer avión SRC_Wpunto 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_Hpunto 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_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 Alto 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 muéstralo en la pantalla programando un cambio de página para el CRTC y el framebuffer determinados.