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. O GLES chama renderização de polígonos com textura, enquanto o EGL chama renderizações em telas.

Antes de desenhar com o GLES, você precisa criar um contexto GL. No EGL, isso significa criar um EGLContext e um EGLSurface. As operações do GLES se aplicam ao contexto atual, que é acessado pelo armazenamento local de linhas de execução em vez de ser transmitido como um argumento. O código de renderização precisa ser executado em uma linha de execução GLES atual, não na linha de execução da interface.

EGLSurfaces

O EGLSurface pode ser um buffer fora da tela alocado pelo EGL, chamado de 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 do produtor de uma 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 de produtor do BufferQueue do objeto de janela. A partir desse ponto, a renderização para essa EGLSurface resulta em um buffer sendo removido da fila, renderizado e colocado na fila para uso pelo consumidor.

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

Apenas uma EGLSurface pode ser associada a uma superfície por vez (é possível ter apenas um produtor conectado a uma BufferQueue), mas, se você destruir a EGLSurface, ela se desconecta da BufferQueue e permite que outra coisa se conecte.

Uma determinada linha de execução pode alternar entre várias EGLSurfaces mudando o que está atual. Um EGLSurface precisa estar em execução em apenas um thread por vez.

O EGL não é outro aspecto de uma plataforma (como SurfaceHolder). EGLSurface é um conceito relacionado, mas independente. É possível desenhar em uma EGLSurface que não tem suporte de uma superfície e usar uma superfície sem EGL. A EGLSurface oferece ao GLES um lugar para desenhar.

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

ANativeWindow

A classe de superfície pública é implementada na linguagem de programação Java. O equivalente em C/C++ é a classe ANativeWindow, semiexposta pelo Android NDK. Você pode receber a ANativeWindow de uma superfície com a chamada ANativeWindow_fromSurface(). Assim como o primo do idioma Java, é possível bloquear, renderizar em software e desbloquear e postar. O tipo básico de janela nativa é o lado do produtor de uma BufferQueue.

Para criar uma superfície de janela EGL usando código nativo, transmita uma instância de EGLNativeWindowType para eglCreateWindowSurface(). EGLNativeWindowType é um sinônimo de ANativeWindow. Assim, é possível transmitir uma para a outra.