EGLSurfaces e OpenGL ES

O Android usa a API OpenGL ES (GLES) para renderizar gráficos. Para criar contextos GLES e fornecer um sistema de janelas para renderizações GLES, o Android usa a biblioteca EGL . As chamadas GLES renderizam polígonos texturizados, enquanto as chamadas EGL colocam renderizações em telas.

Antes de desenhar com GLES, você precisa criar um contexto GL. No EGL, isso significa criar um EGLContext e um EGLSurface. As operações GLES se aplicam ao contexto atual, que é acessado por meio de armazenamento local de thread em vez de passado como argumento. O código de renderização deve ser executado em um thread GLES atual, não no thread da UI.

EGLSurfaces

O EGLSurface pode ser um buffer fora da tela alocado pelo EGL, chamado pbuffer , ou uma janela alocada pelo sistema operacional. Chamar a função eglCreateWindowSurface() cria superfícies de janela EGL. eglCreateWindowSurface() usa um objeto de janela como argumento, que no Android é uma superfície. Uma superfície é o lado produtor de um BufferQueue. Os consumidores , que são SurfaceView, SurfaceTexture, TextureView ou ImageReader, criam superfícies. Quando você chama eglCreateWindowSurface() , o EGL cria um novo objeto EGLSurface e o conecta à interface do produtor do BufferQueue do objeto de janela. Desse ponto em diante, a renderização para esse EGLSurface resulta em um buffer sendo retirado da fila, renderizado e colocado na fila para uso pelo consumidor.

EGL não fornece chamadas de bloqueio/desbloqueio. Emita comandos de desenho e chame eglSwapBuffers() para enviar o quadro atual. O nome do método vem da troca tradicional de buffers frontais e traseiros, mas a implementação real pode ser diferente.

Apenas um EGLSurface pode ser associado a uma superfície por vez (você pode ter apenas um produtor conectado a um BufferQueue), mas se você destruir o EGLSurface ele se desconectará do BufferQueue e permitirá que outra coisa se conecte.

Um determinado thread pode alternar entre vários EGLSurfaces alterando o que é atual . Um EGLSurface deve estar atual em apenas um thread por vez.

EGL não é outro aspecto de uma superfície (como SurfaceHolder). EGLSurface é um conceito relacionado, mas independente. Você pode desenhar em um EGLSurface que não seja apoiado por uma superfície e pode usar uma superfície sem EGL. EGLSurface apenas fornece ao GLES um local para desenhar.

Consulte o documento de definição de compatibilidade do Android para obter os requisitos do OpenGL ES e EGL.

ANativeWindow

A classe de superfície pública é implementada na linguagem de programação Java. O equivalente em C/C++ é a classe ANativeWindow, semi-exposta pelo Android NDK . Você pode obter o ANativeWindow de uma superfície com a chamada ANativeWindow_fromSurface() . Assim como seu primo da linguagem Java, você pode bloqueá-lo, renderizá-lo em software e desbloquear e postar. O tipo de janela nativa básica é o lado do produtor de um BufferQueue.

Para criar uma superfície de janela EGL a partir de código nativo, passe uma instância de EGLNativeWindowType para eglCreateWindowSurface() . EGLNativeWindowType é sinônimo de ANativeWindow, então você pode converter um para o outro.