A partir do Android 13, o HAL do Hardware Composer (HWC) é definido em AIDL e as versões HIDL que vão de android.hardware.graphics.composer@2.1
a android.hardware.graphics.composer@2.4
estão obsoletas.
Esta página descreve as diferenças entre o AIDL e o HIDL HAL para o HWC e a implementação e teste do AIDL HAL.
Devido às vantagens oferecidas pelo AIDL, os fornecedores são incentivados a implementar o compositor AIDL HAL a partir do Android 13 em vez da versão HIDL. Consulte a seção Implementação para obter mais informações.
Diferenças entre HALs AIDL e HIDL
O novo HAL do compositor AIDL, denominado android.hardware.graphics.composer3
, é definido em IComposer.aidl
. Ele expõe uma API semelhante ao HIDL HAL android.hardware.graphics.composer@2.4
com as seguintes alterações:
Remoção do Fast Message Queue (FMQ) em favor de comandos parcelados.
O AIDL HAL define a interface de comando com base em tipos parcelais fortemente tipados, em oposição aos comandos serializados sobre FMQ em HIDL. Isso fornece uma interface estável para comandos e uma definição mais legível de como a carga do comando é interpretada.
O método
executeCommands
é definido emIComposerClient.aidl
comoCommandResultPayload[] executeCommands(in DisplayCommand[] commands);
onde cada comando é um tipo parcelavel fortemente digitado definido em
DisplayCommand.aidl
. As respostas de comando são parcelables fortemente digitadas definidas emCommandResultPayload.aidl
.Remoção de
IComposerClient.getClientTargetSupport
porque não há clientes ativos para este método.Representação de cores como flutuadores em vez de bytes para melhor alinhamento com a pilha gráfica superior no Android, conforme definido em
ASurfaceTransaction_setColor
.Adição de novos campos para controle de conteúdo HDR.
No AIDL HAL, as pilhas mistas de camadas SDR/HDR suportam o escurecimento contínuo das camadas SDR quando uma camada HDR está simultaneamente na tela.
O campo
brightness
noLayerCommand
permite que o SurfaceFlinger especifique um brilho por camada, para que o HWC escureça o conteúdo da camada no espaço de luz linear, em oposição ao espaço gama.O campo
brightness
emClientTargetPropertyWithBrightness
permite que o HWC especifique o espaço de brilho para a composição do cliente e instruaRenderEngine
se deve escurecer as camadas SDR na composição do cliente.O campo
dimmingStage
permite que o HWC configure quandoRenderEngine
deve escurecer o conteúdo. Isso acomodaColorModes
definidos pelo fornecedor, que podem preferir esmaecer no espaço gama, para permitir aprimoramentos de contraste definidos pelo fornecedor em seus pipelines de cores.Adição de um novo tipo de composição
DISPLAY_DECORATION
emComposition.aidl
para decorações de tela.Alguns dispositivos possuem hardware dedicado para otimizar o desenho da máscara alfa que suaviza cantos arredondados e recortes nas telas. Dispositivos com esse hardware devem implementar
IComposerClient.getDisplayDecorationSupport
para retornar uma estruturaDisplayDecorationSupport
conforme definido no novoDisplayDecorationSupport.aidl
. Esta estrutura descreve as enumeraçõesPixelFormat
eAlphaInterpretation
exigidas pelo dispositivo. Após esta implementação, a UI 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 presente esperado para quando o conteúdo atual deve ser exibido na tela. Com esse recurso, o SurfaceFlinger envia um comando presente para a implementação com antecedência, permitindo canalizar 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 é suportada. Os métodossetBootDisplayConfig
,clearBootDisplayConfig
egetPreferredBootDisplayConfig
usamBOOT_DISPLAY_CONFIG
da seguinte forma:Usando
setBootDisplayConfig
, a estrutura informa aos fornecedores a configuração de exibição do tempo de inicialização. Os fornecedores devem 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 nesta configuração, o fornecedor deverá encontrar uma configuração que corresponda à resolução e à taxa de atualização desta configuração. Se tal configuração não existir, o fornecedor deverá usar sua configuração de exibição preferida.Usando
clearBootDisplayConfig
, a estrutura informa aos fornecedores para limpar a configuração de exibição de inicialização e inicializar em sua configuração de exibição preferida durante a próxima reinicialização.Usando
getPreferredBootDisplayConfig
, a estrutura consulta o modo de inicialização preferido do fornecedor.
Quando a configuração de exibição de inicialização não é suportada, esses métodos retornam um valor
UNSUPPORTED
.Adição de novas APIs para controlar o temporizador de inatividade do display.
Usando
DISPLAY_IDLE_TIMER
, os fornecedores podem especificar que um temporizador de inatividade seja implementado pelo fornecedor para esta exibição. Quando inativo, esse recurso altera a taxa de atualização para uma configuração mais baixa para preservar energia. A plataforma usasetIdleTimerEnabled
para controlar o tempo limite do temporizador e, em alguns casos, para desativá-lo, a fim de evitar alterações indesejadas na taxa de atualização quando ocioso.O uso do retorno de chamada
IComposerCallback.onVsyncIdle
indica à plataforma que a exibição está ociosa e a cadênciavsync
foi alterada. A plataforma responde a esse retorno de chamada redefinindo seu modelovsync
. Ele força uma ressincronizaçãovsync
no próximo quadro e aprende a nova cadênciavsync
.
Implementação
Os fornecedores não são obrigados a implementar o HAL AIDL para Android 13. No entanto, eles são incentivados a implementar 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 AIDL HWC HAL é implementada em emuladores Android.
Teste
Para testar sua implementação, execute VtsHalGraphicsComposer3_TargetTest
.