HAL Komposer Hardware (HWC) menggabungkan lapisan yang diterima dari SurfaceFlinger, sehingga mengurangi jumlah komposisi OpenGL ES (GLES) dan performa GPU.
HWC mengabstraksi objek, seperti overlay dan blitter 2D, ke permukaan komposit dan berkomunikasi dengan hardware komposisi jendela khusus untuk mengomposisikan jendela. Gunakan HWC untuk menggabungkan jendela, bukan menggabungkan 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 overlay:
- Status bar
- Kolom sistem
- Aplikasi
- Wallpaper/latar belakang
- Lapisan yang lebih besar dari layar (misalnya, wallpaper)
- Pencampuran alfa per piksel yang telah dikalikan sebelumnya dan pencampuran alfa per bidang secara bersamaan
- Jalur hardware untuk pemutaran video yang dilindungi
- Urutan pengemasan RGBA, format YUV, dan properti penggabungan, pengacakan, dan langkah
Untuk menerapkan HWC:
- Terapkan HWC non-operasional dan kirim semua pekerjaan komposisi ke GLES.
- Menerapkan algoritma untuk mendelegasikan komposisi ke HWC secara bertahap. Misalnya, hanya delegasikan tiga atau empat platform pertama ke hardware overlay HWC.
- Mengoptimalkan HWC. Hal ini dapat mencakup:
- Memilih platform yang memaksimalkan beban yang dikeluarkan dari GPU dan mengirimkannya ke HWC.
- Mendeteksi apakah layar sedang diperbarui. Jika tidak, delegasikan komposisi ke GLES, bukan HWC, untuk menghemat daya. Saat layar diperbarui lagi, teruskan pelepasan komposisi ke HWC.
- Mempersiapkan kasus penggunaan umum seperti:
- Layar utama, yang mencakup status bar, kolom 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
- Multiaplikasi layar terpisah
Primitif HWC
HWC menyediakan dua primitif, lapisan dan tampilan, untuk merepresentasikan pekerjaan komposisi dan interaksinya dengan hardware layar. HWC juga menyediakan kontrol atas VSync dan callback ke SurfaceFlinger untuk memberi tahu saat peristiwa VSync terjadi.
Antarmuka HIDL
Android 8.0 dan yang lebih tinggi menggunakan antarmuka HIDL yang disebut Composer HAL untuk IPC binder antara HWC dan SurfaceFlinger. HAL Composer menggantikan antarmuka hwcomposer2.h
lama. Jika vendor menyediakan implementasi HWC Composer HAL, Composer HAL akan langsung menerima panggilan HIDL dari SurfaceFlinger. Jika vendor menyediakan penerapan HWC lama, Composer
HAL memuat pointer fungsi dari hwcomposer2.h
,
meneruskan panggilan HIDL ke panggilan pointer fungsi.
HWC menyediakan fungsi untuk menentukan properti layar tertentu; untuk beralih antara konfigurasi layar yang berbeda (seperti resolusi 4k atau 1080p) dan mode warna (seperti warna asli atau sRGB sebenarnya); dan untuk mengaktifkan, menonaktifkan, atau mengalihkan layar ke mode daya rendah jika didukung.
Pointer fungsi
Jika vendor mengimplementasikan Composer HAL secara langsung, SurfaceFlinger akan memanggil fungsinya
melalui HIDL IPC. Misalnya, untuk membuat lapisan, SurfaceFlinger memanggil
createLayer()
di Composer HAL.
Jika vendor menerapkan antarmuka hwcomposer2.h
, Composer HAL
akan memanggil pointer fungsi hwcomposer2.h
. Dalam komentar hwcomposer2.h
, fungsi antarmuka HWC dirujuk oleh nama lowerCamelCase yang tidak ada di antarmuka sebagai kolom bernama. Hampir setiap fungsi dimuat dengan meminta
pointer fungsi menggunakan getFunction
yang disediakan oleh
hwc2_device_t
. Misalnya, fungsi createLayer
adalah penunjuk fungsi jenis HWC2_PFN_CREATE_LAYER
, yang
ditampilkan saat nilai yang di-enum HWC2_FUNCTION_CREATE_LAYER
diteruskan ke getFunction
.
Untuk dokumentasi mendetail tentang fungsi HAL Composer dan fungsi teruskan fungsi HWC, lihat composer
. Untuk dokumentasi mendetail tentang
pointer fungsi HWC, lihat
hwcomposer2.h
.
Gagang lapisan dan tampilan
Lapisan dan tampilan dimanipulasi oleh handle yang dibuat oleh HWC. Penanganan ini tidak transparan bagi SurfaceFlinger.
Saat membuat lapisan baru, SurfaceFlinger akan memanggil createLayer
,
yang menampilkan jenis Layer
untuk implementasi
langsung atau hwc2_layer_t
untuk implementasi passthrough. Saat
SurfaceFlinger mengubah properti lapisan tersebut, SurfaceFlinger meneruskan
nilai hwc2_layer_t
ke fungsi modifikasi yang sesuai
bersama dengan informasi lain yang diperlukan untuk melakukan modifikasi. Jenis
hwc2_layer_t
cukup besar untuk menyimpan pointer atau
indeks.
Tampilan fisik dibuat dengan hotplug. Saat layar fisik di-hotplug, HWC akan membuat handle dan meneruskannya ke SurfaceFlinger melalui callback hotplug. Tampilan virtual dibuat oleh SurfaceFlinger
dengan memanggil createVirtualDisplay()
untuk meminta tampilan. Jika HWC mendukung komposisi tampilan virtual, HWC akan menampilkan handle. Kemudian, SurfaceFlinger
mendelegasikan komposisi layar ke HWC. Jika HWC tidak mendukung komposisi layar virtual, SurfaceFlinger akan membuat handle dan menggabungkan layar.
Operasi komposisi tampilan
Sekali per VSync, SurfaceFlinger akan aktif jika memiliki konten baru untuk menggabungkan. Konten baru ini dapat berupa buffer gambar baru dari aplikasi atau perubahan pada properti satu atau beberapa lapisan. Saat SurfaceFlinger mengaktifkannya:
- Menangani transaksi, jika ada.
- Mengaitkan buffering grafis baru, jika ada.
- Melakukan komposisi baru, jika langkah 1 atau 2 menghasilkan perubahan pada konten tampilan.
Untuk melakukan komposisi baru, SurfaceFlinger membuat dan menghancurkan lapisan atau mengubah status lapisan, sebagaimana berlaku. API ini juga memperbarui
lapisan dengan konten 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 cara komposisi akan dilanjutkan. Secara default, SurfaceFlinger mencoba mengonfigurasi setiap lapisan
sehingga lapisan tersebut dikomposisikan oleh HWC; meskipun dalam beberapa
keadaan, SurfaceFlinger mengomposisikan lapisan melalui penggantian GPU.
Setelah panggilan ke validateDisplay
, SurfaceFlinger memanggil
getChangedCompositionTypes
untuk melihat apakah HWC
ingin mengubah jenis komposisi lapisan sebelum melakukan
komposisi. Untuk menerima perubahan, SurfaceFlinger memanggil
acceptDisplayChanges
.
Jika ada lapisan yang ditandai untuk komposisi SurfaceFlinger, SurfaceFlinger
akan menggabungkannya ke dalam buffer target. Kemudian, SurfaceFlinger memanggil
setClientTarget
untuk memberikan buffer ke layar sehingga buffer
dapat ditampilkan di layar atau dikomposisikan lebih lanjut 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 mendesain penerapan HWC yang ditujukan untuk digunakan di Android 7.0 dan yang lebih tinggi, ada beberapa batasan yang tidak ada dalam definisi HWC:
- Diasumsikan bahwa ada tepat satu layar internal. Tampilan internal adalah tampilan yang dilaporkan hotplug awal selama booting. Setelah layar internal dihubungkan secara hotplug, layar tersebut tidak dapat dilepas.
- Selain layar internal, sejumlah layar eksternal dapat di-hotplug
selama pengoperasian normal perangkat. Framework mengasumsikan bahwa semua
hotplug setelah tampilan internal pertama adalah tampilan eksternal, jadi jika ada lebih banyak
tampilan internal yang ditambahkan, tampilan tersebut akan dikategorikan secara salah sebagai
Display.TYPE_HDMI
, bukanDisplay.TYPE_BUILT_IN
.
Meskipun operasi SurfaceFlinger yang dijelaskan di atas dilakukan per layar, operasi tersebut dilakukan secara berurutan untuk semua layar aktif, meskipun konten hanya satu layar 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 tampilan virtual mengirim output ke buffer Gralloc, bukan ke layar. Hardware Composer (HWC) menulis output ke buffer, menyediakan pagar penyelesaian, dan mengirim 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 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 output.
Format output
Format output buffer tampilan virtual bergantung pada modenya:
- Mode GLES — Driver EGL menetapkan format buffer output di
dequeueBuffer()
, biasanyaRGBA_8888
. Konsumen harus dapat menerima format output yang ditetapkan driver atau buffer tidak dapat dibaca. - Mode MIXED dan HWC — Jika konsumen memerlukan akses CPU, konsumen menetapkan formatnya. Jika tidak, formatnya adalah
IMPLEMENTATION_DEFINED
, dan Gralloc menetapkan format terbaik berdasarkan flag penggunaan. Misalnya, Gralloc menetapkan format YCbCr jika konsumen adalah encoder video dan HWC dapat menulis format secara efisien.
Penghalang sinkronisasi
Penghalang sinkronisasi (sync) adalah aspek penting dari sistem grafis Android. Penghalang memungkinkan pekerjaan CPU berlanjut secara independen dari pekerjaan GPU serentak, hanya memblokir saat ada dependensi yang sebenarnya.
Misalnya, saat mengirimkan buffer yang sedang diproduksi di GPU, aplikasi juga mengirimkan objek pagar sinkronisasi. Penghalang ini memberi sinyal saat GPU telah selesai menulis ke buffer.
HWC mewajibkan GPU menyelesaikan penulisan buffer sebelum buffer ditampilkan. Penghalang sinkronisasi diteruskan melalui pipeline grafis dengan buffer dan sinyal saat buffer ditulis. Sebelum buffer ditampilkan, HWC memeriksa apakah pagar sinkronisasi telah memberi sinyal, dan jika ya, HWC akan menampilkan buffer.
Untuk mengetahui informasi selengkapnya tentang pagar sinkronisasi, lihat Integrasi Hardware Composer.