No Android 13 e versões mais recentes, a HAL do Hardware Composer (HWC)
é definida em AIDL. As versões HIDL que variam de
android.hardware.graphics.composer@2.1 a
android.hardware.graphics.composer@2.4 foram descontinuadas.
Esta página descreve as diferenças entre as HALs AIDL e HIDL para o HWC, e como implementar e testar a HAL AIDL.
Como a AIDL oferece vantagens, os fornecedores podem implementar a HAL do compositor AIDL a partir do Android 13 em vez da versão HIDL. Para mais informações, consulte a seção Implementação.
Diferenças entre HALs AIDL e HIDL
A nova HAL do compositor AIDL, chamada android.hardware.graphics.composer3, é
definida em IComposer.aidl. A API é semelhante à HAL do HIDL
android.hardware.graphics.composer@2.4, mas inclui as seguintes mudanças:
- Remoção da Fila de mensagens rápidas (FMQ) em favor de comandos parceláveis. - A HAL AIDL define a interface de comando com base em tipos parceláveis fortemente tipados em vez dos comandos serializados em FMQ no HIDL. Isso fornece uma interface estável para comandos e uma definição mais legível de como o sistema interpreta a carga útil do comando. - O método 5 - executeCommandsé definido em- IComposerClient.aidl:- CommandResultPayload[] executeCommands(in DisplayCommand[] commands);- Cada comando é um tipo parcelável fortemente tipado definido em - DisplayCommand.aidl. As respostas de comando são parcelables fortemente tipados definidos em- CommandResultPayload.aidl.
- Remoção de - IComposerClient.getClientTargetSupportporque nenhum cliente ativo usa esse método.
- Representação de cores como números de ponto flutuante em vez de bytes para alinhar com a pilha de gráficos superior no Android, conforme definido por - ASurfaceTransaction_setColor.
- Adição de novos campos para controlar conteúdo HDR. - Na HAL AIDL, as pilhas de camadas SDR/HDR mistas oferecem suporte ao escurecimento contínuo de camadas SDR quando uma camada HDR está na tela ao mesmo tempo. - O campo - brightnessem- LayerCommandpermite que o SurfaceFlinger especifique um brilho por camada. Isso permite que o HWC escureça o conteúdo da camada no espaço de luz linear em vez do espaço gama.- O campo - brightnessem- ClientTargetPropertyWithBrightnesspermite que o HWC especifique o espaço de brilho para a composição do cliente e instrui- RenderEnginea reduzir o brilho das camadas SDR na composição do cliente.- O campo - dimmingStagepermite que o HWC configure quando- RenderEngineescurece o conteúdo. Isso acomoda- ColorModesdefinidos pelo fornecedor que podem preferir reduzir o brilho no espaço gama para ativar melhorias de contraste definidas pelo fornecedor nos pipelines de cores.
- Adição de um tipo de composição, - DISPLAY_DECORATION, em- Composition.aidlpara decorações de tela.- Alguns dispositivos têm hardware dedicado para otimizar o desenho da máscara alfa, que suaviza cantos arredondados e cortes nas telas. Os dispositivos com esse hardware precisam implementar - IComposerClient.getDisplayDecorationSupporte retornar uma estrutura- DisplayDecorationSupportconforme definido em- DisplayDecorationSupport.aidl. Essa estrutura descreve os enums- PixelFormate- AlphaInterpretationexigidos pelo dispositivo. Após essa implementação, a interface do sistema marca a camada de máscara alfa como- DISPLAY_DECORATION, um tipo de composição que aproveita o hardware dedicado.
- Adição de um campo - expectedPresentTimea- DisplayCommand.aidl.- O campo - expectedPresentTimepermite que o SurfaceFlinger defina o tempo esperado para quando o conteúdo atual precisa ser mostrado na tela. Com esse recurso, o SurfaceFlinger envia um comando de apresentação à implementação com antecedência, o que permite fazer o pipeline de mais trabalho de composição.
- Adição de novas APIs para controlar a configuração de exibição de inicialização. - Usando - BOOT_DISPLAY_CONFIG, os fornecedores podem especificar que a configuração de exibição de inicialização é compatível. Os métodos- setBootDisplayConfig,- clearBootDisplayConfige- getPreferredBootDisplayConfigusam- BOOT_DISPLAY_CONFIGda seguinte maneira:- Usando - setBootDisplayConfig, o framework informa aos fornecedores a configuração de exibição do tempo de inicialização. Os fornecedores precisam armazenar em cache a configuração de exibição de inicialização e inicializar nessa configuração na próxima reinicialização. Se o dispositivo não conseguir inicializar nessa configuração, o fornecedor precisará encontrar uma configuração que corresponda à resolução e à taxa de atualização dela. Se não houver uma configuração desse tipo, o fornecedor precisará usar a configuração de exibição preferida.
- Usando - clearBootDisplayConfig, o framework informa aos fornecedores para limpar a configuração de exibição de inicialização e inicializar na configuração de exibição preferida durante a próxima reinicialização.
- Usando - getPreferredBootDisplayConfig, o framework consulta o modo de inicialização preferido do fornecedor.
 - Quando a configuração de exibição de inicialização não é compatível, esses métodos retornam um valor de - UNSUPPORTED.
- Adição de novas APIs para controlar o timer de inatividade da tela: - Usando - DISPLAY_IDLE_TIMER, os fornecedores podem especificar que um timer de inatividade é implementado pelo fornecedor para essa exibição. Quando inativo, esse recurso muda a taxa de atualização para uma configuração mais baixa para preservar a energia. A plataforma usa- setIdleTimerEnabledpara controlar o tempo limite do timer e, em alguns casos, para desativá-lo e evitar mudanças indesejadas na taxa de atualização quando o dispositivo está inativo.
- Usar o callback - IComposerCallback.onVsyncIdleindica à plataforma que a tela está inativa e a cadência- vsyncmudou. A plataforma responde a esse callback redefinindo o modelo- vsync. Ele força uma nova sincronização de- vsyncno próximo frame e aprende a nova cadência de- vsync.
 
Implementação
Os fornecedores não precisam implementar a HAL AIDL para o Android 13. No entanto, os fornecedores são incentivados a implementar a HAL do compositor AIDL em vez da versão HIDL para usar a funcionalidade e as APIs da HAL do compositor AIDL.
Os emuladores do Android incluem uma implementação de referência para a HAL HWC AIDL.
Teste
Para testar a implementação, execute VtsHalGraphicsComposer3_TargetTest.
