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 hal 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 serangkaian tanda penggunaan.

Produsen dan konsumen BufferQueue

Konsumen membuat dan memiliki struktur data BufferQueue dan dapat berada dalam proses yang berbeda dari produsennya. Ketika produsen membutuhkan buffer, ia akan meminta buffer gratis dari BufferQueue dengan memanggil dequeueBuffer() , yang menentukan lebar, tinggi, format piksel, dan tanda 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() . Framework sinkronisasi mengontrol cara buffer bergerak melalui pipeline grafis Android.

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

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

Lacak BufferQueue dengan Systrace

Untuk memahami bagaimana buffer grafis berpindah, gunakan Systrace , alat yang mencatat aktivitas perangkat dalam jangka waktu singkat. Kode grafis tingkat sistem diinstrumentasikan dengan baik, begitu pula sebagian besar kode framework aplikasi yang relevan.

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

Nilai bertambah saat aplikasi aktif, yang memicu rendering frame oleh decoder MediaCodec. Nilainya 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 aktif hanya ketika 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 Putar video Grafika (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

Pengalokasi Gralloc HAL hardware/libhardware/include/hardware/gralloc.h melakukan alokasi buffer melalui tanda penggunaan. Tanda 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 encoder 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 akan 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 encoder video mungkin memerlukan piksel YUV, sehingga menambahkan akses perangkat lunak dan menentukan RGBA_8888 akan gagal.

Pegangan yang dikembalikan oleh Gralloc dapat diteruskan antar proses melalui Binder.

Buffer yang dilindungi

Bendera penggunaan Gralloc 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 overlay Hardware Composer (yaitu, video yang dilindungi akan hilang dari tampilan jika Hardware Composer beralih ke komposisi OpenGL ES).

Untuk detail tentang konten yang dilindungi, lihat DRM .