EGLSurfaces и OpenGL ES

Android использует API OpenGL ES (GLES) для рендеринга графики. Для создания контекстов GLES и предоставления оконной системы для рендеринга GLES, Android использует библиотеку EGL . Вызовы GLES рендерят текстурированные полигоны, в то время как вызовы EGL выводят рендеры на экраны.

Перед рисованием с помощью GLES необходимо создать контекст GL. В EGL это означает создание EGLContext и EGLSurface. Операции GLES применяются к текущему контексту, доступ к которому осуществляется через локальное хранилище потока, а не через аргумент. Код рендеринга должен выполняться в потоке GLES, а не в потоке пользовательского интерфейса.

EGLSurfaces

EGLSurface может быть внеэкранным буфером, выделенным EGL, называемым pbuffer , или окном, выделенным операционной системой. Вызов функции eglCreateWindowSurface() создает поверхности окна EGL. eglCreateWindowSurface() принимает в качестве аргумента объект окна , который в Android является поверхностью. Поверхность является стороной- производителем BufferQueue. Потребители , которыми являются SurfaceView, SurfaceTexture, TextureView или ImageReader, создают поверхности. При вызове eglCreateWindowSurface() EGL создает новый объект EGLSurface и подключает его к интерфейсу-производителю BufferQueue объекта окна. С этого момента рендеринг в этот EGLSurface извлекает буфер из очереди, рендерит в него и помещает его в очередь для использования потребителем.

EGL не поддерживает вызовы блокировки/разблокировки. Выполните команды отрисовки, а затем вызовите eglSwapBuffers() для отправки текущего кадра. Название метода происходит от традиционного обмена переднего и заднего буферов, но фактическая реализация может отличаться.

Только один объект EGLSurface может быть связан с поверхностью одновременно (к BufferQueue можно подключить только одного производителя), но если уничтожить EGLSurface, он отключится от BufferQueue и позволит подключиться чему-то другому.

Поток может переключаться между несколькими поверхностями EGLSurface, изменяя текущую . Поверхность EGLSurface должна быть активной только в одном потоке одновременно.

EGL не является частью поверхности, например, SurfaceHolder. EGLSurface — это связанное, но независимое понятие. Вы можете рисовать на EGLSurface, не подкреплённой поверхностью, и использовать поверхность без EGL. EGLSurface предоставляет GLES место для рисования.

Требования OpenGL ES и EGL см. в документе «Определение совместимости Android».

ANativeWindow

Класс public surface реализован в языке программирования Java. Эквивалентом ему в C/C++ является класс ANativeWindow, частично представленный в Android NDK . ANativeWindow можно получить из поверхности с помощью вызова ANativeWindow_fromSurface() . Как и его аналог в Java, его можно заблокировать, отрисовать программно, а также разблокировать и опубликовать. Базовый нативный тип окна — это сторона-производитель BufferQueue.

Чтобы создать поверхность окна EGL из собственного кода, передайте экземпляр EGLNativeWindowType в eglCreateWindowSurface() . EGLNativeWindowType является синонимом ANativeWindow, поэтому вы можете привести один тип к другому.