OpenGL ES und EGL implementieren

OpenGL ist eine plattformübergreifende Grafik API, die eine Standardsoftware angibt für Hardware zur 3D-Grafikverarbeitung. OpenGL ES ist eine Untergruppe des OpenGL-Spezifikation für eingebettete Geräte.

Um mit Android kompatibel zu sein, müssen Geräte benötigen Treiber für EGL, OpenGL ES 1.x und OpenGL ES 2.0. Support für OpenGL ES 3.x ist optional. Wichtige Überlegungen sind:

  • Sicherstellen, dass der GL-Treiber robust ist und den OpenGL ES-Standards entspricht
  • Unbegrenzte Anzahl von GL-Kontexten zulassen. Weil Android es und versucht, GL-Kontexte lebendig zu halten. die Anzahl der Kontexte in Ihrem Treiber beschränken.
  • Achten Sie auf die Menge an Arbeitsspeicher, der jedem Kontext zugewiesen ist, ist es üblich, 20 bis 30 aktive GL-Kontexte gleichzeitig zu haben.
  • Unterstützung des YV12-Bildformats und anderer YUV-Bildformate, die von anderen Komponenten im System, wie z. B. Medien-Codecs oder der Kamera, stammen.
  • Erforderliche Erweiterungen unterstützen EGL_KHR_wait_sync, GL_OES_texture_external, EGL_ANDROID_image_native_buffer und EGL_ANDROID_recordable. Zusätzlich enthält Hardware Composer v1.1 und höher erfordern die EGL_ANDROID_framebuffer_target .

Es wird dringend empfohlen, auch EGL_ANDROID_blob_cache zu unterstützen, EGL_KHR_fence_sync und EGL_ANDROID_native_fence_sync

Android 10 implementiert die EGL 1.5-Schnittstelle. Informationen zu neuen Funktionen in EGL 1.5 finden Sie in der Spezifikation für Khhronos Releases 1.5.

Treiber wird geladen

Android erwartet, dass die für das System verfügbaren GPUs bekannt sind, wenn das System wird erstellt. Die bevorzugten Pfade für 32-Bit- und 64-Bit-OpenGL ES-Treiber sind Entsprechend /vendor/lib/egl und /vendor/lib64/egl. Der loader verwendet zwei Systemeigenschaften: ro.hardware.egl und ro.board.platform oder die genaue um die Systemtreiber zu ermitteln und zu laden. Der OpenGL ES-Treiber muss entweder in einem Binärprogramm oder aufgeteilt in drei Binärprogramme geliefert werden. Wenn der OpenGL ES Treiber in einer Binärdatei versendet 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ärprogramme geliefert wird, verwenden Sie eine der folgenden Namenssätzen:

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 eingeführt 2.0 oder höher. GLES-Ebenen sind gemeinsam genutzte Objekte, die in Apps verfügbar sind oder von Werkzeuge. Mit GLES-Ebenen können debug-fähige Apps Ebenen mithilfe der Funktion Einrichtungsmechanismen wie Vulkan.

GLES LayerLoader, eine Komponente innerhalb des EGL-Ladeprogramms, identifiziert GLES-Ebenen. Für jede Ebene, die der GLES-LayerLoader findet, AndroidGLESLayer_Initialize aufruft, die Funktionslisten von libEGL durchläuft 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 Schicht keine Funktion abfängt, AndroidGLESLayer_GetProcAddress gibt dieselbe Funktion zurück. Adresse, die übergeben wurde. LayerLoader aktualisiert dann die Liste der Funktions-Hooks auf den Einstiegspunkt der Ebene.

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 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

Testebenen

GLES-Ebenen werden von Android CTS unterstützt und sind erforderlich, um CTS-Tests für kompatiblen Geräten zu installieren. Um festzustellen, ob Layers auf einem Gerät arbeiten, führen Sie $ atest CtsGpuToolsHostTestCases aus.