Kemampuan tampilan (seperti mode tampilan dan jenis HDR yang didukung) dapat berubah secara dinamis pada perangkat yang memiliki tampilan yang terhubung secara eksternal (melalui HDMI atau DisplayPort), seperti set-top-box (STB) Android TV dan over-the-top (OTT) perangkat. Perubahan ini dapat terjadi sebagai akibat dari sinyal colokan panas HDMI, seperti saat pengguna beralih dari satu layar ke layar lain atau mem-boot perangkat tanpa layar yang tersambung. Sejak Android 12, perubahan telah dibuat dalam kerangka kerja untuk menangani hot plugging dan kemampuan tampilan dinamis.
Halaman ini membahas cara menangani hot plug tampilan dan perubahan kemampuan tampilan dalam implementasi Composer HAL. Selain itu membahas bagaimana mengelola framebuffer terkait dan mencegah kondisi balapan dalam situasi ini.
Memperbarui kemampuan tampilan
Bagian ini menjelaskan cara kerangka kerja Android menangani perubahan dalam kemampuan tampilan yang diprakarsai oleh Composer HAL.
Sebelum Android dapat menangani perubahan kemampuan tampilan dengan benar, OEM harus mengimplementasikan Komposer HAL sedemikian rupa sehingga menggunakan onHotplug(display, connection=CONNECTED)
untuk memberi tahu framework tentang setiap perubahan pada kemampuan tampilan. Setelah diimplementasikan, Android menangani perubahan untuk menampilkan kemampuan sebagai berikut:
- Saat mendeteksi perubahan dalam kemampuan tampilan, kerangka kerja menerima
onHotplug(display, connection=CONNECTED)
. - Saat menerima notifikasi, framework menurunkan status tampilannya dan membuatnya kembali dengan kemampuan baru dari HAL menggunakan metode
getActiveConfig
,getDisplayConfigs
,getDisplayAttribute
,getColorModes
,getHdrCapabilities
, dangetDisplayCapabilities
. - Setelah kerangka kerja membuat ulang status tampilan baru, ia mengirimkan panggilan balik
onDisplayChanged
ke aplikasi yang mendengarkan peristiwa tersebut.
Kerangka kerja mengalokasikan ulang framebuffer pada onHotplug(display, connection=CONNECTED)
berikutnya. Lihat Mengelola memori framebuffer untuk informasi lebih lanjut tentang cara menangani ini.
Menangani skenario koneksi umum
Bagian ini membahas cara menangani berbagai skenario koneksi dengan benar dalam implementasi Anda saat layar utama tersambung dan terputus.
Karena dibuat untuk perangkat seluler, kerangka kerja Android tidak memiliki dukungan bawaan untuk tampilan utama yang terputus. Alih-alih, HAL harus mengganti tampilan utama dengan tampilan placeholder dalam interaksinya dengan kerangka kerja jika tampilan utama terputus secara fisik.
Skenario berikut dapat terjadi pada dekoder dan dongle TV yang memiliki layar yang terhubung secara eksternal yang dapat diputuskan. Untuk menerapkan dukungan untuk skenario ini, gunakan informasi dalam tabel di bawah ini:
Skenario | Penanganan |
---|---|
Tidak ada tampilan yang terhubung saat boot |
|
Tampilan utama terhubung secara fisik |
|
Tampilan utama terputus secara fisik |
|
Mengelola memori framebuffer
Saat tampilan yang sudah terhubung menerima acara pemberitahuan onHotplug(display, connection=CONNECTED)
berikutnya, kerangka kerja mengalokasikan ulang framebuffer yang terkait dengan tampilan ini. Implementasi perangkat harus mengantisipasi perilaku ini dan mengelola memori framebuffer dengan benar. Gunakan panduan berikut dalam penerapan Anda:
Sebelum mengirim event notifikasi
onHotplug(display, connection=CONNECTED)
berikutnya, pastikan untuk melepaskan pegangan ke framebuffer sehingga sistem dapat membatalkan alokasinya dengan benar, sebelum mengalokasikannya kembali. Jika deallokasi tidak berhasil, realokasi mungkin gagal karena kekurangan memori.Sebaiknya alokasikan kumpulan memori khusus untuk framebuffer yang terpisah dari buffer memori grafis lainnya.
Ini penting karena antara dealokasi dan realokasi framebuffer, proses pihak ketiga dapat mencoba mengalokasikan memori grafis. Jika kumpulan memori grafis yang sama digunakan oleh framebuffer dan jika memori grafis penuh, proses pihak ketiga dapat menempati memori grafis yang sebelumnya dialokasikan oleh framebuffer, sehingga menyisakan memori yang tidak mencukupi untuk realokasi framebuffer (atau mungkin memecah ruang memori) .
Menggunakan ID konfigurasi berurutan untuk mencegah kondisi balapan
Kondisi balapan dapat muncul jika HAL Komposer memperbarui konfigurasi tampilan yang didukung secara bersamaan dengan kerangka kerja yang memanggil setActiveConfig
atau setActiveConfigWithConstraints
. Solusinya adalah mengimplementasikan Composer HAL untuk menggunakan ID sekuensial dan mencegah masalah ini.
Bagian ini menjelaskan bagaimana kondisi balapan dapat terjadi, diikuti dengan detail tentang cara mengimplementasikan Composer HAL sehingga menggunakan ID berurutan untuk mencegah kondisi tersebut.
Pertimbangkan urutan kejadian berikut ini, ketika ID sekuensial baru TIDAK ditetapkan ke konfigurasi tampilan baru, yang menyebabkan kondisi balapan:
ID konfigurasi tampilan yang didukung adalah:
- id=1 , 1080x1920 60hz
- id=2 , 1080x1920 50hz
Kerangka kerja memanggil
setActiveConfig(display, config=1)
.Secara bersamaan, Composer HAL memproses perubahan konfigurasi tampilan dan memperbarui status internalnya ke kumpulan konfigurasi tampilan baru, yang ditunjukkan sebagai berikut:
- id=1 , 2160x3840 60hz
- id=2 , 2160x3840 50hz
- id=3 , 1080x1920 60hz
- id=4 , 1080x1920 50hz
Komposer HAL mengirimkan acara
onHotplug
ke kerangka kerja, untuk memberi tahu bahwa set mode yang didukung telah berubah.Komposer HAL menerima
setActiveConfig(display, config=1)
(dari langkah 2).HAL menafsirkan bahwa kerangka kerja telah meminta perubahan konfigurasi menjadi 2160x3840 60hz , meskipun pada kenyataannya 1080x1920 60hz diinginkan.
Proses menggunakan penetapan ID non-urutan berakhir di sini dengan salah tafsir dari perubahan konfigurasi yang diinginkan.
Mengonfigurasi Komposer HAL untuk menggunakan ID berurutan
Untuk menghindari kondisi balapan seperti itu, OEM harus menerapkan Composer HAL sebagai berikut:
- Ketika Composer HAL memperbarui konfigurasi tampilan yang didukung, ia menetapkan ID baru yang berurutan ke konfigurasi tampilan baru.
- Saat kerangka kerja memanggil
setActiveConfig
atausetActiveConfigWithConstraints
dengan ID konfigurasi yang tidak valid, HAL Komposer akan mengabaikan panggilan tersebut.
Langkah-langkah ini berfungsi untuk mencegah kondisi balapan seperti yang ditunjukkan pada pembahasan berikut.
Pertimbangkan urutan peristiwa berikut, saat ID berurutan baru ditetapkan ke konfigurasi tampilan baru:
ID konfigurasi tampilan yang didukung adalah:
- id=1 , 1080x1920 60hz
- id=2 , 1080x1920 50hz
Kerangka kerja memanggil
setActiveConfig(display, config=1)
.Saat perubahan konfigurasi tampilan diproses, set ID konfigurasi berikutnya ditetapkan mulai dari bilangan bulat yang tidak digunakan berikutnya, ditunjukkan sebagai berikut:
id=3 , 2160x3840 60hz
id=4 , 2160x3840 50hz
id=5 , 1080x1920 60hz
id=6 , 1080x1920 50hz
Composer HAL mengirimkan event
onHotplug
ke framework, untuk memberi tahu bahwa set mode yang didukung telah berubah.Komposer HAL menerima
setActiveConfig(display, config=1)
(dari langkah 2).Komposer HAL mengabaikan panggilan karena ID tidak lagi valid.
Framework menerima dan memproses event
onHotplug
dari langkah 4. Ini memanggil Composer HAL menggunakan fungsigetDisplayConfigs
dangetDisplayAttribute
. Dengan fungsi-fungsi ini, kerangka kerja mengidentifikasi ID baru (5) untuk resolusi dan kecepatan refresh 1080x1920 dan 60Hz yang diinginkan.Framework mengirimkan acara
setActiveConfig
lain dengan ID 5 yang diperbarui.Komposer HAL menerima
setActiveConfig(display, config=5)
dari langkah 5.HAL menafsirkan dengan benar bahwa kerangka kerja telah meminta perubahan konfigurasi ke 1080x1920 60hz.
Seperti yang ditunjukkan pada contoh di atas, proses menggunakan penetapan ID berurutan memastikan bahwa kondisi balapan dicegah dan perubahan konfigurasi tampilan yang benar diperbarui.