Реализация 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 версии 1.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 Releases 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 вызывает функцию 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 .