Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Penanganan steker panas di Komposer HAL

Kemampuan tampilan (seperti mode tampilan dan jenis HDR yang didukung) dapat berubah secara dinamis pada perangkat yang memiliki layar 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 dalam kemampuan layar dengan benar, OEM harus menerapkan Composer HAL rupa sehingga menggunakan onHotplug(display, connection=CONNECTED) untuk memberitahukan rangka perubahan kemampuan layar. Setelah diimplementasikan, Android menangani perubahan untuk menampilkan kemampuan sebagai berikut:

  1. Pada mendeteksi perubahan dalam kemampuan layar, kerangka menerima onHotplug(display, connection=CONNECTED) pemberitahuan.
  2. Pada menerima pemberitahuan, kerangka tetes negara display dan kembali menciptakan itu dengan kemampuan baru dari HAL dengan menggunakan getActiveConfig , getDisplayConfigs , getDisplayAttribute , getColorModes , getHdrCapabilities dan getDisplayCapabilities metode.
  3. Setelah kerangka recreates negara tampilan baru, ia akan mengirimkan onDisplayChanged panggilan balik ke aplikasi yang mendengarkan untuk acara tersebut.

Kerangka kerja ini direalokasi yang framebuffers pada berikutnya onHotplug(display, connection=CONNECTED) peristiwa. Lihat Mengelola memori framebuffer untuk informasi lebih lanjut tentang bagaimana untuk menangani hal 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) sinyal dari Composer HAL untuk kerangka kerja.
  • 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 lain onHotplug(display, connection=CONNECTED) acara dari Composer HAL untuk kerangka kerja.
  • Ganti status tampilan fisik di dalam Komposer HAL dengan status tampilan placeholder. Tampilan placeholder harus memiliki mode tampilan tunggal, sehingga kerangka mengirimkan onDisplayChanged callback untuk aplikasi (sejak set mode yang didukung telah berubah). Mode tampilan tunggal ini harus cocok dengan modus aktif terakhir dari tampilan fisik sebelum pemutusan, sehingga aplikasi tidak menerima peristiwa perubahan konfigurasi .

Mengelola memori framebuffer

Ketika layar sudah terhubung menerima berikutnya onHotplug(display, connection=CONNECTED) pemberitahuan acara, kerangka direalokasi yang framebuffers terkait dengan tampilan ini. Implementasi perangkat harus mengantisipasi perilaku ini dan mengelola memori framebuffer dengan benar. Gunakan panduan berikut dalam penerapan Anda:

  • Sebelum mengirim berikutnya onHotplug(display, connection=CONNECTED) acara pemberitahuan, pastikan untuk melepaskan pegangan ke framebuffers sehingga sistem benar dapat deallocate mereka, sebelum realokasi mereka. 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 ras dapat timbul jika Composer HAL update display konfigurasi yang didukung bersamaan dengan kerangka 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, ketika ID sekuensial baru TIDAK ditetapkan ke konfigurasi tampilan baru, menyebabkan kondisi balapan:

  1. ID konfigurasi tampilan yang didukung adalah:

    • id = 1, 1080x1920 60Hz
    • id = 2, 1080x1920 50Hz
  2. Kerangka panggilan setActiveConfig(display, config=1) .

  3. Secara bersamaan, Komposer 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 onHotplug acara untuk kerangka kerja, untuk memberitahukan bahwa himpunan mode yang didukung telah berubah.

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

  6. The menafsirkan HAL bahwa kerangka telah meminta perubahan konfigurasi untuk 2160x3840 60Hz, meskipun pada kenyataannya 1080x1920 60Hz itu yang diinginkan.

Proses menggunakan penetapan ID non-sekuensial 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 berurutan ke konfigurasi tampilan baru.
  • Ketika kerangka panggilan setActiveConfig atau setActiveConfigWithConstraints dengan konfigurasi ID tidak valid, Composer HAL mengabaikan panggilan.

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

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

  3. Ketika 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 onHotplug acara untuk kerangka kerja, untuk memberitahukan bahwa himpunan mode yang didukung telah berubah.

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

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

  7. Kerangka menerima dan memproses onHotplug acara dari langkah 4. Ini panggilan ke HAL Composer 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. Kerangka mengirimkan lain setActiveConfig acara dengan ID diperbarui dari 5.

  9. Composer 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.