EGLSurfaces e OpenGL ES

O Android usa a API OpenGL ES (GLES) para renderizar gráficos. Para criar contextos do GLES e fornecer um sistema de janelas para renderizações do 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 o GLES, é preciso 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 do GLES, não na linha de execução de interface.

EGLSurfaces

A 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 um 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 do produtor do BufferQueue do objeto de janela. A partir desse ponto, a renderização para essa EGLSurface remove um buffer da fila, renderiza nele e o coloca em fila para uso pelo consumidor.

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

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

Uma determinada linha de execução pode alternar entre várias EGLSurfaces mudando o que é atual. Uma EGLSurface precisa estar atualizada em apenas uma linha de execução por vez.

O EGL não é outro aspecto de uma superfície, como um SurfaceHolder. EGLSurface é um conceito relacionado, mas independente. É possível desenhar em uma EGLSurface que não é compatível com uma superfície, e você pode usar uma superfície sem EGL. O EGLSurface fornece ao GLES um lugar para desenhar.

Consulte o Documento de definição de compatibilidade do Android para 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, parcialmente exposta pelo Android NDK. Você pode receber o ANativeWindow de uma superfície com a chamada ANativeWindow_fromSurface(). Assim como o primo em linguagem 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 com código nativo, transmita uma instância de EGLNativeWindowType para eglCreateWindowSurface(). EGLNativeWindowType é um sinônimo de ANativeWindow, então você pode converter um no outro.