EGLSurfaces et OpenGL ES

Android utilise l' API OpenGL ES (GLES) pour rendre 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 rendent les polygones texturés, tandis que les appels EGL placent les 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 un EGLSurface. Les opérations GLES s'appliquent au contexte actuel, qui est accessible via le stockage local des threads plutôt que passé en tant qu'argument. Le code de rendu doit s'exécuter sur un thread GLES actuel, pas sur le thread d'interface utilisateur.

EGL Surfaces

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() prend un objet fenêtre comme argument, qui sur Android est une surface. Une surface est le 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 nouvel objet EGLSurface et le connecte à l'interface producteur de la BufferQueue de l'objet fenêtre. À partir de ce moment, le rendu sur cette EGLSurface entraîne la suppression d'un tampon, son rendu et sa mise en file d'attente pour être utilisé par le consommateur.

EGL ne fournit pas d'appels de verrouillage/déverrouillage. Émettez des commandes de dessin, puis appelez eglSwapBuffers() pour soumettre l'image actuelle. 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.

Un seul EGLSurface peut être associé à une surface à la fois (vous ne pouvez avoir qu'un seul producteur connecté à une BufferQueue), mais si vous détruisez l'EGLSurface, il se déconnecte de la BufferQueue et laisse quelque chose d'autre se connecter.

Un thread donné peut basculer entre plusieurs EGLSurfaces en changeant what's current . Une EGLSurface doit être active sur un seul thread à la fois.

EGL n'est pas un autre aspect d'une surface (comme SurfaceHolder). EGLSurface est un concept apparenté mais indépendant. Vous pouvez dessiner sur une EGLSurface qui n'est pas adossée à une surface et vous pouvez utiliser une surface sans EGL. EGLSurface fournit simplement à GLES un endroit où dessiner.

Reportez-vous au document de définition de compatibilité Android pour les exigences 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 ANativeWindow à partir d'une surface avec l'appel ANativeWindow_fromSurface() . Tout comme son cousin en langage Java, vous pouvez le verrouiller, le rendre dans le logiciel et le déverrouiller et le publier. Le type de fenêtre natif de base est le 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 de ANativeWindow, vous pouvez donc convertir l'un en l'autre.