BufferQueue dan Gralloc

Kelas BufferQueue menghubungkan komponen yang menghasilkan buffer data grafis ( produsen ) ke komponen yang menerima data untuk ditampilkan atau diproses lebih lanjut ( konsumen ). Hampir semua yang memindahkan buffer data grafis melalui sistem bergantung pada BufferQueue.

Pengalokasi memori Gralloc melakukan alokasi buffer dan diimplementasikan melalui dua antarmuka HIDL khusus vendor (lihat hardware/interfaces/graphics/allocator/ dan hardware/interfaces/graphics/mapper/ ). Fungsi allocate() mengambil argumen yang diharapkan (lebar, tinggi, format piksel) serta satu set tanda penggunaan.

Produsen dan konsumen BufferQueue

Konsumen membuat dan memiliki struktur data BufferQueue dan dapat eksis dalam proses yang berbeda dari produsen mereka. Saat produser membutuhkan buffer, ia meminta buffer gratis dari BufferQueue dengan memanggil dequeueBuffer() , yang menentukan lebar, tinggi, format piksel, dan flag penggunaan buffer. Produser kemudian mengisi buffer dan mengembalikan buffer ke antrian dengan memanggil queueBuffer() . Selanjutnya, konsumen memperoleh buffer dengan acquireBuffer() dan memanfaatkan konten buffer. Ketika konsumen selesai, ia mengembalikan buffer ke antrian dengan memanggil releaseBuffer() . Kerangka kerja sinkronisasi mengontrol bagaimana buffer bergerak melalui pipa grafis Android.

Beberapa karakteristik BufferQueue, seperti jumlah maksimum buffer yang dapat ditampung, ditentukan bersama oleh produsen dan konsumen. Namun, BufferQueue mengalokasikan buffer sesuai kebutuhan. Buffer dipertahankan kecuali jika karakteristiknya berubah; misalnya, jika produsen meminta buffer dengan ukuran berbeda, buffer lama dibebaskan dan buffer baru dialokasikan sesuai permintaan.

Konten buffer tidak pernah disalin oleh BufferQueue, karena memindahkan data sebanyak itu tidak efisien. Sebaliknya, buffer selalu melewati sebuah pegangan.

Melacak BufferQueue dengan Systrace

Untuk memahami bagaimana buffer grafis bergerak, gunakan Systrace , alat yang merekam aktivitas perangkat dalam waktu singkat. Kode grafis tingkat sistem diinstrumentasi dengan baik, seperti juga banyak kode kerangka kerja aplikasi yang relevan.

Untuk menggunakan Systrace, aktifkan tag gfx , view , dan sched . Objek BufferQueue ditampilkan dalam jejak. Sebagai contoh, jika Anda mengambil jejak saat video Putar Grafika (SurfaceView) sedang berjalan, baris berlabel SurfaceView memberi tahu Anda berapa banyak buffer yang diantrekan pada waktu tertentu.

Nilai bertambah saat aplikasi aktif, yang memicu rendering bingkai oleh dekoder MediaCodec. Nilai berkurang saat SurfaceFlinger bekerja dan menggunakan buffer. Saat menampilkan video pada 30 fps, nilai antrean bervariasi dari 0 hingga 1 karena tampilan ~60 fps dapat mengikuti sumbernya. SurfaceFlinger hanya aktif saat ada pekerjaan yang harus diselesaikan, bukan 60 kali per detik. Sistem mencoba menghindari pekerjaan dan menonaktifkan VSYNC jika tidak ada yang memperbarui layar.

Jika Anda beralih ke Grafika's Play video (TextureView) dan mengambil jejak baru, Anda akan melihat baris berlabel com.android.grafika / com.android.grafika.PlayMovieActivity . Ini adalah lapisan UI utama, yang merupakan BufferQueue lainnya. Karena TextureView dirender ke dalam lapisan UI dan bukan lapisan terpisah, semua pembaruan berbasis video ditampilkan di sini.

Gralloc

Gralloc allocator HAL hardware/libhardware/include/hardware/gralloc.h melakukan alokasi buffer melalui flag penggunaan. Bendera penggunaan mencakup atribut seperti:

  • Seberapa sering memori akan diakses dari perangkat lunak (CPU)
  • Seberapa sering memori akan diakses dari perangkat keras (GPU)
  • Apakah memori akan digunakan sebagai tekstur OpenGL ES (GLES)
  • Apakah memori akan digunakan oleh pembuat enkode video

Misalnya, jika format buffer produser menentukan RGBA_8888 piksel, dan produser menunjukkan bahwa buffer akan diakses dari perangkat lunak (artinya aplikasi akan menyentuh piksel pada CPU), Gralloc membuat buffer dengan 4 byte per piksel dalam urutan RGBA. Jika sebaliknya, produsen menentukan buffernya hanya akan diakses dari perangkat keras dan sebagai tekstur GLES, Gralloc dapat melakukan apa pun yang diinginkan driver GLES, seperti pemesanan BGRA, tata letak swizzled nonlinier, dan format warna alternatif. Mengizinkan perangkat keras menggunakan format pilihannya dapat meningkatkan kinerja.

Beberapa nilai tidak dapat digabungkan pada platform tertentu. Misalnya, tanda pembuat enkode video mungkin memerlukan piksel YUV, jadi penambahan akses perangkat lunak dan penetapan RGBA_8888 gagal.

Pegangan yang dikembalikan oleh Gralloc dapat dilewatkan di antara proses melalui Binder.

Buffer yang dilindungi

Bendera penggunaan GRALLOC_USAGE_PROTECTED memungkinkan buffer grafis ditampilkan hanya melalui jalur yang dilindungi perangkat keras. Bidang overlay ini adalah satu-satunya cara untuk menampilkan konten DRM (buffer yang dilindungi DRM tidak dapat diakses oleh SurfaceFlinger atau driver OpenGL ES).

Video yang dilindungi DRM hanya dapat ditampilkan pada bidang overlay. Pemutar video yang mendukung konten yang dilindungi harus diimplementasikan dengan SurfaceView. Perangkat lunak yang berjalan pada perangkat keras yang tidak dilindungi tidak dapat membaca atau menulis buffer; jalur yang dilindungi perangkat keras harus muncul di hamparan Komposer Perangkat Keras (yaitu, video yang dilindungi menghilang dari tampilan jika Komposer Perangkat Keras beralih ke komposisi OpenGL ES).

Untuk detail tentang konten yang dilindungi, lihat DRM .