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 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, GLES LayerLoader вызывает AndroidGLESLayer_Initialize
, просматривает списки функций libEGL и вызывает AndroidGLESLayer_GetProcAddress
для всех известных функций. Если слой перехватывает функцию, он отслеживает адрес функции. Если слой не перехватывает функцию, AndroidGLESLayer_GetProcAddress
возвращает тот же адрес функции, который был передан. Затем LayerLoader обновляет список перехватчиков функций, чтобы указать на точку входа слоя.
Включить слои
Вы можете включить слои GLES либо для каждого приложения, либо глобально. Настройки для каждого приложения сохраняются при перезагрузке, тогда как глобальные свойства очищаются при перезагрузке.
Чтобы включить слои для каждого приложения :
# Enable layersadb shell settings put global enable_gpu_debug_layers 1
# Specify target appadb 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 layersadb 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
.