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.
Android ile uyumlu olmak için cihazların 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 ve OpenGL ES standartlarına uygun olmasını sağlama
- Sınırsız sayıda GL bağlamına izin verilir. Android, arka planda uygulamalara izin verdiği ve GL bağlamlarını etkin tutmaya çalıştığı için sürücünüzdeki bağlam sayısını sınırlamamanız gerekir.
- Aynı anda 20-30 etkin GL bağlamı olması yaygın olduğundan her bağlam için ayrılan bellek miktarına dikkat edin.
- YV12 resim biçimini ve medya codec'leri veya kamera gibi sistemdeki diğer bileşenlerden gelen diğer YUV resim biçimlerini destekleme.
- Zorunlu
EGL_KHR_wait_sync
,GL_OES_texture_external
,EGL_ANDROID_image_native_buffer
veEGL_ANDROID_recordable
uzantıları destekleniyor. Ayrıca, Donanım Derleyici 1.1 ve sonraki sürümler içinEGL_ANDROID_framebuffer_target
uzantısı gerekir.
EGL_ANDROID_blob_cache
,
EGL_KHR_fence_sync
ve
EGL_ANDROID_native_fence_sync
'yi de desteklemeniz önemle tavsiye edilir.
Android 10'da EGL 1.5 arayüzü kullanılıyor. EGL 1.5'teki yeni özellikler hakkında bilgi edinmek için Khronos Releases 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
'dır.
Yükleyici, sistem sürücülerini bulup yüklemek için ro.hardware.egl
ve ro.board.platform
adlı iki sistem özelliğini ya da tam adı kullanır. OpenGL ES sürücüsü tek bir ikili dosyada veya üç ikili dosyaya bölünmüş olarak gönderilmelidir. OpenGL ES sürücüsü tek bir ikili dosyada 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 dosyada 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ı, uygulamaların içinden kullanılabilen veya araçlar tarafından sağlanan paylaşılan nesnelerdir. GLES katmanları, hata ayıklama yapılabilir 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, bulduğu her katman için AndroidGLESLayer_Initialize
işlevini çağırır, libEGL işlev listelerini tarar ve bilinen tüm işlevler için AndroidGLESLayer_GetProcAddress
işlevini çağırır.
Katman bir işlevin yolunu keserse işlevin adresini izler.
Katman bir işlevi durdurmazsa AndroidGLESLayer_GetProcAddress
, kendisine iletilen işlev adresini döndürür. Ardından LayerLoader, işlev kanca listesini katmanın giriş noktasını işaret edecek şekilde günceller.
Katmanları etkinleştirme
GLES katmanlarını uygulama bazında veya genel olarak etkinleştirebilirsiniz. Uygulama bazında ayarlar, yeniden başlatma sırasında geçerliliğini korurken genel özellikler ise yeniden başlatma sırasında temizlenir.
Katmanları uygulama başına etkinleştirmek için:
# Enable layersadb shell settings put global enable_gpu_debug_layers 1
# Specify target appadb 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 layersadb shell settings put global gpu_debug_layer_app package1:package2:...:packageN
Katmanları uygulama başına 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
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.