AIDL per l'HAL Hardware Composer

A partire da Android 13, l'HAL Hardware Composer (HWC) è definito in AIDL e le versioni HIDL da android.hardware.graphics.composer@2.1 a android.hardware.graphics.composer@2.4 sono ritirate.

Questa pagina descrive le differenze tra l'HAL AIDL e l'HAL HIDL per l'HWC, nonché l'implementazione e il test dell'HAL AIDL.

A causa dei vantaggi offerti da AIDL, i fornitori sono incoraggiati a implementare il compilatore HAL AIDL a partire da Android 13 anziché la versione HIDL. Per ulteriori informazioni, consulta la sezione Implementazione.

Differenze tra HAL AIDL e HIDL

Il nuovo HAL del compositore AIDL, denominato android.hardware.graphics.composer3, è definito in IComposer.aidl. Espone un'API simile all'HAL HIDLandroid.hardware.graphics.composer@2.4 con le seguenti modifiche:

  • Rimozione della coda di messaggi rapida (FMQ) in favore dei comandi parcellabili.

    L'HAL AIDL definisce l'interfaccia dei comandi in base a tipi parcellabili fortemente tipi, rispetto ai comandi serializzati tramite FMQ in HIDL. Ciò offre un'interfaccia stabile per i comandi e una definizione più leggibile di come viene interpretato il payload del comando.

    Il metodo executeCommands è definito in IComposerClient.aidl come

    CommandResultPayload[] executeCommands(in DisplayCommand[] commands);
    

    dove ogni comando è un tipo di parcelable fortemente tipizzato definito in DisplayCommand.aidl. Le risposte ai comandi sono parcelable con tipi di dati definiti in CommandResultPayload.aidl.

  • Rimozione di IComposerClient.getClientTargetSupport in quanto non sono presenti clienti attivi per questo metodo.

  • Rappresentazione dei colori come valori float anziché byte per allinearsi meglio con la pila grafica superiore in Android, come definito in ASurfaceTransaction_setColor.

  • Aggiunta di nuovi campi per il controllo dei contenuti HDR.

    Nell'HAL AIDL, le serie di livelli SDR/HDR misti supportano l'attenuazione uniforme dei livelli SDR quando sullo schermo è presente contemporaneamente un livello HDR.

    Il campo brightness in LayerCommand consente a SurfaceFlinger di specificare una luminosità per livello, in modo che l'HWC riduca la luminosità dei contenuti del livello nello spazio della luce lineare, anziché nello spazio gamma.

    Il campo brightness in ClientTargetPropertyWithBrightness consente all'HWC di specificare lo spazio di luminosità per la composizione del client e di indicare a RenderEngine se attenuare i livelli SDR nella composizione del client.

    Il campo dimmingStage consente all'HWC di configurare quando RenderEngine deve attenuare i contenuti. In questo modo, è possibile gestire i ColorModes definiti dal fornitore, che potrebbero preferire attenuare lo spazio gamma, per consentire miglioramenti del contrasto definiti dal fornitore nelle pipeline di colore.

  • È stato aggiunto un nuovo tipo di composizione DISPLAY_DECORATION in Composition.aidl per le decorazioni dello schermo.

    Alcuni dispositivi dispongono di hardware dedicato per ottimizzare il disegno della maschera alfa che smussa gli angoli arrotondati e i ritagli sui display. I dispositivi con questo hardware devono implementare IComposerClient.getDisplayDecorationSupport per restituire una struttura DisplayDecorationSupport come definita nel nuovo DisplayDecorationSupport.aidl. Questa struttura descrive gli enum PixelFormat e AlphaInterpretation richiesti dal dispositivo. In seguito a questa implementazione, l'interfaccia utente di sistema contrassegna il livello della maschera alfa come DISPLAY_DECORATION, un nuovo tipo di composizione che sfrutta l'hardware dedicato.

  • Aggiunta di un nuovo campo expectedPresentTime a DisplayCommand.aidl.

    Il campo expectedPresentTime consente a SurfaceFlinger di impostare il tempo presente previsto per la visualizzazione sullo schermo dei contenuti correnti. Con questa funzionalità, SurfaceFlinger invia un comando di invio all'implementazione in anticipo, consentendo di eseguire in pipeline una maggiore parte del lavoro di composizione.

  • Aggiunta di nuove API per controllare la configurazione del display di avvio.

    Utilizzando BOOT_DISPLAY_CONFIG, i fornitori possono specificare che la configurazione del display di avvio è supportata. I metodi setBootDisplayConfig, clearBootDisplayConfig e getPreferredBootDisplayConfig utilizzano BOOT_DISPLAY_CONFIG come segue:

    • Utilizzando setBootDisplayConfig, il framework informa i fornitori della configurazione della visualizzazione del tempo di avvio. I fornitori devono memorizzare nella cache la configurazione di visualizzazione del boot e avviarsi in questa configurazione al successivo riavvio. Se il dispositivo non riesce ad avviarsi in questa configurazione, il fornitore deve trovare una configurazione che corrisponda alla risoluzione e alla frequenza di aggiornamento di questa configurazione. Se non esiste una configurazione di questo tipo, il fornitore deve utilizzare la configurazione di visualizzazione che preferisce.

    • Utilizzando clearBootDisplayConfig, il framework informa i fornitori di cancellare la configurazione del display di avvio e di avviare il sistema nella configurazione del display che preferiscono durante il riavvio successivo.

    • Utilizzando getPreferredBootDisplayConfig, il framework esegue una query sulla modalità di avvio preferita del fornitore.

    Quando la configurazione del display di avvio non è supportata, questi metodi restituiscono un valore UNSUPPORTED.

  • Aggiunta di nuove API per controllare il timer di inattività del display.

    • Utilizzando DISPLAY_IDLE_TIMER, i fornitori possono specificare che un timer di inattività è implementato dal fornitore per questo display. Inutilizzata, questa funzionalità modifica la frequenza di aggiornamento impostandola su un valore inferiore per risparmiare energia. La piattaforma utilizza setIdleTimerEnabled per controllare il timeout del timer e, in alcuni casi, per disattivarlo al fine di evitare cambi indesiderati della frequenza di aggiornamento in stato di inattività.

    • L'utilizzo del callback IComposerCallback.onVsyncIdle indica alla piattaforma che il display è inattivo e che la cadenza vsync è cambiata. La piattaforma risponde a questo callback reimpostando il suo vsync modello. Forza una vsyncrisincronizzazione sul frame successivo e apprende la nuova vsync cadenza.

Implementazione

I fornitori non sono tenuti a implementare l'HAL AIDL per Android 13. Tuttavia, vengono incoraggiati a implementare l'HAL del compositore AIDL instead della versione HIDL per utilizzare le nuove funzionalità e API.

Negli emulatori Android è implementata un'implementazione di riferimento per l'HAL HWC AIDL.

Test

Per testare l'implementazione, esegui VtsHalGraphicsComposer3_TargetTest.