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 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 parcelables fortemente tipados definidos emCommandResultPayload.aidl
.Remoção de
IComposerClient.getClientTargetSupport
porque 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
brightness
emLayerCommand
permite 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
brightness
emClientTargetPropertyWithBrightness
permite que o HWC especifique o espaço de brilho para a composição do cliente e instruiRenderEngine
a reduzir o brilho das camadas SDR na composição do cliente.O campo
dimmingStage
permite que o HWC configure quandoRenderEngine
escurece o conteúdo. Isso acomodaColorModes
definidos 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
, emComposition.aidl
para 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.getDisplayDecorationSupport
e retornar uma estruturaDisplayDecorationSupport
conforme definido emDisplayDecorationSupport.aidl
. Essa estrutura descreve os enumsPixelFormat
eAlphaInterpretation
exigidos 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 campo
expectedPresentTime
aDisplayCommand.aidl
.O campo
expectedPresentTime
permite 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étodossetBootDisplayConfig
,clearBootDisplayConfig
egetPreferredBootDisplayConfig
usamBOOT_DISPLAY_CONFIG
da 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 usasetIdleTimerEnabled
para 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.onVsyncIdle
indica à plataforma que a tela está inativa e a cadênciavsync
mudou. A plataforma responde a esse callback redefinindo o modelovsync
. Ele força uma nova sincronização devsync
no próximo frame e aprende a nova cadência devsync
.
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
.