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

Menerapkan Hardware Composer 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 hamparan dan blitter 2D, ke permukaan komposit dan berkomunikasi dengan perangkat keras komposisi jendela khusus ke jendela komposit. Gunakan HWC ke jendela komposit alih-alih memiliki komposit SurfaceFlinger dengan GPU. Sebagian besar GPU tidak dioptimalkan untuk komposisi, dan saat GPU menyusun lapisan dari SurfaceFlinger, aplikasi tidak dapat menggunakan GPU untuk renderingnya sendiri.

Implementasi HWC harus mendukung:

  • Setidaknya empat lapisan:
    • Status bar
    • Bilah sistem
    • Aplikasi
    • Wallpaper / latar belakang
  • Lapisan yang lebih besar dari tampilan (misalnya, wallpaper)
  • Pencampuran alfa per piksel dan pencampuran alfa per bidang yang telah diterapkan sebelumnya secara bersamaan
  • Jalur perangkat keras untuk pemutaran video yang dilindungi
  • Urutan pengemasan RGBA, format YUV, dan properti tiling, swizzling, dan stride

Untuk mengimplementasikan HWC:

  1. Menerapkan HWC nonoperasional dan mengirim semua karya 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 memindahkan komposisi ke HWC.
    • Mempersiapkan kasus penggunaan umum seperti:
      • Layar beranda, yang mencakup bilah status, bilah sistem, jendela aplikasi, dan wallpaper animasi
      • 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 callback ke SurfaceFlinger untuk memberi tahu saat peristiwa VSYNC terjadi.

Antarmuka HIDL

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

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

Penunjuk fungsi

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

Jika vendor mengimplementasikan antarmuka hwcomposer2.h , Composer HAL memanggil ke pointer fungsi hwcomposer2.h . Dalam komentar hwcomposer2.h , fungsi antarmuka HWC dirujuk oleh 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 berjenis HWC2_PFN_CREATE_LAYER , yang dikembalikan saat nilai yang disebutkan HWC2_FUNCTION_CREATE_LAYER diteruskan ke getFunction .

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

Lapisan dan gagang layar

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

Saat SurfaceFlinger membuat lapisan baru, ia memanggil createLayer , yang mengembalikan jenis Layer untuk implementasi langsung atau hwc2_layer_t untuk implementasi passthrough. Ketika SurfaceFlinger mengubah properti lapisan tersebut, SurfaceFlinger meneruskan nilai hwc2_layer_t ke dalam fungsi modifikasi yang sesuai bersama dengan informasi lain yang diperlukan untuk membuat modifikasi. Jenis hwc2_layer_t cukup besar untuk menampung penunjuk atau indeks.

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

Operasi komposisi tampilan

Sekali per VSYNC, SurfaceFlinger aktif jika memiliki konten baru untuk digabungkan. Konten baru ini dapat berupa penyangga gambar baru dari aplikasi atau perubahan pada properti satu atau beberapa lapisan. Saat SurfaceFlinger membangunkannya:

  1. Menangani transaksi, jika ada.
  2. Latch 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 mengubah 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 diproses. Secara default, SurfaceFlinger mencoba mengkonfigurasi setiap lapisan sehingga lapisan tersebut disusun oleh HWC; meskipun dalam beberapa keadaan, SurfaceFlinger menggabungkan lapisan melalui penggantian GPU.

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

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

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

Banyak tampilan

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

  • Diasumsikan bahwa hanya ada satu tampilan internal . Tampilan internal adalah tampilan yang dilaporkan hotplug awal selama boot. Setelah layar internal dicolokkan, itu tidak dapat diputuskan.
  • Selain tampilan internal, sejumlah tampilan eksternal dapat disambungkan dengan hotplug selama pengoperasian normal perangkat. Kerangka kerja mengasumsikan bahwa semua hotplug setelah tampilan internal pertama adalah tampilan eksternal, jadi jika ada tampilan internal lainnya 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 dari satu tampilan saja yang diperbarui.

Misalnya, jika layar 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 bahwa tampilan virtual mengirimkan output ke buffer Gralloc alih-alih 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 pipeline tampilan menulis ke memori.

Mode

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

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

Format output

Format keluaran buffer tampilan virtual bergantung pada modenya:

  • Mode GLES - Driver EGL menetapkan format buffer keluaran dalam dequeueBuffer() , biasanya RGBA_8888 . Konsumen harus dapat menerima format output yang ditetapkan driver atau buffer tidak dapat dibaca.
  • Mode MIXED dan HWC - Jika konsumen membutuhkan akses CPU, konsumen mengatur formatnya. Jika tidak, formatnya adalah IMPLEMENTATION_DEFINED , dan Gralloc menetapkan format terbaik berdasarkan tanda 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. Fences memungkinkan CPU bekerja secara independen dari kerja GPU serentak, hanya memblokir jika ada dependensi yang sebenarnya.

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

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

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