OpenGL ist eine plattformübergreifende Grafik-API, die eine Standardsoftwareschnittstelle für 3D-Grafikverarbeitungshardware spezifiziert. OpenGL ES ist eine Teilmenge der OpenGL-Spezifikation für eingebettete Geräte.
Um mit Android kompatibel zu sein, müssen Geräte Treiber für EGL, OpenGL ES 1.x und OpenGL ES 2.0 bereitstellen. Die Unterstützung für OpenGL ES 3.x ist optional. Zu den wichtigsten Überlegungen gehören:
- Sicherstellen, dass der GL-Treiber robust ist und den OpenGL ES-Standards entspricht.
- Ermöglicht eine unbegrenzte Anzahl von GL-Kontexten. Da Android Apps im Hintergrund zulässt und versucht, GL-Kontexte aufrechtzuerhalten, sollten Sie die Anzahl der Kontexte in Ihrem Treiber nicht begrenzen.
- Achten Sie auf die für jeden Kontext zugewiesene Speichermenge, da in der Regel 20 bis 30 aktive GL-Kontexte gleichzeitig vorhanden sind.
- Unterstützt das YV12-Bildformat und andere YUV-Bildformate, die von anderen Komponenten im System stammen, beispielsweise Mediencodecs oder der Kamera.
- Unterstützt die obligatorischen Erweiterungen
EGL_KHR_wait_sync
,GL_OES_texture_external
,EGL_ANDROID_image_native_buffer
undEGL_ANDROID_recordable
. Darüber hinaus ist für Hardware Composer v1.1 und höher die ErweiterungEGL_ANDROID_framebuffer_target
erforderlich.
Es wird dringend empfohlen, auch EGL_ANDROID_blob_cache
, EGL_KHR_fence_sync
und EGL_ANDROID_native_fence_sync
zu unterstützen.
Android 10 implementiert die EGL 1.5-Schnittstelle . Informationen zu neuen Funktionen in EGL 1.5 finden Sie in der Khronos Releases 1.5-Spezifikation .
Treiber wird geladen
Android geht davon aus, dass die dem System zur Verfügung stehenden GPUs bekannt sind, wenn das System-Image erstellt wird. Die bevorzugten Pfade für 32-Bit- und 64-Bit-OpenGL-ES-Treiber sind /vendor/lib/egl
bzw. /vendor/lib64/egl
. Der Loader verwendet zwei Systemeigenschaften, ro.hardware.egl
und ro.board.platform
oder den genauen Namen, um die Systemtreiber zu erkennen und zu laden. Der OpenGL ES-Treiber muss entweder in einer Binärdatei oder in drei Binärdateien aufgeteilt geliefert werden. Wenn der OpenGL ES-Treiber in einer Binärdatei geliefert wird, verwenden Sie einen der folgenden Namen:
libGLES_${ro.hardware.egl}.so libGLES_${ro.board.platform}.so libGLES.so
Wenn der OpenGL ES-Treiber in drei Binärdateien geliefert wird, verwenden Sie einen der folgenden Namenssätze:
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-Ebenen
Android 10 führt ein Layering-System für GLES 2.0+ ein. GLES-Ebenen sind gemeinsam genutzte Objekte, die in Apps verfügbar sind oder von Tools bereitgestellt werden. GLES-Layer ermöglichen debuggbaren Apps das Erkennen und Laden von Layern mithilfe derselben Einrichtungsmechanismen wie Vulkan .
GLES LayerLoader, eine Komponente innerhalb des EGL-Loaders, identifiziert GLES-Layer. Für jede Ebene, die der GLES LayerLoader findet, ruft der GLES LayerLoader AndroidGLESLayer_Initialize
auf, durchsucht die Funktionslisten von libEGL und ruft AndroidGLESLayer_GetProcAddress
für alle bekannten Funktionen auf. Wenn die Ebene eine Funktion abfängt, verfolgt sie die Adresse der Funktion. Wenn die Ebene keine Funktion abfängt, gibt AndroidGLESLayer_GetProcAddress
dieselbe Funktionsadresse zurück, die ihr übergeben wurde. Der LayerLoader aktualisiert dann die Funktions-Hook-Liste so, dass sie auf den Einstiegspunkt der Ebene zeigt.
Ebenen aktivieren
Sie können GLES-Ebenen entweder pro App oder global aktivieren. App-spezifische Einstellungen bleiben auch nach Neustarts erhalten, während globale Eigenschaften beim Neustart gelöscht werden.
So aktivieren Sie Ebenen pro App :
# 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
So deaktivieren Sie Ebenen pro App :
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
So aktivieren Sie Ebenen global :
# Attempts to load layers for all applications, including native executables
adb shell setprop debug.gles.layers layer1:layer2:...:layerN
Testschichten
GLES-Ebenen werden von Android CTS unterstützt und müssen CTS-Tests für kompatible Geräte bestehen. Um festzustellen, ob Ebenen auf einem Gerät arbeiten, führen Sie $ atest CtsGpuToolsHostTestCases
aus.