Implémenter OpenGL ES et EGL

OpenGL est une API graphique multiplate-forme qui spécifie une interface logicielle standard pour le matériel de traitement graphique 3D. OpenGL ES est un sous-ensemble de la spécification OpenGL pour les appareils intégrés.

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

  • Assurez-vous que le pilote GL est robuste et conforme aux normes OpenGL ES.
  • Autoriser un nombre illimité de contextes GL. Étant donné qu'Android autorise les applications en arrière-plan et tente de maintenir les contextes GL actifs, vous ne devez pas limiter le nombre de contextes dans votre pilote.
  • Tenir compte de la quantité de mémoire allouée pour chaque contexte, car il est courant d'avoir 20 à 30 contextes GL actifs à la fois.
  • Compatibilité avec le format d'image YV12 et d'autres formats d'image YUV provenant d'autres composants du système, tels que les codecs multimédias ou l'appareil photo.
  • Prise en charge des extensions obligatoires EGL_KHR_wait_sync, GL_OES_texture_external, EGL_ANDROID_image_native_buffer et EGL_ANDROID_recordable. De plus, la version 1.1 et les versions ultérieures de Hardware Composer nécessitent l'extension EGL_ANDROID_framebuffer_target.

Il est fortement recommandé de prendre également en charge EGL_ANDROID_blob_cache, EGL_KHR_fence_sync et EGL_ANDROID_native_fence_sync.

Android 10 implémente l'interface EGL 1.5. Pour en savoir plus sur les nouvelles fonctionnalités d'EGL 1.5, consultez la spécification des versions 1.5 de Khronos.

Chargement du pilote

Android s'attend à ce que les GPU disponibles pour le système soient connus lors de la création de l'image système. Les chemins d'accès privilégiés pour les pilotes OpenGL ES 32 bits et 64 bits sont respectivement /vendor/lib/egl et /vendor/lib64/egl. Le chargeur utilise deux propriétés système, ro.hardware.egl et ro.board.platform, ou le nom exact pour découvrir et charger les pilotes système. Le pilote OpenGL ES doit être fourni dans un seul binaire ou divisé en trois binaires. Si le pilote OpenGL ES est fourni 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 envoyé dans trois fichiers binaires, utilisez l'un des 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+. Les couches GLES sont des objets partagés disponibles à partir d'applications ou fournis par des outils. Les couches GLES permettent aux applications débogables de découvrir et de charger des couches à l'aide des mêmes mécanismes de configuration que Vulkan.

GLES LayerLoader, un composant du chargeur EGL, identifie les couches GLES. Pour chaque couche qu'il trouve, le LayerLoader GLES appelle AndroidGLESLayer_Initialize, parcourt les listes de fonctions de libEGL et appelle AndroidGLESLayer_GetProcAddress pour toutes les fonctions connues. Si la couche intercepte une fonction, elle recense l'adresse de la fonction. Si la couche n'intercepte pas de fonction, AndroidGLESLayer_GetProcAddress renvoie l'adresse de fonction qui a été transmise. Le LayerLoader met ensuite à jour la liste de hooks de fonction pour qu'elle pointe vers le point d'entrée de la couche.

Activer les couches

Vous pouvez activer les couches GLES pour une application ou de manière globale. Les paramètres par application sont conservés 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

Couches de test

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