Android 实现 OpenGL ES 和 EGL

<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_cacheEGL_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 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值