Menerapkan Komposer Perangkat Keras HAL

Lapisan komposit HAL Komposer Perangkat Keras (HWC) yang diterima dari SurfaceFlinger, mengurangi jumlah komposisi OpenGL ES (GLES) dan kinerja GPU.

HWC mengabstraksi objek, seperti overlay dan kedipan 2D, ke permukaan komposit dan berkomunikasi dengan perangkat keras komposisi jendela khusus ke jendela komposit. Gunakan HWC untuk menggabungkan jendela alih-alih memiliki komposit SurfaceFlinger dengan GPU. Sebagian besar GPU tidak dioptimalkan untuk komposisi, dan saat GPU membuat lapisan dari SurfaceFlinger, aplikasi tidak dapat menggunakan GPU untuk renderingnya sendiri.

Implementasi HWC harus mendukung:

  • Setidaknya empat overlay:
    • Status bar
    • Bilah sistem
    • Aplikasi
    • Wallpaper/latar belakang
  • Lapisan yang lebih besar dari tampilan (misalnya, wallpaper)
  • Pencampuran alfa per piksel yang digandakan secara simultan dan pencampuran alfa per bidang
  • Jalur perangkat keras untuk pemutaran video yang dilindungi
  • Urutan pengepakan RGBA, format YUV, dan properti ubin, swizzling, dan langkah

Untuk menerapkan HWC:

  1. Terapkan HWC nonoperasional dan kirim semua pekerjaan komposisi ke GLES.
  2. Menerapkan algoritme untuk mendelegasikan komposisi ke HWC secara bertahap. Misalnya, delegasikan hanya tiga atau empat permukaan pertama ke perangkat keras overlay HWC.
  3. Optimalkan HWC. Ini mungkin termasuk:
    • Memilih permukaan yang memaksimalkan beban yang diambil dari GPU dan mengirimkannya ke HWC.
    • Mendeteksi apakah layar sedang diperbarui. Jika tidak, delegasikan komposisi ke GLES alih-alih HWC untuk menghemat daya. Saat layar diperbarui lagi, lanjutkan untuk menurunkan komposisi ke HWC.
    • Mempersiapkan kasus penggunaan umum seperti:
      • Layar beranda, yang mencakup bilah status, bilah sistem, jendela aplikasi, dan wallpaper hidup
      • Game layar penuh dalam mode potret dan lanskap
      • Video layar penuh dengan teks tertutup dan kontrol pemutaran
      • Pemutaran video yang dilindungi
      • Multiwindow layar terpisah

Primitif HWC

HWC menyediakan dua primitif, lapisan dan tampilan , untuk mewakili pekerjaan komposisi dan interaksinya dengan perangkat keras tampilan. HWC juga menyediakan kontrol atas VSYNC dan panggilan balik ke SurfaceFlinger untuk memberi tahunya ketika peristiwa VSYNC terjadi.

antarmuka HIDL

Android 8.0 dan yang lebih tinggi menggunakan antarmuka HIDL yang disebut Composer HAL untuk IPC yang diikat antara HWC dan SurfaceFlinger. Komposer HAL menggantikan antarmuka hwcomposer2.h lama. Jika vendor menyediakan implementasi Composer HAL dari HWC, Composer HAL langsung menerima panggilan HIDL dari SurfaceFlinger. Jika vendor menyediakan implementasi HWC yang lama, Komposer HAL memuat pointer fungsi dari hwcomposer2.h , meneruskan panggilan HIDL ke panggilan penunjuk fungsi.

HWC menyediakan fungsi untuk menentukan properti tampilan tertentu; untuk beralih di antara konfigurasi tampilan yang berbeda (seperti resolusi 4k atau 1080p) dan mode warna (seperti warna asli atau sRGB asli); dan untuk menghidupkan, mematikan, atau ke mode daya rendah jika didukung.

penunjuk fungsi

Jika vendor mengimplementasikan Composer HAL secara langsung, SurfaceFlinger memanggil fungsinya melalui HIDL IPC. Misalnya, untuk membuat layer, SurfaceFlinger memanggil createLayer() pada Composer HAL.

