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
。此外,硬件合成器 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 发布 1.5 规范。
驱动程序加载
Android 希望在构建系统映像时了解系统可用的 GPU。/vendor/lib/egl
和 /vendor/lib64/egl
分别是 32 位和 64 位 OpenGL ES 驱动程序的首选路径。加载程序使用两个系统属性 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
。