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 pour EGL, OpenGL ES 1.x et OpenGL ES 2.0. La prise en charge d'OpenGL ES 3.x est facultative. Voici quelques points clés à prendre en compte :

  • Assurez-vous que le pilote GL est robuste et conforme aux normes OpenGL ES.
  • Autorisation d'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.
  • 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 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 lorsque celui-ci est générée. 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 livrés en un binaire ou divisés 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 fourni dans trois 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 ou version ultérieure. Les couches GLES sont des objets partagés disponibles dans les 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 la même fonction l'adresse à laquelle elle 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. 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

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 travaillent sur un appareil, exécutez $ atest CtsGpuToolsHostTestCases.