A SDV Media expõe telas disponíveis para apps OEM com a API Linux DRM.
Figura 1. Interação entre componentes de DRM.
Um framebuffer é uma fonte de dados de pixel, com suporte de um buffer de memória alocado externamente.
Um plano é uma origem de imagem usada pelo CRTC. Ele está associado a um framebuffer e pode representar uma visualização cortada dele.
CRTC representa um pipeline de exibição geral. Ele pode combinar vários planos para criar o vídeo final e enviar a saída para vários codificadores.
Um codificador converte a saída de vídeo do CRTC em um formato adequado para um conector específico.
Um 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 possam ser usadas diretamente com a chamada de sistema ioctl, para o desenvolvimento de aplicativos, recomendamos usar uma biblioteca auxiliar do espaço do usuário. Exemplo:
- Crate
drm-rspara Rust (recomendado) libdrmpara C/C++. A página de manualdrm-kmsoferece uma visão geral extensa 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, porlibdrm, no descritor do arquivo para selecionar a tela e o modo dela.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.
Recomendamos usar
gbm_bo_create()dominigbme receber o descritor do arquivo DMA-BUF comgbm_bo_get_fd().Crie framebuffers GL com suporte dos buffers alocados.
Crie um
EGLImagedo buffer de DRM comeglCreateImageKHReEGL_LINUX_DMA_BUF_EXT(da extensãoEGL_EXT_image_dma_buf_import).Crie uma textura GL e use
glEGLImageTargetTexture2DOES(da extensãoGL_OES_EGL_image) para definir o armazenamento da textura como oEGLImageda etapa anterior.Crie um framebuffer do GL e use
glFramebufferTexture2Dpara definir a textura de apoio como a criada na etapa anterior.
Para renderizar um frame:
Vincule um dos framebuffers GL criados.
Desenhe um frame com as APIs GLES comuns.
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 composição multicamada (multiplano) acelerada por hardware, dependemos do sistema host que expõe cada camada como um conector DRM separado (display virtual) e as mapeia para o local / pipeline de hardware correto.
Consulte Configurar a renderização em várias telas para mais detalhes.
Configurar a renderização em várias telas
Abra o dispositivo DRM
/dev/dri/card*como no fluxo de tela única.Listar os conectores de exibição disponíveis.
Cada tela é exposta como um conector 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 há pelo menos um CRTC compatível.
Selecione um avião compatível com o CRTC.
Cria framebuffers DRM com suporte de buffers de GPU. Esse processo é igual ao 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 de DRM para cada conector, CRTC e conjunto de planos.
A lista completa de propriedades necessárias:
Destino Propriedade Tipo Descrição Conector CRTC_IDID da 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 selecionado.CRTC ACTIVEBooleano 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_W16.16 ponto fixo Largura do retângulo da imagem de origem do framebuffer (pixels deslocados para a esquerda em 16 bits) Avião SRC_H16.16 ponto fixo 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 troca de página em um CRTC antes de renderizar o próximo frame.
Renderize um frame e mostre-o na tela programando uma troca de página para determinado CRTC + framebuffer.