Penanganan steker panas di Komposer HAL

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:

  1. Saat mendeteksi perubahan dalam kemampuan tampilan, kerangka kerja menerima onHotplug(display, connection=CONNECTED) .
  2. Saat menerima notifikasi, framework menurunkan status tampilannya dan membuatnya kembali dengan kemampuan baru dari HAL menggunakan metode getActiveConfig , getDisplayConfigs , getDisplayAttribute , getColorModes , getHdrCapabilities , dan getDisplayCapabilities .
  3. 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
  • Kirim onHotplug(display, connection=CONNECTED) dari Composer HAL ke framework.
  • Ganti status tampilan fisik di dalam Komposer HAL dengan status tampilan placeholder.

    Catatan: Kami merekomendasikan tampilan placeholder untuk memiliki satu mode yang didukung dengan resolusi 1080x1920 dan kecepatan refresh 60hz, karena mode tampilan ini didukung oleh sebagian besar aplikasi.

Tampilan utama terhubung secara fisik
Tampilan utama terputus secara fisik
  • Kirim onHotplug(display, connection=CONNECTED) lainnya dari Composer HAL ke framework.
  • Ganti status tampilan fisik di dalam Komposer HAL dengan status tampilan placeholder. Tampilan placeholder harus memiliki mode tampilan tunggal, sehingga kerangka kerja mengirimkan panggilan balik onDisplayChanged ke aplikasi (karena kumpulan mode yang didukung telah berubah). Mode tampilan tunggal ini harus cocok dengan mode aktif terakhir dari tampilan fisik sebelum pemutusan, sehingga aplikasi tidak menerima peristiwa perubahan konfigurasi .

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:

  1. ID konfigurasi tampilan yang didukung adalah:

    • id=1 , 1080x1920 60hz
    • id=2 , 1080x1920 50hz
  2. Kerangka kerja memanggil setActiveConfig(display, config=1) .

  3. 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
  4. Komposer HAL mengirimkan acara onHotplug ke kerangka kerja, untuk memberi tahu bahwa set mode yang didukung telah berubah.

  5. Komposer HAL menerima setActiveConfig(display, config=1) (dari langkah 2).

  6. 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 atau setActiveConfigWithConstraints 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:

  1. ID konfigurasi tampilan yang didukung adalah:

    • id=1 , 1080x1920 60hz
    • id=2 , 1080x1920 50hz
  2. Kerangka kerja memanggil setActiveConfig(display, config=1) .

  3. 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

  4. Composer HAL mengirimkan event onHotplug ke framework, untuk memberi tahu bahwa set mode yang didukung telah berubah.

  5. Komposer HAL menerima setActiveConfig(display, config=1) (dari langkah 2).

  6. Komposer HAL mengabaikan panggilan karena ID tidak lagi valid.

  7. Framework menerima dan memproses event onHotplug dari langkah 4. Ini memanggil Composer HAL menggunakan fungsi getDisplayConfigs dan getDisplayAttribute . Dengan fungsi-fungsi ini, kerangka kerja mengidentifikasi ID baru (5) untuk resolusi dan kecepatan refresh 1080x1920 dan 60Hz yang diinginkan.

  8. Framework mengirimkan acara setActiveConfig lain dengan ID 5 yang diperbarui.

  9. Komposer HAL menerima setActiveConfig(display, config=5) dari langkah 5.

  10. 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.