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 compatibili, i dispositivi devono fornire driver per EGL, OpenGL ES 1.x e OpenGL ES 2.0. Il supporto di OpenGL ES 3.x è facoltativo. Ecco alcune considerazioni chiave:
- Verifica che il driver GL sia robusto e conforme agli standard OpenGL ES.
- Consenti un numero illimitato di contesti GL. Poiché Android consente le app in background e tenta di mantenere attivi i contesti GL, non devi limitare il numero di contesti nel driver.
- Tieni presente la quantità di memoria allocata per ogni contesto, perché è comune avere 20-30 contesti GL attivi contemporaneamente.
- Supporta il formato immagine YV12 e altri formati immagine YUV che provengono da altri componenti del sistema, come codec multimediali o la fotocamera.
- Supporta le estensioni obbligatorie
EGL_KHR_wait_sync,GL_OES_texture_external,EGL_ANDROID_image_native_buffereEGL_ANDROID_recordable. Inoltre, Hardware Composer 1.1 e versioni successive richiedono l'estensioneEGL_ANDROID_framebuffer_target.
È consigliabile 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, consulta la specifica delle release 1.5 di Khronos.
Caricamento del driver
Android prevede che le GPU disponibili per il sistema siano note quando viene creata l'immagine di sistema. I percorsi preferiti per i driver OpenGL ES a 32 e 64 bit sono rispettivamente /vendor/lib/egl e /vendor/lib64/egl.
Il loader utilizza due proprietà di sistema,
ro.hardware.egl e ro.board.platform, o il nome esatto
per rilevare e caricare i driver di sistema. Il driver OpenGL ES deve essere fornito in un unico file binario o suddiviso in tre file binari. Se il driver OpenGL ES viene fornito in un unico file binario, utilizza 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, utilizza 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 livelli per GLES 2.0+. I livelli GLES sono oggetti condivisi disponibili all'interno delle app o forniti dagli strumenti. I livelli GLES consentono alle app di cui è possibile eseguire il debug di rilevare e caricare i livelli utilizzando gli stessi meccanismi di configurazione di Vulkan.
GLES LayerLoader, un componente del loader EGL, identifica i livelli GLES.
Per ogni livello trovato, GLES LayerLoader chiama AndroidGLESLayer_Initialize, scorre gli elenchi di funzioni di libEGL e chiama AndroidGLESLayer_GetProcAddress per tutte le funzioni note.
Se il livello intercetta una funzione, ne monitora l'indirizzo.
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 delle funzioni in modo che punti al punto di ingresso del livello.
Attivare i livelli
Puoi attivare i livelli GLES per app o a livello globale. Le impostazioni per app vengono mantenute dopo i riavvii, mentre le proprietà globali vengono cancellate al riavvio.
Per attivare i livelli per 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
Per disattivare i livelli per app:
adb shell settings delete global enable_gpu_debug_layersadb shell settings delete global gpu_debug_appadb shell settings delete global gpu_debug_layer_app
Per attivare i livelli a livello globale:
# Attempts to load layers for all applications, including native executables
adb shell setprop debug.gles.layers layer1:layer2:...:layerNTestare i livelli
I livelli GLES sono supportati da Android CTS e devono superare i test CTS per
dispositivi compatibili. Per verificare se i livelli funzionano su un dispositivo, esegui $ atest CtsGpuToolsHostTestCases.