No Android 13 e versões mais recentes, a HAL do Hardware Composer (HWC)
é definida na 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 de AIDL e HIDL para o HWC e como implementar e testar a HAL de AIDL.
Como a AIDL oferece vantagens, os fornecedores podem implementar a HAL do compositor de AIDL no Android 13 e versões mais recentes em vez da versão HIDL. Para mais informações, consulte a seção Implementação.
Diferenças entre as HALs de AIDL e HIDL
A nova HAL do compositor de AIDL, chamada android.hardware.graphics.composer3, é
definida em IComposer.aidl. A API é semelhante à HAL de HIDL android.hardware.graphics.composer@2.4, mas inclui as seguintes mudanças:
Remoção da fila de mensagens rápidas (FMQ, na sigla em inglês) em favor de comandos parceláveis.
A HAL de AIDL define a interface de comando com base em tipos parceláveis fortemente tipados em vez dos comandos serializados na FMQ em HIDL. Isso fornece uma interface estável para comandos e uma definição mais legível de como o sistema interpreta o payload de comando.
O
executeCommands5 método é definido emIComposerClient.aidl:CommandResultPayload[] executeCommands(in DisplayCommand[] commands);Cada comando é um tipo parcelável fortemente tipado definido em
DisplayCommand.aidl. As respostas de comando são parceláveis fortemente tipadas definidas emCommandResultPayload.aidl.Remoção de
IComposerClient.getClientTargetSupportporque nenhum cliente ativo usa esse método.Representação de cores como floats em vez de bytes para se alinhar à pilha de gráficos superior no Android, conforme definido por
ASurfaceTransaction_setColor.Adição de novos campos para controlar o conteúdo HDR.
Na HAL de 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
brightnessemLayerCommandpermite 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
brightnessemClientTargetPropertyWithBrightnesspermite que o HWC especifique o espaço de brilho para a composição do cliente e instruiRenderEnginea escurecer as camadas SDR na composição do cliente.O campo
dimmingStagepermite que o HWC configure quandoRenderEngineescurece o conteúdo. Isso acomodaColorModesdefinidos pelo fornecedor que podem preferir escurecer 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, emComposition.aidlpara decorações de tela.Alguns dispositivos têm hardware dedicado para otimizar o desenho da máscara alfa que suaviza cantos arredondados e recortes em telas. Os dispositivos com esse hardware precisam implementar
IComposerClient.getDisplayDecorationSupporte retornar uma estruturaDisplayDecorationSupportconforme definido emDisplayDecorationSupport.aidl. Essa estrutura descreve asPixelFormateAlphaInterpretationenumerações exigidas pelo dispositivo. Após essa implementação, a interface do sistema marca a camada de máscara alfa comoDISPLAY_DECORATION, um tipo de composição que aproveita o hardware dedicado.Adição de um
expectedPresentTimecampo aDisplayCommand.aidl.O campo
expectedPresentTimepermite que o SurfaceFlinger defina o tempo de apresentação esperado para quando o conteúdo atual precisa ser exibido na tela. Com esse recurso, o SurfaceFlinger envia um comando de apresentação para a implementação com antecedência, o que permite que ele pipeline mais do 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étodossetBootDisplayConfig,clearBootDisplayConfigegetPreferredBootDisplayConfigusamBOOT_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 puder ser inicializado nessa configuração, o fornecedor precisará encontrar uma configuração que corresponda à resolução e à taxa de atualização dessa configuração. Se não houver essa configuração, 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 tela. Quando inativa, essa capacidade muda a taxa de atualização para uma configuração mais baixa para preservar a energia. A plataforma usasetIdleTimerEnabledpara controlar o tempo limite do timer e, em alguns casos, para desativá-lo a fim de evitar mudanças indesejadas na taxa de atualização quando inativa.O uso do callback
IComposerCallback.onVsyncIdleindica à plataforma que a tela está inativa e que a cadênciavsyncmudou. A plataforma responde a esse callback redefinindo o modelovsync. Ele força uma resincronizaçãovsyncno próximo frame e aprende a nova cadênciavsync.
Implementação
Os fornecedores não precisam implementar a HAL de AIDL para o Android 13. No entanto, recomendamos que os fornecedores implementem a HAL do compositor de AIDL em vez da versão HIDL para usar a funcionalidade e as APIs da HAL do compositor de AIDL.
Os emuladores do Android incluem uma implementação de referência para a HAL de AIDL do HWC.
Teste
Para testar sua implementação, execute VtsHalGraphicsComposer3_TargetTest.