Mulai Android 13, HAL Hardware Composer (HWC) ditentukan dalam
AIDL dan versi HIDL yang berkisar dari
android.hardware.graphics.composer@2.1
hingga
android.hardware.graphics.composer@2.4
tidak digunakan lagi.
Halaman ini menjelaskan perbedaan antara AIDL dan HIDL HAL untuk HWC serta penerapan dan pengujian AIDL HAL.
Karena keunggulan yang ditawarkan oleh AIDL, vendor dianjurkan untuk menerapkan HAL composer AIDL mulai Android 13, bukan versi HIDL. Lihat bagian Implementasi untuk mengetahui informasi selengkapnya.
Perbedaan antara AIDL dan HIDL HAL
HAL composer AIDL baru, bernama android.hardware.graphics.composer3
, ditentukan di IComposer.aidl
.
API ini mengekspos API yang mirip dengan HIDL HAL
android.hardware.graphics.composer@2.4
dengan perubahan berikut:
Penghapusan Antrean Pesan Cepat (FMQ) untuk mendukung perintah parcelable.
AIDL HAL menentukan antarmuka perintah berdasarkan jenis yang dapat dipartisi dengan strongly typed, bukan perintah serialisasi melalui FMQ di HIDL. Hal ini menyediakan antarmuka yang stabil untuk perintah dan definisi yang lebih mudah dibaca tentang cara payload perintah ditafsirkan.
Metode
executeCommands
ditentukan diIComposerClient.aidl
sebagaiCommandResultPayload[] executeCommands(in DisplayCommand[] commands);
dengan setiap perintah adalah jenis parcelable dengan strongly typed yang ditentukan di
DisplayCommand.aidl
. Respons perintah adalah parcelable dengan jenis yang ketat yang ditentukan diCommandResultPayload.aidl
.Penghapusan
IComposerClient.getClientTargetSupport
karena tidak ada klien aktif untuk metode ini.Representasi warna sebagai float, bukan byte, agar lebih selaras dengan stack grafis atas di Android seperti yang ditentukan dalam
ASurfaceTransaction_setColor
.Penambahan kolom baru untuk mengontrol konten HDR.
Di AIDL HAL, tumpukan lapisan SDR/HDR campuran mendukung peredupan lapisan SDR yang lancar saat lapisan HDR ditampilkan secara bersamaan di layar.
Kolom
brightness
diLayerCommand
memungkinkan SurfaceFlinger menentukan kecerahan per lapisan, sehingga HWC meredupkan konten lapisan dalam ruang cahaya linear, bukan ruang gamma.Kolom
brightness
diClientTargetPropertyWithBrightness
memungkinkan HWC menentukan ruang kecerahan untuk komposisi klien dan memberi petunjuk kepadaRenderEngine
apakah akan meredupkan lapisan SDR dalam komposisi klien.Kolom
dimmingStage
memungkinkan HWC mengonfigurasi kapanRenderEngine
harus meredupkan konten. Hal ini menampungColorModes
yang ditentukan vendor, yang mungkin lebih suka meredup di ruang gamma, untuk memungkinkan peningkatan kontras yang ditentukan vendor di pipeline warnanya.Penambahan jenis komposisi baru
DISPLAY_DECORATION
diComposition.aidl
untuk dekorasi layar.Beberapa perangkat memiliki hardware khusus untuk mengoptimalkan gambar mask alfa yang memperhalus sudut membulat dan potongan pada layar. Perangkat dengan hardware tersebut harus menerapkan
IComposerClient.getDisplayDecorationSupport
untuk menampilkan strukturDisplayDecorationSupport
seperti yang ditentukan dalamDisplayDecorationSupport.aidl
baru. Struktur ini menjelaskan enumPixelFormat
danAlphaInterpretation
yang diperlukan oleh perangkat. Setelah penerapan ini, UI Sistem menandai lapisan mask alfa sebagaiDISPLAY_DECORATION
, jenis komposisi baru yang memanfaatkan hardware khusus.Penambahan kolom
expectedPresentTime
baru keDisplayCommand.aidl
.Kolom
expectedPresentTime
memungkinkan SurfaceFlinger menetapkan waktu saat ini yang diharapkan ke saat konten saat ini harus ditampilkan di layar. Dengan fitur ini, SurfaceFlinger mengirimkan perintah present ke implementasi terlebih dahulu, sehingga memungkinkannya melakukan pipeline lebih banyak pekerjaan komposisi.Penambahan API baru untuk mengontrol konfigurasi tampilan booting.
Dengan menggunakan
BOOT_DISPLAY_CONFIG
, vendor dapat menentukan bahwa konfigurasi tampilan booting didukung. MetodesetBootDisplayConfig
,clearBootDisplayConfig
, dangetPreferredBootDisplayConfig
menggunakanBOOT_DISPLAY_CONFIG
sebagai berikut:Dengan menggunakan
setBootDisplayConfig
, framework akan memberi tahu vendor tentang konfigurasi tampilan waktu booting. Vendor harus menyimpan cache dalam konfigurasi tampilan booting, dan melakukan booting dalam konfigurasi ini saat memulai ulang berikutnya. Jika perangkat tidak dapat melakukan booting dalam konfigurasi ini, vendor harus menemukan konfigurasi yang cocok dengan resolusi dan kecepatan refresh konfigurasi ini. Jika konfigurasi tersebut tidak ada, vendor harus menggunakan konfigurasi tampilan pilihan mereka.Dengan menggunakan
clearBootDisplayConfig
, framework akan memberi tahu vendor untuk menghapus konfigurasi tampilan booting, dan mem-booting dalam konfigurasi tampilan pilihan mereka selama mulai ulang berikutnya.Dengan menggunakan
getPreferredBootDisplayConfig
, framework membuat kueri mode booting pilihan vendor.
Jika konfigurasi tampilan booting tidak didukung, metode ini akan menampilkan nilai
UNSUPPORTED
.Penambahan API baru untuk mengontrol timer tidak ada aktivitas tampilan.
Dengan menggunakan
DISPLAY_IDLE_TIMER
, vendor dapat menentukan bahwa timer tidak aktif diterapkan oleh vendor untuk layar ini. Saat tidak ada aktivitas, kemampuan ini akan mengubah kecepatan refresh ke setelan yang lebih rendah untuk menghemat daya. Platform ini menggunakansetIdleTimerEnabled
untuk mengontrol waktu tunggu timer, dan dalam beberapa kasus, untuk menonaktifkannya agar mencegah peralihan kecepatan refresh yang tidak diinginkan saat tidak ada aktivitas.Penggunaan callback
IComposerCallback.onVsyncIdle
menunjukkan kepada platform bahwa layar tidak ada aktivitas dan ritmevsync
telah berubah. Platform merespons callback ini dengan mereset modelvsync
-nya. Tindakan ini akan memaksa sinkronisasi ulangvsync
pada frame berikutnya, dan mempelajari kadenvsync
baru.
Implementasi
Vendor tidak diharuskan untuk mengimplementasikan AIDL HAL untuk Android 13. Namun, mereka dianjurkan untuk menerapkan HAL composer AIDL, bukan versi HIDL, untuk menggunakan fungsi dan API baru.
Implementasi referensi untuk AIDL HWC HAL diimplementasikan di emulator Android.
Pengujian
Untuk menguji implementasi Anda, jalankan VtsHalGraphicsComposer3_TargetTest
.