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 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_layersadb shell settings delete global gpu_debug_appadb 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.