Android utilise l'API OpenGL ES (GLES) pour restituer 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 restituent des polygones texturés, tandis que les appels EGL affichent des rendus sur des é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, auquel on accède via le stockage local du thread plutôt que de le transmettre en argument. Le code de rendu doit s'exécuter sur un thread GLES actuel, et non sur le thread de l'interface utilisateur.
Surfaces EGL
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’un 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 du BufferQueue de l'objet fenêtre. À partir de ce moment-là, 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 propose 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 vient 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é à un BufferQueue), mais si vous détruisez l'EGLSurface, il se déconnecte du BufferQueue et laisse autre chose se connecter.
Un thread donné peut basculer entre plusieurs EGLSurfaces en modifiant ce qui est actuel . Une EGLSurface doit être actuelle sur un seul thread à la fois.
EGL n'est pas un autre aspect d'une surface (comme SurfaceHolder). EGLSurface est un concept connexe 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 simplement à GLES un endroit pour dessiner.
Reportez-vous au document de définition de compatibilité Android pour connaître les exigences OpenGL ES et EGL.
ANativeFenêtre
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()
. Tout comme son cousin en langage Java, vous pouvez le verrouiller, le restituer dans un logiciel, le déverrouiller et le publier. Le type de fenêtre native de base est le côté producteur d'un BufferQueue.
Pour créer une surface de fenêtre EGL à partir de code natif, transmettez une instance de EGLNativeWindowType à eglCreateWindowSurface()
. EGLNativeWindowType est un synonyme de ANativeWindow, vous pouvez donc convertir l'un en l'autre.