<aclass="external" l10n-attrs-original-order="href,class" l10n-encrypted-href="npC2I0v1QdyEcSFsO8sdQMjFEOn7Tv25TU27pstn8iE=">OpenGL 是一种跨平台的图形 API,用于为 3D 图形处理硬件指定标准的软件接口。OpenGL ES 是 OpenGL 规范的子集,适用于嵌入式设备。</aclass="external">
为了与 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 规范。
注意:呈现给应用开发者的 OpenGL API 与在设备上实现的 OpenGL 不同。应用无法直接访问 GL 驱动程序层,而是必须通过 API 提供的接口访问。
驱动程序加载
Android 要求在构建系统映像时系统可用的 GPU 是已知状态。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 1.x 专有函数将继续传送到 GLES 1.x 驱动程序,但与 GLES 2.0+ 共享的函数将传送到 2.0+ 驱动程序。
GLES LayerLoader 是 EGL 加载程序中的一个组件,可识别 GLES 图层。 对于找到的每一个图层,GLES LayerLoader 都会调用 AndroidGLESLayer_Initialize
,遍历 libEGL 的函数列表,然后针对所有已知函数调用 AndroidGLESLayer_GetProcAddress
。 如果图层截获了某个函数,它会跟踪该函数的地址。 如果图层没有截获到函数,AndroidGLESLayer_GetProcAddress
会返回它之前所收到的函数地址。然后,LayerLoader 会更新函数钩子列表,使其指向图层的入口点。
启用图层
注意:Android 的安全模型和政策与其他平台有很大不同。Android 仅允许具有 root 访问权限的用户从设备的本地存储加载 GLES 图层。若无 root 访问权限,就只能为可调式应用加载 GLES 图层。
您可以按应用启用 GLES 图层,也可全局启用 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
。