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.