OpenGL ES ve EGL'yi uygulayın

OpenGL, 3D grafik işleme donanımı için standart bir yazılım arayüzünü belirleyen platformlar arası bir grafik API'sidir. OpenGL ES, yerleşik aygıtlara yönelik OpenGL spesifikasyonunun bir alt kümesidir.

Android uyumlu olması için cihazların EGL, OpenGL ES 1.x ve OpenGL ES 2.0 sürücülerini sağlaması gerekir. OpenGL ES 3.x desteği isteğe bağlıdır. Önemli hususlar şunları içerir:

  • GL sürücüsünün sağlam olduğundan ve OpenGL ES standartlarına uygun olduğundan emin olmak.
  • Sınırsız sayıda GL bağlamına izin verme. Android, arka planda uygulamalara 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 aktif GL bağlamına sahip olmak yaygın olduğundan, her bağlam için ayrılan bellek miktarına dikkat edin.
  • Medya codec'leri veya kamera gibi sistemdeki diğer bileşenlerden gelen YV12 görüntü formatını ve diğer YUV görüntü formatlarını destekler.
  • Zorunlu EGL_KHR_wait_sync , GL_OES_texture_external , EGL_ANDROID_image_native_buffer ve EGL_ANDROID_recordable uzantılarını destekler. Ayrıca Hardware Composer v1.1 ve üzeri, EGL_ANDROID_framebuffer_target uzantısını gerektirir.

Ayrıca EGL_ANDROID_blob_cache , EGL_KHR_fence_sync ve EGL_ANDROID_native_fence_sync desteklenmesi önemle tavsiye edilir.

Android 10, EGL 1.5 arayüzünü uygular. EGL 1.5'teki yeni özellikler hakkında bilgi için Khronos Sürüm 1.5 Spesifikasyonu'na bakın.

Sürücü yükleniyor

Android, sistem görüntüsü oluşturulduğunda sistemin kullanabileceği 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 . Yükleyici, sistem sürücülerini keşfetmek ve yüklemek için ro.hardware.egl ve ro.board.platform olmak üzere iki sistem özelliğini veya tam adı kullanır. OpenGL ES sürücüsü ya bir ikili dosya halinde gönderilmeli ya da üç ikili dosyaya bölünmelidir. OpenGL ES sürücüsü tek bir ikili dosya halinde gönderildiyse 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 dosya halinde gönderilmişse 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 katmanlama sistemi sunar. GLES katmanları, uygulamaların içinden erişilebilen 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şfetmesine ve yüklemesine olanak tanır.

EGL yükleyici içindeki bir bileşen olan GLES LayerLoader, GLES katmanlarını tanımlar. GLES LayerLoader'ın bulduğu her katman için GLES LayerLoader, AndroidGLESLayer_Initialize çağırır, libEGL'nin işlev listelerinde gezinir ve bilinen tüm işlevler için AndroidGLESLayer_GetProcAddress çağırır. Katman bir işlevi durdurursa işlevin adresini izler. Katman bir işlevi engellemezse AndroidGLESLayer_GetProcAddress , aktarıldığı aynı işlev adresini döndürür. LayerLoader daha sonra işlev kanca listesini katmanın giriş noktasına işaret edecek şekilde günceller.

Katmanları etkinleştir

GLES katmanlarını uygulama başına veya genel olarak etkinleştirebilirsiniz. Uygulamaya özel ayarlar, yeniden başlatmalarda korunurken, genel özellikler yeniden başlatma sırasında temizlenir.

Uygulama başına katmanları 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

Uygulama başına katmanları 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ı genel olarak etkinleştirmek için:

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

Katmanları test edin

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