Jika vendor mengimplementasikan antarmuka hwcomposer2.h , HAL Composer memanggil ke pointer fungsi hwcomposer2.h . Dalam komentar hwcomposer2.h , fungsi antarmuka HWC dirujuk dengan nama lowerCamelCase yang tidak ada di antarmuka sebagai bidang bernama. Hampir setiap fungsi dimuat dengan meminta penunjuk fungsi menggunakan getFunction disediakan oleh hwc2_device_t . Misalnya, fungsi createLayer adalah penunjuk fungsi bertipe HWC2_PFN_CREATE_LAYER , yang dikembalikan ketika nilai enumerasi HWC2_FUNCTION_CREATE_LAYER diteruskan ke getFunction .

Untuk dokumentasi terperinci tentang fungsi HAL Komposer dan fungsi passthrough fungsi HWC, lihat composer . Untuk dokumentasi rinci tentang pointer fungsi HWC, lihat hwcomposer2.h .

Pegangan lapisan dan tampilan

Lapisan dan tampilan dimanipulasi oleh pegangan yang dihasilkan oleh HWC. Pegangannya buram untuk SurfaceFlinger.

Saat SurfaceFlinger membuat layer baru, ia memanggil createLayer , yang mengembalikan tipe Layer untuk implementasi langsung atau hwc2_layer_t untuk implementasi passthrough. Saat SurfaceFlinger memodifikasi properti lapisan itu, SurfaceFlinger meneruskan nilai hwc2_layer_t ke fungsi modifikasi yang sesuai bersama dengan informasi lain yang diperlukan untuk membuat modifikasi. Tipe hwc2_layer_t cukup besar untuk menampung pointer atau indeks.

Tampilan fisik dibuat dengan hotplugged. Saat tampilan fisik dicolokkan, HWC membuat pegangan dan meneruskan pegangan ke SurfaceFlinger melalui panggilan balik hotplug. Tampilan virtual dibuat oleh SurfaceFlinger yang memanggil createVirtualDisplay() untuk meminta tampilan. Jika HWC mendukung komposisi tampilan virtual, ia mengembalikan pegangan. Kemudian, SurfaceFlinger mendelegasikan komposisi tampilan ke HWC. Jika HWC tidak mendukung komposisi tampilan virtual, SurfaceFlinger membuat pegangan dan menggabungkan tampilan.

Tampilkan operasi komposisi

Sekali per VSYNC, SurfaceFlinger bangun jika memiliki konten baru untuk komposit. Konten baru ini dapat berupa buffer gambar baru dari aplikasi atau perubahan properti dari satu atau beberapa lapisan. Saat SurfaceFlinger membangunkannya:

  1. Menangani transaksi, jika ada.
  2. Mengunci buffer grafis baru, jika ada.
  3. Melakukan komposisi baru, jika langkah 1 atau 2 mengakibatkan perubahan pada konten tampilan.

Untuk melakukan komposisi baru, SurfaceFlinger membuat dan menghancurkan lapisan atau memodifikasi status lapisan, sebagaimana berlaku. Itu juga memperbarui lapisan dengan kontennya saat ini, menggunakan panggilan seperti setLayerBuffer atau setLayerColor . Setelah semua lapisan diperbarui, SurfaceFlinger memanggil validateDisplay , yang memberi tahu HWC untuk memeriksa status lapisan dan menentukan bagaimana komposisi akan dilanjutkan. Secara default, SurfaceFlinger mencoba mengonfigurasi setiap lapisan sedemikian rupa sehingga lapisan tersebut dikomposisikan oleh HWC; meskipun dalam beberapa keadaan, SurfaceFlinger menggabungkan lapisan melalui fallback GPU.

Setelah panggilan getChangedCompositionTypes validateDisplay melihat apakah HWC ingin salah satu jenis komposisi lapisan diubah sebelum melakukan komposisi. Untuk menerima perubahan, SurfaceFlinger memanggil acceptDisplayChanges .

Jika ada lapisan yang ditandai untuk komposisi SurfaceFlinger, SurfaceFlinger menggabungkannya ke buffer target. SurfaceFlinger kemudian memanggil setClientTarget untuk memberikan buffer ke tampilan sehingga buffer dapat ditampilkan di layar atau selanjutnya digabungkan dengan lapisan yang belum ditandai untuk komposisi SurfaceFlinger. Jika tidak ada lapisan yang ditandai untuk komposisi SurfaceFlinger, SurfaceFlinger akan melewati langkah komposisi.

Terakhir, SurfaceFlinger memanggil presentDisplay untuk memberi tahu HWC agar menyelesaikan proses komposisi dan menampilkan hasil akhir.

Beberapa tampilan

