实现 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 是已知状态。32 位和 64 位 OpenGL ES 驱动程序的首选路径分别为 /vendor/lib/egl/vendor/lib64/egl。 该加载程序使用两个系统属性(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 都会调用 AndroidGLESLayer_Initialize,遍历 libEGL 的函数列表,然后针对所有已知函数调用 AndroidGLESLayer_GetProcAddress。 如果图层截获了某个函数,它会跟踪该函数的地址。 如果图层没有截获到函数,AndroidGLESLayer_GetProcAddress 会返回它之前所收到的函数地址。然后,LayerLoader 会更新函数钩子列表,使其指向图层的入口点。

启用层

您可以按应用启用 GLES 图层,也可全局启用 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