Menerapkan OpenGL ES dan EGL

OpenGL adalah API grafis lintas platform yang menentukan antarmuka perangkat lunak standar untuk perangkat keras pemrosesan grafis 3D. OpenGL ES adalah bagian dari spesifikasi OpenGL untuk perangkat tertanam.

Agar kompatibel dengan Android, perangkat perlu menyediakan driver untuk EGL, OpenGL ES 1.x, dan OpenGL ES 2.0. Dukungan untuk OpenGL ES 3.x bersifat opsional. Pertimbangan utama meliputi:

  • Memastikan driver GL kuat dan sesuai dengan standar OpenGL ES.
  • Mengizinkan konteks GL dalam jumlah tidak terbatas. Karena Android mengizinkan aplikasi di latar belakang dan mencoba menjaga konteks GL tetap hidup, Anda tidak boleh membatasi jumlah konteks di driver Anda.
  • Perhatikan jumlah memori yang dialokasikan untuk setiap konteks, karena biasanya terdapat 20–30 konteks GL aktif sekaligus.
  • Mendukung format gambar YV12 dan format gambar YUV lainnya yang berasal dari komponen lain dalam sistem, seperti codec media atau kamera.
  • Mendukung ekstensi wajib EGL_KHR_wait_sync , GL_OES_texture_external , EGL_ANDROID_image_native_buffer , dan EGL_ANDROID_recordable . Selain itu, Hardware Composer v1.1 dan lebih tinggi memerlukan ekstensi EGL_ANDROID_framebuffer_target .

Sangat disarankan untuk juga mendukung EGL_ANDROID_blob_cache , EGL_KHR_fence_sync , dan EGL_ANDROID_native_fence_sync .

Android 10 mengimplementasikan antarmuka EGL 1.5 . Untuk informasi tentang fitur baru di EGL 1.5, lihat Spesifikasi Khronos Rilis 1.5 .

Pemuatan pengemudi

Android mengharapkan GPU yang tersedia untuk sistem diketahui saat image sistem dibuat. Jalur pilihan untuk driver OpenGL ES 32-bit dan 64-bit masing-masing adalah /vendor/lib/egl dan /vendor/lib64/egl . Pemuat menggunakan dua properti sistem, ro.hardware.egl dan ro.board.platform , atau nama persisnya untuk menemukan dan memuat driver sistem. Driver OpenGL ES harus dikirimkan dalam satu biner atau dibagi menjadi tiga biner. Jika driver OpenGL ES dikirimkan dalam satu biner, gunakan salah satu nama berikut:

libGLES_${ro.hardware.egl}.so
libGLES_${ro.board.platform}.so
libGLES.so

Jika driver OpenGL ES dikirimkan ke dalam tiga biner, gunakan salah satu kumpulan nama berikut:

libEGL_${ro.hardware.egl}.so
libGLESv1_CM_${ro.hardware.egl}.so
libGLESv2_${ro.hardware.egl}.so

libEGL_${ro.board.platform}.so
libGLESv1_CM_${ro.board.platform}.so
libGLESv2_${ro.board.platform}.so

libEGL.so
libGLESv1_CM.so
libGLESv2.so

Lapisan OpenGL ES

Android 10 memperkenalkan sistem pelapisan untuk GLES 2.0+. Lapisan GLES adalah objek bersama yang tersedia dari dalam aplikasi atau disediakan oleh alat. Lapisan GLES memungkinkan aplikasi yang dapat di-debug untuk menemukan dan memuat lapisan menggunakan mekanisme pengaturan yang sama seperti Vulkan .

GLES LayerLoader, sebuah komponen dalam pemuat EGL, mengidentifikasi lapisan GLES. Untuk setiap lapisan yang ditemukan GLES LayerLoader, GLES LayerLoader memanggil AndroidGLESLayer_Initialize , menelusuri daftar fungsi libEGL, dan memanggil AndroidGLESLayer_GetProcAddress untuk semua fungsi yang diketahui. Jika lapisan mencegat suatu fungsi, lapisan tersebut melacak alamat fungsi tersebut. Jika lapisan tidak mencegat suatu fungsi, AndroidGLESLayer_GetProcAddress akan mengembalikan alamat fungsi yang sama dengan yang diteruskan. LayerLoader kemudian memperbarui daftar kait fungsi untuk menunjuk ke titik masuk lapisan.

Aktifkan lapisan

Anda dapat mengaktifkan lapisan GLES per aplikasi atau secara global. Pengaturan per aplikasi tetap ada saat reboot, sementara properti global dihapus saat reboot.

Untuk mengaktifkan lapisan per aplikasi :

# Enable layers
adb shell settings put global enable_gpu_debug_layers 1

# Specify target app
adb shell settings put global gpu_debug_app package_name

# Specify layer list (from top to bottom)
adb shell settings put global gpu_debug_layers_gles layer1:layer2:...:layerN

# Specify packages to search for layers
adb shell settings put global gpu_debug_layer_app package1:package2:...:packageN

Untuk menonaktifkan lapisan per aplikasi :

adb shell settings delete global enable_gpu_debug_layers
adb shell settings delete global gpu_debug_app
adb shell settings delete global gpu_debug_layer_app

Untuk mengaktifkan lapisan secara global :

# Attempts to load layers for all applications, including native executables
adb shell setprop debug.gles.layers layer1:layer2:...:layerN

Lapisan uji

Lapisan GLES didukung oleh Android CTS dan harus lulus pengujian CTS untuk perangkat yang kompatibel . Untuk mengidentifikasi apakah lapisan berfungsi pada perangkat, jalankan $ atest CtsGpuToolsHostTestCases .