Android 10 mendukung beberapa tampilan fisik. Saat merancang implementasi HWC yang dimaksudkan untuk digunakan pada Android 7.0 dan lebih tinggi, ada beberapa batasan yang tidak ada dalam definisi HWC:

  • Diasumsikan bahwa hanya ada satu layar internal . Tampilan internal adalah tampilan yang dilaporkan hotplug awal saat boot. Setelah tampilan internal dicolokkan, tidak dapat diputuskan.
  • Selain layar internal, sejumlah layar eksternal dapat dicolokkan selama pengoperasian normal perangkat. Kerangka kerja mengasumsikan bahwa semua hotplug setelah tampilan internal pertama adalah tampilan eksternal, jadi jika ada lagi tampilan internal yang ditambahkan, mereka salah dikategorikan sebagai Display.TYPE_HDMI bukan Display.TYPE_BUILT_IN .

Sementara operasi SurfaceFlinger yang dijelaskan di atas dilakukan per tampilan, operasi tersebut dilakukan secara berurutan untuk semua tampilan aktif, bahkan jika konten hanya satu tampilan diperbarui.

Misalnya, jika tampilan eksternal diperbarui, urutannya adalah:

// In Android 9 and lower:

// Update state for internal display
// Update state for external display
validateDisplay(<internal display>)
validateDisplay(<external display>)
presentDisplay(<internal display>)
presentDisplay(<external display>)

// In Android 10 and higher:

// Update state for internal display
// Update state for external display
validateInternal(<internal display>)
presentInternal(<internal display>)
validateExternal(<external display>)
presentExternal(<external display>)

Komposisi tampilan virtual

Komposisi tampilan virtual mirip dengan komposisi tampilan eksternal. Perbedaan antara komposisi tampilan virtual dan komposisi tampilan fisik adalah tampilan virtual mengirimkan output ke buffer Gralloc, bukan ke layar. Hardware Composer (HWC) menulis output ke buffer, menyediakan pagar penyelesaian, dan mengirimkan buffer ke konsumen (seperti encoder video, GPU, CPU, dan sebagainya). Tampilan virtual dapat menggunakan 2D/blitter atau overlay jika saluran tampilan menulis ke memori.

Mode

Setiap frame berada dalam salah satu dari tiga mode setelah SurfaceFlinger memanggil metode HWC validateDisplay() :

  • GLES — GPU menggabungkan semua lapisan, menulis langsung ke buffer output. HWC tidak terlibat dalam komposisi.
  • CAMPURAN — GPU menggabungkan beberapa lapisan ke framebuffer dan HWC menggabungkan framebuffer dan lapisan yang tersisa, menulis langsung ke buffer output.
  • HWC — HWC menggabungkan semua lapisan dan menulis langsung ke buffer keluaran.

Format output

Format output buffer tampilan virtual bergantung pada modenya:

  • Mode GLES — Driver EGL menyetel format buffer output dalam dequeueBuffer() , biasanya RGBA_8888 . Konsumen harus dapat menerima format output yang ditetapkan driver atau buffer tidak dapat dibaca.
  • Mode CAMPURAN dan HWC — Jika konsumen membutuhkan akses CPU, konsumen mengatur formatnya. Jika tidak, formatnya adalah IMPLEMENTATION_DEFINED , dan Gralloc menetapkan format terbaik berdasarkan flag penggunaan. Misalnya, Gralloc menetapkan format YCbCr jika konsumen adalah pembuat enkode video dan HWC dapat menulis format secara efisien.

Pagar sinkronisasi

Pagar sinkronisasi (sinkronisasi) adalah aspek penting dari sistem grafis Android. Pagar memungkinkan pekerjaan CPU berjalan secara independen dari pekerjaan GPU bersamaan, memblokir hanya jika ada ketergantungan yang sebenarnya.

Misalnya, saat aplikasi mengirimkan buffer yang sedang diproduksi di GPU, aplikasi tersebut juga mengirimkan objek pagar sinkronisasi. Pagar ini memberi sinyal saat GPU selesai menulis ke dalam buffer.

HWC mengharuskan GPU menyelesaikan penulisan buffer sebelum buffer ditampilkan. Pagar sinkronisasi dilewatkan melalui pipa grafis dengan buffer dan sinyal saat buffer ditulis. Sebelum buffer ditampilkan, HWC memeriksa apakah pagar sinkronisasi telah memberi sinyal, dan jika sudah, ini menampilkan buffer.

Untuk informasi lebih lanjut tentang pagar sinkronisasi, lihat Integrasi Komposer Perangkat Keras .