OpenGL ist eine plattformübergreifende Grafik-API, die eine Standardschnittstelle für 3D-Grafikhardware definiert. OpenGL ES ist eine Teilmenge der OpenGL-Spezifikation für eingebettete Geräte.
Damit Geräte Android-kompatibel sind, müssen sie Treiber für EGL, OpenGL ES 1.x und OpenGL ES 2.0 bereitstellen. Die Unterstützung von OpenGL ES 3.x ist optional. Wichtige Überlegungen:
- Sicherstellen, dass der GL-Treiber stabil ist und den OpenGL ES-Standards entspricht.
- Es kann eine unbegrenzte Anzahl von GL-Kontexten verwendet werden. Da Android Apps im Hintergrund zulässt und versucht, GL-Kontexte aktiv zu halten, sollten Sie die Anzahl der Kontexte in Ihrem Treiber nicht begrenzen.
- Achten Sie auf die Menge an Arbeitsspeicher, die für jeden Kontext zugewiesen wird, da es üblich ist, 20–30 aktive GL-Kontexte gleichzeitig zu haben.
- Unterstützung des Bildformats YV12 und anderer YUV-Bildformate, die von anderen Komponenten im System stammen, z. B. von Media-Codecs oder der Kamera.
- Unterstützung der obligatorischen Erweiterungen
EGL_KHR_wait_sync
,GL_OES_texture_external
,EGL_ANDROID_image_native_buffer
undEGL_ANDROID_recordable
. Außerdem ist für Hardware Composer v1.1 und höher dieEGL_ANDROID_framebuffer_target
-Erweiterung erforderlich.
Es wird dringend empfohlen, auch EGL_ANDROID_blob_cache
, EGL_KHR_fence_sync
und EGL_ANDROID_native_fence_sync
zu unterstützen.
In Android 10 wird die EGL 1.5-Schnittstelle implementiert. Informationen zu neuen Funktionen in EGL 1.5 finden Sie in der Khronos Releases 1.5 Specification.
Treiber wird geladen
Unter Android müssen die für das System verfügbaren GPUs bekannt sein, 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 ausgeliefert werden. Wenn der OpenGL ES-Treiber in einem Binärprogramm ausgeliefert 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 ausgeliefert 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
Mit Android 10 wird ein Layering-System für GLES 2.0+ eingeführt. GLES-Layer sind freigegebene Objekte, die in Apps verfügbar sind oder von Tools bereitgestellt werden. GLES-Ebenen ermöglichen es, dass debugfähige Apps Ebenen mit denselben Einrichtungsmechanismen wie Vulkan erkennen und laden können.
GLES LayerLoader, eine Komponente im EGL-Loader, identifiziert GLES-Ebenen.
Für jede Ebene, die der GLES LayerLoader findet, ruft er AndroidGLESLayer_Initialize
auf, durchläuft die Funktionslisten von libEGL und ruft AndroidGLESLayer_GetProcAddress
für alle bekannten Funktionen auf.
Wenn der Layer eine Funktion abfängt, wird die Adresse der Funktion erfasst.
Wenn die Ebene keine Funktion abfängt, gibt AndroidGLESLayer_GetProcAddress
dieselbe Funktionsadresse zurück, die ihr übergeben wurde. Der LayerLoader aktualisiert dann die Liste der Funktions-Hooks, sodass sie auf den Einstiegspunkt des Layers verweist.
Ebenen aktivieren
Sie können GLES-Ebenen entweder pro App oder global aktivieren. App-spezifische Einstellungen bleiben auch nach einem Neustart 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 für eine bestimmte 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
Testebenen
GLES-Ebenen werden von Android CTS unterstützt und müssen CTS-Tests für kompatible Geräte bestehen. Führen Sie $ atest CtsGpuToolsHostTestCases
aus, um festzustellen, ob Ebenen auf einem Gerät funktionieren.