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.