OpenGL ES ve EGL'yi uygulama

OpenGL, 3D grafik işleme donanımı için standart bir yazılım arayüzü belirten platformlar arası bir grafik API'sidir. OpenGL ES, yerleşik cihazlar için OpenGL spesifikasyonunun bir alt kümesidir.

Cihazların Android ile uyumlu olması için EGL, OpenGL ES 1.x ve OpenGL ES 2.0 sürücüleri sağlaması gerekir. OpenGL ES 3.x desteği isteğe bağlıdır. Göz önünde bulundurulması gereken önemli noktalar:

  • GL sürücüsünün sağlam olduğundan ve OpenGL ES standartlarına uygun olduğundan emin olun.
  • Sınırsız sayıda GL bağlamına izin verilir. Android, uygulamaların arka planda çalışmasına izin verdiğinden ve GL bağlamlarını canlı tutmaya çalıştığından sürücünüzdeki bağlam sayısını sınırlamamalısınız.
  • Aynı anda 20-30 etkin GL bağlamı olması yaygın olduğundan, her bağlama ayrılan bellek miktarına dikkat edin.
  • YV12 görüntü biçiminin ve sistemdeki diğer bileşenlerden (ör. medya codec'leri veya kamera) gelen diğer YUV görüntü biçimlerinin desteklenmesi.
  • Zorunlu uzantılar EGL_KHR_wait_sync, GL_OES_texture_external, EGL_ANDROID_image_native_buffer ve EGL_ANDROID_recordable'ü destekleme. Ayrıca, Hardware Composer v1.1 ve sonraki sürümler için EGL_ANDROID_framebuffer_target uzantısı gerekir.

EGL_ANDROID_blob_cache, EGL_KHR_fence_sync ve EGL_ANDROID_native_fence_sync'nin de desteklenmesi önemle tavsiye edilir.

Android 10, EGL 1.5 arayüzünü uygular. EGL 1.5'teki yeni özellikler hakkında bilgi edinmek için Khronos Releases 1.5 Specification başlıklı makaleyi inceleyin.

Sürücü yükleniyor

Android, sistem görüntüsü oluşturulduğunda sistemde kullanılabilen GPU'ların bilinmesini bekler. 32 bit ve 64 bit OpenGL ES sürücüleri için tercih edilen yollar sırasıyla /vendor/lib/egl ve /vendor/lib64/egl'dir. Yükleyici, sistem sürücülerini bulup yüklemek için iki sistem özelliği (ro.hardware.egl ve ro.board.platform) veya tam adı kullanır. OpenGL ES sürücüsü tek bir ikili program olarak gönderilmeli veya üç ikili programa bölünmelidir. OpenGL ES sürücüsü tek bir ikili dosya olarak gönderiliyorsa aşağıdaki adlardan birini kullanın:

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

OpenGL ES sürücüsü üç ikili dosyaya gönderiliyorsa aşağıdaki ad kümelerinden birini kullanın:

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

OpenGL ES katmanları

Android 10, GLES 2.0+ için bir katman sistemi sunar. GLES katmanları, uygulamalardan kullanılabilen veya araçlar tarafından sağlanan paylaşılan nesnelerdir. GLES katmanları, hata ayıklanabilir uygulamaların Vulkan ile aynı kurulum mekanizmalarını kullanarak katmanları keşfetmesini ve yüklemesini sağlar.

EGL yükleyicisindeki bir bileşen olan GLES LayerLoader, GLES katmanlarını tanımlar. GLES LayerLoader'ın bulduğu her katman için GLES LayerLoader, AndroidGLESLayer_Initialize işlevini çağırır, libEGL'nin işlev listelerini tarar ve bilinen tüm işlevler için AndroidGLESLayer_GetProcAddress işlevini çağırır. Katman bir işlevi engellerse işlevin adresini izler. Katman bir işlevi kesintiye uğratmazsa, AndroidGLESLayer_GetProcAddress kendisine iletilen işlev adresini döndürür. LayerLoader daha sonra işlev kancası listesini katmanın giriş noktasını gösterecek şekilde günceller.

Katmanları etkinleştirme

GLES katmanlarını uygulama bazında veya genel olarak etkinleştirebilirsiniz. Uygulama başına ayarlar yeniden başlatma işlemlerinde korunurken genel özellikler yeniden başlatma işleminde temizlenir.

Katmanları uygulama bazında etkinleştirmek için:

# 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

Katmanları uygulama bazında devre dışı bırakmak için:

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

Katmanları global olarak etkinleştirmek için:

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

Test katmanları

GLES katmanları Android CTS tarafından desteklenir ve uyumlu cihazlar için CTS testlerini geçmesi gerekir. Katmanların bir cihazda çalışıp çalışmadığını belirlemek için $ atest CtsGpuToolsHostTestCases komutunu çalıştırın.