AIDL para a HAL do Hardware Composer

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 em IComposerClient.aidl quando

    CommandResultPayload[] 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 em CommandResultPayload.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 em LayerCommand 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 em ClientTargetPropertyWithBrightness permite que o HWC especifique o espaço de brilho para a composição do cliente e instruir RenderEngine se as camadas SDR devem ser esmaecidas na composição do cliente.

    O dimmingStage permite que o HWC configure quando o RenderEngine deve escurecer o conteúdo. Isso acomoda ColorModes 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 ao Composition.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 estrutura DisplayDecorationSupport, conforme definido no novo DisplayDecorationSupport.aidl Essa estrutura descreve o PixelFormat e AlphaInterpretation tipos enumerados exigidos pelo dispositivo. Após essa implementação, a interface do sistema marca o camada de máscara alfa como DISPLAY_DECORATION, um novo tipo de composição que aproveita o hardware dedicado.

  • Adição de um novo expectedPresentTime como DisplayCommand.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. A setBootDisplayConfig, clearBootDisplayConfig, e getPreferredBootDisplayConfig usam BOOT_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 usa setIdleTimerEnabled 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 o vsync cadência mudou. A plataforma responde a esse callback redefinindo vsync. Ela força uma ressincronização de vsync no próximo frame e aprende o novo vsync 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.