A partir do Android 13, o Hardware Composer (HWC) HAL é definido 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.
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 AIDL composer 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 AIDL e HIDL HALs
O novo compositor AIDL HAL, 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 parcelable.
O AIDL HAL define a interface de comando com base em tipos parcelable 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 útil do comando é interpretada.
O método
executeCommands
é definido emIComposerClient.aidl
comoCommandResultPayload[] executeCommands(in DisplayCommand[] commands);
onde cada comando é um tipo parcelable fortemente tipado definido em
DisplayCommand.aidl
. As respostas de comando são parcelables fortemente tipadas definidas emCommandResultPayload.aidl
.Remoção de
IComposerClient.getClientTargetSupport
porque não há clientes ativos para este método.Representação de cores como flutuantes 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 controle de conteúdo HDR.
No AIDL HAL, as pilhas de camadas mistas SDR/HDR suportam o escurecimento contínuo das 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 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 instruirRenderEngine
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 escurecer 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 em telas. Dispositivos com tal hardware devem implementar
IComposerClient.getDisplayDecorationSupport
para retornar uma estruturaDisplayDecorationSupport
conforme definido no novoDisplayDecorationSupport.aidl
. Essa estrutura descreve as enumeraçõesPixelFormat
eAlphaInterpretation
exigidas pelo dispositivo. Após essa implementação, a interface do usuário 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 antes do tempo, permitindo que ele canalize 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 é suportada. Os métodossetBootDisplayConfig
,clearBootDisplayConfig
egetPreferredBootDisplayConfig
usamBOOT_DISPLAY_CONFIG
da seguinte maneira:Usando
setBootDisplayConfig
, a estrutura informa os fornecedores sobre a configuração de exibição do tempo de inicialização. Os fornecedores devem armazenar em cache na configuração de exibição de inicialização e inicializar nesta configuração na próxima reinicialização. Se o dispositivo não conseguir inicializar nesta configuração, o fornecedor deve 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 deve 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 preferencial do fornecedor.
Quando a configuração de exibição de inicialização não é suportada, esses métodos retornam um valor de
UNSUPPORTED
.Adição de novas APIs para controlar o timer de exibição.
Usando
DISPLAY_IDLE_TIMER
, os fornecedores podem especificar que um cronômetro de inatividade seja implementado pelo fornecedor para esta exibição. Quando ocioso, esse recurso altera a taxa de atualização para uma configuração mais baixa para economizar energia. A plataforma usasetIdleTimerEnabled
para controlar o tempo limite do cronômetro e, em alguns casos, desativá-lo para evitar mudanças indesejadas na taxa de atualização quando ocioso.O uso do retorno de chamada
IComposerCallback.onVsyncIdle
indica à plataforma que o monitor está ocioso 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 AIDL HAL para Android 13. No entanto, eles são incentivados a implementar o AIDL composer HAL 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 Android.
teste
Para testar sua implementação, execute VtsHalGraphicsComposer3_TargetTest
.