实施 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_syncGL_OES_texture_externalEGL_ANDROID_image_native_bufferEGL_ANDROID_recordable。此外,硬件合成器 v1.1 及更高版本需要 EGL_ANDROID_framebuffer_target 扩展程序。

强烈建议也支持 EGL_ANDROID_blob_cacheEGL_KHR_fence_syncEGL_ANDROID_native_fence_sync

Android 10 实现了 EGL 1.5 接口。如需了解 EGL 1.5 中的新功能,请参阅 Khronos 发布 1.5 规范

驱动程序加载

Android 希望在构建系统映像时了解系统可用的 GPU。/vendor/lib/egl/vendor/lib64/egl 分别是 32 位和 64 位 OpenGL ES 驱动程序的首选路径。加载程序使用两个系统属性 ro.hardware.eglro.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