No Android 13 e versões mais recentes, a HAL do Hardware Composer (HWC) é definida em
AIDL, e as versões HIDL que variam de
android.hardware.graphics.composer@2.1
a
android.hardware.graphics.composer@2.4
foram descontinuadas.
Nesta página, descrevemos as diferenças entre a AIDL e a HIDL HAL para o HWC e a implementação e o teste da AIDL HAL.
Devido às vantagens oferecidas pela AIDL, incentivamos os fornecedores a implementar a HAL do compositor AIDL a partir do Android 13 em vez da versão HIDL. Consulte a seção Implementação para mais informações.
Diferenças entre HALs AIDL e HIDL
A nova HAL do compositor AIDL, chamada android.hardware.graphics.composer3
, é
definida em IComposer.aidl
.
Ela expõe uma API semelhante à HAL HIDL
android.hardware.graphics.composer@2.4
com as seguintes mudanças:
Remoção da Fila de mensagens rápidas (FMQ) em favor de comandos parceláveis.
A HAL da AIDL define a interface de comando com base em tipos parceláveis fortemente tipados, em vez dos comandos serializados por FMQ no HIDL. Isso fornece uma interface estável para comandos e uma definição mais legível de como o payload de comando é interpretado.
O método
executeCommands
é definido emIComposerClient.aidl
comoCommandResultPayload[] executeCommands(in DisplayCommand[] commands);
em que 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 não há clientes ativos para esse método.Representação de cores como números de ponto flutuante em vez de bytes para melhor alinhamento com a pilha de gráficos superior no Android, conforme definido em
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á simultaneamente na tela.
O campo
brightness
emLayerCommand
permite que o SurfaceFlinger especifique um brilho por camada, para que o HWC diminua 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 instrua oRenderEngine
a reduzir o brilho das camadas SDR na composição do cliente.O campo
dimmingStage
permite que o HWC configure quandoRenderEngine
precisa reduzir o brilho do conteúdo. Isso acomodaColorModes
definidos pelo fornecedor, que podem preferir reduzir o brilho no espaço gama para permitir melhorias de contraste definidas pelo fornecedor nos pipelines de cores.Adição de um novo 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. Dispositivos com esse hardware precisam implementar
IComposerClient.getDisplayDecorationSupport
para retornar uma estruturaDisplayDecorationSupport
conforme definido no novoDisplayDecorationSupport.aidl
. Essa estrutura descreve os enumsPixelFormat
eAlphaInterpretation
exigidos pelo dispositivo. Com essa implementação, a interface do sistema marca a camada de máscara alfa comoDISPLAY_DECORATION
, um novo tipo de composição que aproveita o hardware dedicado.Adição de um novo campo
expectedPresentTime
aDisplayCommand.aidl
.O campo
expectedPresentTime
permite que o SurfaceFlinger defina o tempo de apresentação 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, permitindo que ele faça 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 deverá 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 seja implementado por eles para essa exibição. Quando o dispositivo está inativo, essa capacidade muda a taxa de atualização para uma configuração mais baixa e economiza energia. A plataforma usasetIdleTimerEnabled
para controlar o tempo limite do timer e, em alguns casos, desativá-lo para evitar mudanças indesejadas na taxa de atualização quando ocioso.Usar o callback
IComposerCallback.onVsyncIdle
indica à plataforma que a exibição está inativa e que 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, é recomendável que eles implementem o HAL do compositor AIDL em vez da versão HIDL para usar as novas funcionalidades e APIs.
Uma implementação de referência para o AIDL HWC HAL é implementada em emuladores do Android.
Teste
Para testar a implementação, execute VtsHalGraphicsComposer3_TargetTest
.