Implementare OpenGL ES ed EGL

OpenGL è un'API grafica multipiattaforma che specifica un'interfaccia software standard per l'hardware di elaborazione grafica 3D. OpenGL ES è un sottoinsieme della specifica OpenGL per i dispositivi embedded.

Per essere compatibili con Android, i dispositivi devono fornire driver per EGL, OpenGL ES 1.x e OpenGL ES 2.0. Il supporto per OpenGL ES 3.x è facoltativo. Le considerazioni chiave includono:

  • Garantire che il driver GL sia robusto e conforme agli standard OpenGL ES.
  • Consentire un numero illimitato di contesti GL. Poiché Android consente le app in background e tenta di mantenere attivi i contesti GL, non dovresti limitare il numero di contesti nel tuo driver.
  • Fare attenzione alla quantità di memoria allocata per ciascun contesto, perché è normale avere 20-30 contesti GL attivi contemporaneamente.
  • Supporta il formato immagine YV12 e altri formati immagine YUV provenienti da altri componenti del sistema, come codec multimediali o fotocamera.
  • Supporta le estensioni obbligatorie EGL_KHR_wait_sync , GL_OES_texture_external , EGL_ANDROID_image_native_buffer e EGL_ANDROID_recordable . Inoltre, Hardware Composer v1.1 e versioni successive richiedono l'estensione EGL_ANDROID_framebuffer_target .

Si consiglia vivamente di supportare anche EGL_ANDROID_blob_cache , EGL_KHR_fence_sync e EGL_ANDROID_native_fence_sync .

Android 10 implementa l' interfaccia EGL 1.5 . Per informazioni sulle nuove funzionalità di EGL 1.5, consultare le specifiche delle versioni 1.5 di Khronos .

Caricamento del conducente

Android prevede che le GPU disponibili per il sistema siano note al momento della creazione dell'immagine del sistema. I percorsi preferiti per i driver OpenGL ES a 32 bit e 64 bit sono rispettivamente /vendor/lib/egl e /vendor/lib64/egl . Il caricatore utilizza due proprietà di sistema, ro.hardware.egl e ro.board.platform , o il nome esatto per individuare e caricare i driver di sistema. Il driver OpenGL ES deve essere fornito in un file binario o suddiviso in tre file binari. Se il driver OpenGL ES viene fornito in un file binario, utilizzare uno dei seguenti nomi:

libGLES_${ro.hardware.egl}.so
libGLES_${ro.board.platform}.so
libGLES.so

Se il driver OpenGL ES viene fornito in tre file binari, utilizzare uno dei seguenti set di nomi:

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

Livelli OpenGL ES

Android 10 introduce un sistema di stratificazione per GLES 2.0+. I layer GLES sono oggetti condivisi disponibili dalle app o forniti da strumenti. I livelli GLES consentono alle app di cui è possibile eseguire il debug di individuare e caricare livelli utilizzando gli stessi meccanismi di configurazione di Vulkan .

GLES LayerLoader, un componente all'interno del caricatore EGL, identifica i livelli GLES. Per ogni livello trovato da GLES LayerLoader, GLES LayerLoader chiama AndroidGLESLayer_Initialize , percorre gli elenchi di funzioni di libEGL e chiama AndroidGLESLayer_GetProcAddress per tutte le funzioni conosciute. Se il livello intercetta una funzione, tiene traccia dell'indirizzo della funzione. Se il livello non intercetta una funzione, AndroidGLESLayer_GetProcAddress restituisce lo stesso indirizzo della funzione che gli è stato passato. LayerLoader aggiorna quindi l'elenco degli hook della funzione in modo che punti al punto di ingresso del layer.

Abilita i livelli

Puoi abilitare i layer GLES per app o a livello globale. Le impostazioni per app persistono dopo i riavvii, mentre le proprietà globali vengono cancellate al riavvio.

Per abilitare i livelli per 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

Per disabilitare i livelli per 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

Per abilitare i livelli a livello globale :

# Attempts to load layers for all applications, including native executables
adb shell setprop debug.gles.layers layer1:layer2:...:layerN

Prova gli strati

I livelli GLES sono supportati da Android CTS e sono necessari per superare i test CTS per i dispositivi compatibili . Per identificare se i livelli funzionano su un dispositivo, eseguire $ atest CtsGpuToolsHostTestCases .