Implementieren Sie OpenGL ES und EGL

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 und EGL_ANDROID_recordable . Darüber hinaus ist für Hardware Composer v1.1 und höher die Erweiterung EGL_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 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

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.