A SDV Media expõe as telas disponíveis para aplicativos OEM com a API DRM do Linux.
O framebuffer é uma fonte de dados de pixel, com suporte de um buffer de memória alocado externamente.
O plano é uma fonte de imagem usada pelo CRTC. Ele está associado a um framebuffer e pode representar uma visualização cortada do framebuffer.
O CRTC representa um pipeline de exibição geral. Ele pode combinar vários planos para criar a saída de vídeo final e enviar a saída para vários codificadores.
O codificador converte a saída de vídeo do CRTC em um formato adequado para um conector específico.
O conector representa um conector de tela disponível. Por exemplo, uma porta HDMI.
Para uma descrição mais detalhada, consulte:
Superfície da API
A SDV Media fornece as interfaces DRM do Linux. Embora elas possam ser usadas diretamente usando a chamada de sistema ioctl, para o desenvolvimento de aplicativos, é recomendável usar uma biblioteca auxiliar do espaço do usuário. Por exemplo:
drm-rscaixa para Rust (recomendado)libdrmpara C/C++.drm-kmspágina de manual oferece uma visão geral abrangente das APIs e do uso delas.
Configurar a renderização para uma única tela
Abra um dispositivo DRM (
/dev/dri/card*) e use APIs DRM do Linux (por exemplo, usandolibdrm) no descritor do arquivo dele para selecionar a tela e o modo.Normalmente, o sistema host expõe apenas um único dispositivo de GPU virtual, que aparece como
/dev/dri/card0.Alocar buffers frontais e traseiros com a API DRM do Linux.
É recomendável usar
minigbm'sgbm_bo_create()e receber o descritor do arquivo DMA-BUF comgbm_bo_get_fd().Crie framebuffers GL com suporte dos buffers alocados.
Crie um
EGLImagedo buffer DRM comeglCreateImageKHRcomEGL_LINUX_DMA_BUF_EXT(daEGL_EXT_image_dma_buf_importextensão).Crie uma textura GL e use
glEGLImageTargetTexture2DOES(daGL_OES_EGL_imageextensão) para definir o armazenamento da textura como aEGLImageda etapa anterior.Crie um framebuffer GL e use
glFramebufferTexture2Dpara definir a textura de suporte como a criada na etapa anterior.
Para renderizar um frame:
Vincule um dos framebuffers GL criados.
Desenhe um frame com as APIs GLES usuais.
Mostre o frame em uma tela: use a API DRM do Linux (
drmModeAtomicCommit()) para enviar umDRM_MODE_PAGE_FLIP_EVENTcom o descritor de arquivo DMA-BUF usado pelo framebuffer GL vinculado.
Compor a saída de vídeo de várias camadas
Para a composição de várias camadas (multiplano) acelerada por hardware, dependemos do sistema host que expõe cada camada como um conector DRM separado (tela virtual) e as mapeia para o local / pipeline de hardware correto.
Consulte Configurar a renderização para várias telas para mais detalhes.
Configurar a renderização para várias telas
Abra o dispositivo DRM
/dev/dri/card*como no fluxo de tela única.Liste os conectores de tela disponíveis.
Cada tela é exposta como um conector DRM separado do dispositivo DRM.
Para cada conector de tela:
Selecione um CRTC compatível com o conector. Cada conector tem uma lista de codificadores disponíveis, e cada codificador indica com quais CRTCs ele pode ser usado. Sempre haverá pelo menos um CRTC compatível.
Selecione um plano compatível com o CRTC.
Crie framebuffers DRM com suporte dos buffers de uma GPU. Esse processo é o mesmo da variante de tela única.
Conecte o plano, o CRTC e o conector e defina o modo de vídeo no CRTC.
É possível definir o modo de várias telas ao mesmo tempo usando a API atômica para definir as seguintes propriedades DRM para cada conjunto de conector, CRTC e plano.
A lista completa de propriedades necessárias:
Destino Propriedade Tipo Descrição conector CRTC_IDID do CRTC ID do CRTC a ser atribuído ao conector CRTC MODE_IDID do blob ID de um blob de propriedade criado usando drmModeCreatePropertyBlob, que contém a structdrmModeModeInfodo modo de vídeo selecionadoCRTC ACTIVEbool truepara marcar o CRTC como ativoavião FB_IDID do framebuffer ID do framebuffer DRM a ser mostrado na tela avião SRC_Xpixels Coordenada X do retângulo da imagem de origem do framebuffer avião SRC_Ypixels Coordenada Y do retângulo da imagem de origem do framebuffer avião SRC_WPonto fixo 16.16 Largura do retângulo da imagem de origem do framebuffer (pixels deslocados para a esquerda em 16 bits) avião SRC_HPonto fixo 16.16 Altura do retângulo da imagem de origem do framebuffer (pixels deslocados para a esquerda em 16 bits) avião CRTC_Xpixels Coordenada X do retângulo da imagem de destino do CRTC avião CRTC_Ypixels Coordenada Y do retângulo da imagem de destino do CRTC avião CRTC_Wpixels Largura do retângulo da imagem de destino do CRTC avião CRTC_Hpixels Altura do retângulo da imagem de destino do CRTC Insira o loop de renderização:
Aguarde o evento de inversão de página em um CRTC antes de renderizar o próximo frame.
Renderize um frame e mostre-o na tela programando uma inversão de página para o CRTC+framebuffer especificado.