EGLSurfaces et OpenGL ES

Android utilise l'API OpenGL ES (GLES) pour afficher les graphiques. Pour créer des contextes GLES et fournir un système de fenêtrage pour les rendus GLES, Android utilise la bibliothèque EGL. Les appels GLES affichent des polygones texturés, tandis que les appels EGL affichent des rendus sur les écrans.

Avant de dessiner avec GLES, vous devez créer un contexte GL. Dans EGL, cela signifie créer un EGLContext et une EGLSurface. Les opérations GLES s'appliquent au contexte actuel, auquel on accède via le stockage local du thread plutôt que par le biais d'un argument. Le code de rendu doit s'exécuter sur un thread GLES, et non sur le thread UI.

EGLSurfaces

L'EGLSurface peut être un tampon hors écran alloué par EGL, appelé pbuffer, ou une fenêtre allouée par le système d'exploitation. L'appel de la fonction eglCreateWindowSurface() crée des surfaces de fenêtre EGL. eglCreateWindowSurface() utilise un objet de fenêtre comme argument, qui est une surface sur Android. Une surface correspond au côté producteur d'une BufferQueue. Les consommateurs, qui sont SurfaceView, SurfaceTexture, TextureView ou ImageReader, créent des surfaces. Lorsque vous appelez eglCreateWindowSurface(), EGL crée un objet EGLSurface et le connecte à l'interface de producteur de la BufferQueue de l'objet Window. À partir de ce moment, le rendu sur cette EGLSurface supprime un tampon de la file d'attente, effectue le rendu et le met en file d'attente pour l'utilisation par le consommateur.

EGL ne fournit pas d'appels de verrouillage/déverrouillage. Exécutez les commandes de dessin, puis appelez eglSwapBuffers() pour envoyer le frame actuel. Le nom de la méthode provient de l'échange traditionnel des tampons avant et arrière, mais l'implémentation réelle peut être différente.

Une seule EGLSurface peut être associée à une surface à la fois (vous ne pouvez avoir qu'un seul producteur connecté à une BufferQueue), mais si vous détruisez l'EGLSurface, elle se déconnecte de la BufferQueue et permet à un autre élément de se connecter.

Un thread donné peut basculer entre plusieurs EGLSurfaces en modifiant ce qui est actuel. Une EGLSurface ne doit être actuelle que sur un seul thread à la fois.

EGL n'est pas un autre aspect d'une surface, comme SurfaceHolder. EGLSurface est un concept associé, mais indépendant. Vous pouvez dessiner sur une EGLSurface qui n'est pas soutenue par une surface, et vous pouvez utiliser une surface sans EGL. EGLSurface fournit à GLES un emplacement pour dessiner.

Consultez le document de définition de compatibilité Android pour connaître les exigences concernant OpenGL ES et EGL.

ANativeWindow

La classe de surface publique est implémentée dans le langage de programmation Java. L'équivalent en C/C++ est la classe ANativeWindow, semi-exposée par le NDK Android. Vous pouvez obtenir l'ANativeWindow à partir d'une surface avec l'appel ANativeWindow_fromSurface(). Comme son cousin en langage Java, vous pouvez le verrouiller, le rendre dans un logiciel, le déverrouiller et le publier. Le type de fenêtre native de base correspond au côté producteur d'une BufferQueue.

Pour créer une surface de fenêtre EGL à partir du code natif, transmettez une instance de EGLNativeWindowType à eglCreateWindowSurface(). EGLNativeWindowType est un synonyme d'ANativeWindow. Vous pouvez donc effectuer un cast de l'un vers l'autre.