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
para
O uso de android.hardware.graphics.composer@2.4
foi descontinuado.
Esta página descreve as diferenças entre AIDL e HIDL para o HWC e a implementação e teste da HAL da AIDL.
Devido à vantagens oferecidas pela AIDL, os fornecedores são incentivados a implementar Inicialização da HAL do compositor da AIDL 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 de compositor da AIDL, chamada android.hardware.graphics.composer3
, é
definido em IComposer.aidl
.
Ele expõe uma API semelhante à HAL de HIDL
android.hardware.graphics.composer@2.4
com as seguintes mudanças:
Remoção da Fila de mensagens rápidas (FMQ, na sigla em inglês) em os comandos fracionáveis.
A HAL da AIDL define a interface de comando com base em tipos tipos parcelable, 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 o payload do comando é interpretado.
O
executeCommands
é definido emIComposerClient.aidl
quandoCommandResultPayload[] executeCommands(in DisplayCommand[] commands);
em que cada comando é um tipo parcelable fortemente tipado em
DisplayCommand.aidl
As respostas de comandos 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 pontos flutuantes em vez de bytes para melhor alinhamento com o a pilha de gráficos superior no Android, conforme definido em
ASurfaceTransaction_setColor
.Inclusão de novos campos para controlar o conteúdo HDR.
Na HAL AIDL, as pilhas de camadas SDR/HDR mistas são compatíveis com o 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, de modo que o HWC escureça a do 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 as camadas SDR devem ser esmaecidas na composição do cliente.O
dimmingStage
permite que o HWC configure quando oRenderEngine
deve escurecer o conteúdo. Isso acomodaColorModes
definidos pelo fornecedor, que podem preferir escurecer a gama para permitir melhorias de contraste definidas pelo fornecedor nos pipelines de cores.Um novo tipo de composição
DISPLAY_DECORATION
foi adicionado aoComposition.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 em telas. Dispositivos com esse tipo de hardware devem implementar
IComposerClient.getDisplayDecorationSupport
. para retornar uma estruturaDisplayDecorationSupport
, conforme definido no novoDisplayDecorationSupport.aidl
Essa estrutura descreve oPixelFormat
eAlphaInterpretation
tipos enumerados exigidos pelo dispositivo. Após essa implementação, a interface do sistema marca o camada de máscara alfa comoDISPLAY_DECORATION
, um novo tipo de composição que aproveita o hardware dedicado.Adição de um novo
expectedPresentTime
comoDisplayCommand.aidl
.O campo
expectedPresentTime
permite que o SurfaceFlinger defina o valor esperado momento atual até quando o conteúdo atual deve ser exibido na tela. Com este o SurfaceFlinger envia um comando "Present" para a implementação antes tempo, permitindo o pipeline mais do trabalho de composição.Adição de novas APIs para controlar a configuração de exibição na inicialização.
Usando
BOOT_DISPLAY_CONFIG
, os fornecedores podem especificar que a configuração de exibição de inicialização é compatível. AsetBootDisplayConfig
,clearBootDisplayConfig
, egetPreferredBootDisplayConfig
usamBOOT_DISPLAY_CONFIG
da seguinte forma:Usando
setBootDisplayConfig
, o framework informa aos fornecedores a configuração de exibição do tempo de inicialização. Fornecedores precisa armazenar em cache a configuração da tela de inicialização e inicializar essa configuração na próxima reiniciar o dispositivo. Se o dispositivo não puder ser inicializado nessa configuração, o fornecedor precisará encontrar um que corresponda à resolução e à taxa de atualização dessa configuração. Se não houver existir, o fornecedor precisa usar a configuração de tela preferida dele.Usando
clearBootDisplayConfig
, o framework instrui os fornecedores a limpar a configuração da tela de inicialização; e na configuração de tela de preferência durante a próxima reinicialização.Usando
getPreferredBootDisplayConfig
, o framework consulta o modo de inicialização preferido do fornecedor.
Quando a configuração da tela de inicialização não tiver suporte, esses métodos retornarão uma 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 cronômetro de inatividade seja implementado pelo fornecedor para esta tela. Quando inativo, este recurso altera a taxa de atualização para uma menor para economizar energia. A plataforma usasetIdleTimerEnabled
controlar o tempo limite do timer e, em alguns casos, desativá-lo para para evitar interruptores indesejados na taxa de atualização quando o dispositivo estiver inativo.Como usar o
IComposerCallback.onVsyncIdle
O callback indica à plataforma que a tela está inativa e ovsync
cadência mudou. A plataforma responde a esse callback redefinindovsync
. Ela força uma ressincronização devsync
no próximo frame e aprende o novovsync
cadência.
Implementação
Os fornecedores não precisam implementar a HAL da AIDL para o Android 13. No entanto, eles são incentivados a implementar a AIDL em vez da versão HIDL para usar as novas funcionalidades e APIs.
Uma implementação de referência para a HAL AIDL HWC foi implementada em emuladores Android.
Teste
Para testar a implementação, execute VtsHalGraphicsComposer3_TargetTest
.