Implémenter OpenGL ES et EGL

OpenGL est une solution d'images multiplates-formes API spécifiant un logiciel standard pour le matériel de traitement graphique 3D. OpenGL ES est un sous-ensemble Spécification OpenGL pour les appareils intégrés.

Pour être compatibles avec Android, les appareils doivent fournir des pilotes pour EGL, OpenGL ES 1.x et OpenGL ES 2.0. Assistance pour OpenGL ES 3.x est facultative. Voici les points clés à prendre en compte:

  • S'assurer que le pilote GL est robuste et conforme aux normes OpenGL ES.
  • Autoriser un nombre illimité de contextes GL. Android permet en arrière-plan et essaie de maintenir actifs les contextes GL, vous ne devez pas Limitez le nombre de contextes dans votre conducteur.
  • Tenez compte de la quantité de mémoire allouée à chaque contexte, car il est courant d'avoir 20 à 30 contextes GL actifs à la fois.
  • Prise en charge du format d'image YV12 et des autres formats d'image YUV disponibles à partir d'autres composants du système, tels que les codecs multimédias ou l'appareil photo.
  • Prendre en charge les extensions obligatoires EGL_KHR_wait_sync, GL_OES_texture_external, EGL_ANDROID_image_native_buffer et EGL_ANDROID_recordable En outre, Hardware Composer v1.1 et supérieurs nécessitent EGL_ANDROID_framebuffer_target. .

Nous vous recommandons vivement d'accepter également EGL_ANDROID_blob_cache, EGL_KHR_fence_sync EGL_ANDROID_native_fence_sync

Android 10 implémente l'interface EGL 1.5. Pour en savoir plus sur les nouvelles fonctionnalités EGL 1.5, reportez-vous à la spécification Khronos Releases 1.5.

Chargement du pilote...

Android s'attend à ce que les GPU disponibles pour le système soient connus lorsque celui-ci est générée. Les chemins privilégiés pour les pilotes OpenGL ES 32 bits et 64 bits sont les suivants : /vendor/lib/egl et /vendor/lib64/egl, respectivement. Le loader utilise deux propriétés système : ro.hardware.egl et ro.board.platform, ou le mot clé exact pour découvrir et charger les pilotes système. Le pilote OpenGL ES doit être livrés en un binaire ou divisés en trois binaires. Si OpenGL ES est envoyé dans un binaire, utilisez l'un des noms suivants:

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

Si le pilote OpenGL ES est livré dans trois binaires, utilisez l'un des les ensembles de noms suivants:

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

Couches OpenGL ES

Android 10 introduit un système de superposition pour GLES 2.0 et versions ultérieures. Les couches GLES sont des objets partagés disponibles depuis des applications ou fournis par outils. Les couches GLES permettent aux applications débogables de découvrir et de charger des couches à l'aide du les mêmes mécanismes de configuration que Vulkan :

Le composant LayerLoader GLES, qui fait partie du chargeur EGL, identifie les couches GLES. Pour chaque couche que GLES trouve, le composant LayerLoader GLES appelle AndroidGLESLayer_Initialize, parcourt les listes de fonctions libEGL, et appelle AndroidGLESLayer_GetProcAddress pour toutes les fonctions connues. Si la couche intercepte une fonction, elle suit l'adresse de cette fonction. Si la couche n’intercepte pas de fonction, AndroidGLESLayer_GetProcAddress renvoie la même fonction l'adresse à laquelle elle a été transmise. Le LayerLoader met ensuite à jour la liste de hook de fonction comme suit : point vers le point d'entrée du calque.

Activer les couches

Vous pouvez activer les couches GLES pour une application ou de manière globale. Paramètres par application sont conservées lors des redémarrages, tandis que les propriétés globales sont effacées au redémarrage.

Pour activer les couches par application:

# 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

Pour désactiver les couches par application:

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

Pour activer les couches de manière globale:

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

Calques de test

Les couches GLES reposent sur Android CTS et doivent réussir les tests CTS pour appareils compatibles. Pour déterminer si les couches travaillent sur un appareil, exécutez $ atest CtsGpuToolsHostTestCases.