Penanganan hotplug

Kemampuan tampilan (seperti mode tampilan dan jenis HDR yang didukung) dapat berubah secara dinamis pada perangkat yang memiliki layar yang terhubung secara eksternal (dengan HDMI atau DisplayPort), seperti set-top-box (STB) Android TV dan over-the-top (OTT) perangkat. Perubahan ini dapat terjadi sebagai akibat dari sinyal hotplug HDMI, seperti saat pengguna beralih dari satu layar ke layar lainnya atau melakukan booting perangkat tanpa layar yang tersambung. Android 12 dan lebih tinggi menyertakan perubahan dalam framework untuk menangani hotplugging dan kemampuan tampilan dinamis.

Halaman ini menjelaskan penanganan hotplug tampilan dan perubahan kemampuan tampilan dalam implementasi Composer HAL. Selain itu, diskusi ini membahas cara mengelola framebuffer terkait dan mencegah kondisi balapan dalam situasi ini.

Perbarui kemampuan tampilan

Bagian ini menjelaskan cara framework Android menangani perubahan kemampuan tampilan yang dimulai oleh Composer HAL.

Sebelum Android dapat menangani perubahan kemampuan tampilan dengan benar, OEM harus mengimplementasikan Composer HAL sehingga menggunakan onHotplug(display, connection=CONNECTED) untuk memberi tahu framework tentang perubahan apa pun pada kemampuan tampilan. Setelah diterapkan, Android menangani perubahan pada kemampuan tampilan sebagai berikut:

  1. Saat mendeteksi perubahan dalam kemampuan tampilan, kerangka kerja menerima pemberitahuan onHotplug(display, connection=CONNECTED) .
  2. Saat menerima notifikasi, kerangka kerja menghilangkan status tampilannya dan membuatnya kembali dengan kemampuan baru dari HAL dengan menggunakan metode getActiveConfig , getDisplayConfigs , getDisplayAttribute , getColorModes , getHdrCapabilities , dan getDisplayCapabilities .
  3. Setelah kerangka kerja membuat ulang status tampilan baru, kerangka kerja mengirimkan panggilan balik onDisplayChanged ke aplikasi yang mendengarkan peristiwa tersebut.

Kerangka kerja ini mengalokasikan kembali framebuffer pada peristiwa onHotplug(display, connection=CONNECTED) berikutnya. Lihat Manajemen framebuffer klien untuk informasi selengkapnya tentang cara mengelola memori framebuffer dengan benar untuk menghindari kegagalan selama alokasi framebuffer baru.

Tangani 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 tidak terhubung. Sebaliknya HAL harus mengganti tampilan utama dengan tampilan placeholder dalam interaksinya dengan kerangka kerja jika tampilan utama terputus secara fisik.

Skenario berikut dapat terjadi di STB dan dongle TV yang memiliki layar tersambung secara eksternal yang dapat diputuskan sambungannya. Untuk menerapkan dukungan pada skenario ini, gunakan informasi dalam tabel di bawah:

Skenario Penanganan
Tidak ada tampilan yang terhubung saat boot
  • Kirim sinyal onHotplug(display, connection=CONNECTED) dari Composer HAL ke framework.
  • Ganti status tampilan fisik di dalam Composer HAL dengan status tampilan placeholder.
Layar utama terhubung secara fisik
Layar utama terputus secara fisik
  • Kirim acara onHotplug(display, connection=CONNECTED) lainnya dari Composer HAL ke framework.
  • Ganti status tampilan fisik di dalam Composer HAL dengan status tampilan placeholder. Tampilan placeholder harus memiliki mode tampilan tunggal, sehingga kerangka kerja mengirimkan callback onDisplayChanged ke aplikasi (karena rangkaian mode yang didukung telah berubah). Mode tampilan tunggal ini harus cocok dengan mode aktif terakhir dari tampilan fisik sebelum pemutusan sambungan, sehingga aplikasi tidak menerima peristiwa perubahan konfigurasi .

Gunakan ID konfigurasi berurutan untuk mencegah kondisi balapan

Kondisi balapan dapat muncul jika Composer HAL memperbarui konfigurasi tampilan yang didukung secara bersamaan dengan pemanggilan kerangka kerja setActiveConfig atau setActiveConfigWithConstraints . Solusinya adalah dengan mengimplementasikan Composer HAL untuk menggunakan ID berurutan dan mencegah masalah ini.

Bagian ini menjelaskan bagaimana kondisi balapan mungkin terjadi, diikuti dengan detail tentang cara mengimplementasikan Composer HAL sehingga menggunakan ID berurutan untuk mencegah kondisi tersebut.

Pertimbangkan urutan kejadian berikut, ketika ID berurutan yang baru TIDAK ditetapkan ke konfigurasi tampilan baru, sehingga menyebabkan kondisi balapan:

  1. ID konfigurasi tampilan yang didukung adalah:

    • ID=1 , 1080x1920 60Hz
    • ID=2 , 1080x1920 50Hz
  2. Kerangka kerja ini 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 event onHotplug ke framework, untuk memberitahukan bahwa rangkaian 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 60 Hz , meskipun pada kenyataannya diinginkan 1080x1920 60 Hz .

Proses menggunakan penetapan ID yang tidak berurutan berakhir di sini dengan salah tafsir terhadap perubahan konfigurasi yang diinginkan.

Konfigurasikan Composer HAL untuk menggunakan ID berurutan

Untuk menghindari kondisi balapan seperti itu, OEM harus menerapkan Composer HAL sebagai berikut:

  • Saat Composer HAL memperbarui konfigurasi tampilan yang didukung, HAL akan menetapkan ID berurutan baru ke konfigurasi tampilan baru.
  • Ketika kerangka kerja memanggil setActiveConfig atau setActiveConfigWithConstraints dengan ID konfigurasi yang tidak valid, Composer HAL mengabaikan panggilan tersebut.

Langkah-langkah ini berfungsi untuk mencegah kondisi balapan seperti yang ditunjukkan pada pembahasan berikut.

Pertimbangkan urutan kejadian berikut, ketika 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 ini memanggil setActiveConfig(display, config=1) .

  3. Ketika perubahan konfigurasi tampilan diproses, kumpulan ID konfigurasi berikutnya ditetapkan mulai dari bilangan bulat berikutnya yang tidak digunakan, yang 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 memberitahukan bahwa rangkaian mode yang didukung telah berubah.

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

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

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

  8. Kerangka kerja mengirimkan acara setActiveConfig lainnya dengan ID 5 yang diperbarui.

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

  10. HAL dengan benar menafsirkan bahwa kerangka kerja telah meminta perubahan konfigurasi menjadi 1080x1920 60 Hz.

Seperti yang ditunjukkan pada contoh di atas, proses yang menggunakan penetapan ID berurutan memastikan bahwa kondisi balapan dicegah dan perubahan konfigurasi tampilan yang benar diperbarui.