Реализация OpenGL ES и EGL

OpenGL — это кроссплатформенный графический API, который определяет стандартный программный интерфейс для аппаратного обеспечения обработки 3D-графики. OpenGL ES — это подмножество спецификации OpenGL для встраиваемых устройств.

Чтобы быть совместимыми с Android, устройства должны иметь драйверы для EGL, OpenGL ES 1.x и OpenGL ES 2.0. Поддержка OpenGL ES 3.x не является обязательной. Ключевые соображения включают в себя:

  • Обеспечение надежности драйвера GL и его соответствия стандартам OpenGL ES.
  • Разрешение неограниченного количества контекстов GL. Поскольку Android позволяет приложениям работать в фоновом режиме и пытается поддерживать контексты GL, вам не следует ограничивать количество контекстов в драйвере.
  • Помните об объеме памяти, выделяемой для каждого контекста, поскольку обычно одновременно имеется 20–30 активных контекстов GL.
  • Поддержка формата изображения YV12 и других форматов изображений YUV, которые поступают от других компонентов системы, таких как медиакодеки или камера.
  • Поддержка обязательных расширений EGL_KHR_wait_sync , GL_OES_texture_external , EGL_ANDROID_image_native_buffer и EGL_ANDROID_recordable . Кроме того, для Hardware Composer v1.1 и выше требуется расширение EGL_ANDROID_framebuffer_target .

Настоятельно рекомендуется также поддерживать EGL_ANDROID_blob_cache , EGL_KHR_fence_sync и EGL_ANDROID_native_fence_sync .

В Android 10 реализован интерфейс EGL 1.5 . Информацию о новых функциях EGL 1.5 см. в спецификации Khronos Release 1.5 .

Загрузка драйвера

Android ожидает, что графические процессоры, доступные системе, будут известны при создании образа системы. Предпочтительные пути для 32-битных и 64-битных драйверов OpenGL ES — /vendor/lib/egl и /vendor/lib64/egl соответственно. Загрузчик использует два системных свойства: ro.hardware.egl и ro.board.platform или точное имя для обнаружения и загрузки системных драйверов. Драйвер OpenGL ES должен поставляться либо в одном двоичном виде, либо разделенным на три двоичных файла. Если драйвер OpenGL ES поставляется в одном двоичном виде, используйте одно из следующих имен:

libGLES_${ro.hardware.egl}.so
libGLES_${ro.board.platform}.so
libGLES.so

Если драйвер OpenGL ES поставляется в трех двоичных файлах, используйте один из следующих наборов имен:

libEGL_${ro.hardware.egl}.so
libGLESv1_CM_${ro.hardware.egl}.so
libGLESv2_${ro.hardware.egl}.so

libEGL_${ro.board.platform}.so
libGLESv1_CM_${ro.board.platform}.so
libGLESv2_${ro.board.platform}.so

libEGL.so
libGLESv1_CM.so
libGLESv2.so

Слои OpenGL ES

В Android 10 представлена ​​система слоев для GLES 2.0+. Слои GLES — это общие объекты, доступные из приложений или предоставляемые инструментами. Слои GLES позволяют отлаживаемым приложениям обнаруживать и загружать слои, используя те же механизмы настройки, что и Vulkan .

GLES LayerLoader, компонент загрузчика EGL, идентифицирует слои GLES. Для каждого слоя, который находит GLES LayerLoader, GLES LayerLoader вызывает AndroidGLESLayer_Initialize , просматривает списки функций libEGL и вызывает AndroidGLESLayer_GetProcAddress для всех известных функций. Если уровень перехватывает функцию, он отслеживает адрес функции. Если уровень не перехватывает функцию, AndroidGLESLayer_GetProcAddress возвращает тот же адрес функции, который был передан. Затем LayerLoader обновляет список перехватчиков функций, чтобы он указывал на точку входа слоя.

Включить слои

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

Чтобы включить слои для каждого приложения :

# Enable layers
adb shell settings put global enable_gpu_debug_layers 1

# Specify target app
adb shell settings put global gpu_debug_app package_name

# Specify layer list (from top to bottom)
adb shell settings put global gpu_debug_layers_gles layer1:layer2:...:layerN

# Specify packages to search for layers
adb shell settings put global gpu_debug_layer_app package1:package2:...:packageN

Чтобы отключить слои для каждого приложения :

adb shell settings delete global enable_gpu_debug_layers
adb shell settings delete global gpu_debug_app
adb shell settings delete global gpu_debug_layer_app

Чтобы включить слои глобально :

# Attempts to load layers for all applications, including native executables
adb shell setprop debug.gles.layers layer1:layer2:...:layerN

Тестовые слои

Слои GLES поддерживаются Android CTS и необходимы для прохождения тестов CTS на совместимых устройствах . Чтобы определить, работают ли слои на устройстве, запустите $ atest CtsGpuToolsHostTestCases .