Android是怎样调用硬件加速的

[描述]
如果处理器只有2D硬件加速而没有3D硬件加速,则可以利用opengl中的libagl,
实现封装在libagl里的copybit,因为相对3D API来说,这个模块的封装google
基本是做好的,只要去实现一个copybit HAL即可;
如果处理器2D/3D硬件加速均有,那么可以丢开 copybit,去实现openGL ES
2D/3D API 的加速功能。

[Android是怎样加载软件/硬件加速库的]

1. 全局变量gEGLImpl: 定义egl&gles的API的指针
egl_connection_t gEGLImpl[IMPL_NUM_IMPLEMENTATIONS];
enum {
IMPL_HARDWARE = 0,
IMPL_SOFTWARE,
IMPL_NUM_IMPLEMENTATIONS
};
具体数据结构参看附录。

2. 初始化全局变量gEGLImpl
Code:egl_init_drivers_locked()<frameworks/base/opengl/libs/EGL/egl.cpp>
egl_init_drivers_locked()函数主要的工作就是填充gEGLImp数组变量
该函数调用Loader.cpp中的Loader::open()加载对应的硬件和软件加速的驱动(动态链接库).
a. 加载libGLES_android.so填充gEGLImpl[IMPL_SOFTWARE];
b. 加载libGLES_HWxxxxx.so填充gEGLImpl[IMPL_HARDWARE];
注:配置文件/system/lib/egl/egl.cfg中列出了系统中的软件/硬件减速库
格式: dpy impl tag
0 0 android
0 1 HWxxxxx

[2D硬件加速]
frameworks/base/opengl/libagl/egl.cpp 文件中利用hardware/libhardware/hardware.c
文件中定义的hw_get_module()函数,该函数判断获得的系统属性是否在variant_keys[]数组中定义
通过load()函数加载相应的硬件模块;否则加载default硬件模块。
因此需要研究libagl,根据需要实现相应的copybit硬件模块。

注:
libGLES_android.so为编译frameworks/base/opengl/libagl/目录而生成的,其专门有一个
copybit.cpp文件对copybit模块进一步封装。
libagl中通过在frameworks/base/opengl/libagl/Android.mk文件中定义:
LIBAGL_USE_GRALLOC_COPYBITS := 1
来加载copybit模块;如果未定义LIBAGL_USE_GRALLOC_COPYBITS,则通过软件的方式而不使用
copybit 模块来达到 2D 硬件加速。

[2D/3D硬件加速]
需研究opengles, 并实现
/system/lib/egl/libGLES_HWxxxxx.so
或者
/system/lib/egl/libEGL_HWxxxxx.so
/system/lib/egl/libGLESv1_CM_HWxxxxx.so
/system/lib/egl/libGLESv2_HWxxxxx.so
来提供 openGL ES 2D/3D 硬件加速 API 。

[应用是怎样使用OpenGLES硬件加速的]
1.应用调用eglChooseConfig时,libs/EGL/egl.cpp::eglChooseConfig根据参数选择config时,
调用顺序为:
gEGLImpl[IMPL_HARDWARE].egl.eglChooseConfig(...)
gEGLImpl[IMPL_SOFTWARE].egl.eglChooseConfig(...)
原因: IMPL_HARDWARE=0; IMPL_SOFTWARE=1
参看:
enum {
IMPL_HARDWARE = 0,
IMPL_SOFTWARE,
IMPL_NUM_IMPLEMENTATIONS
};
2. 创建Surface和Context时, libs/EGL/egl.cpp是根据传入参数config来判断是调用软件还是
硬件加速API的, 而根据步骤1优先选择的缉硬件的config, 故创建Surface和Context是使用的
也是硬件加速的API。

[附录]:
struct egl_connection_t
{
void * dso;
gl_hooks_t * hooks[2];
EGLint major;
EGLint minor;
egl_t egl;
};

struct egl_t {
#include "EGL/egl_entries.in"
};

struct gl_hooks_t {
struct gl_t {
#include "entries.in"
} gl;
struct gl_ext_t {
void (*extensions[MAX_NUMBER_OF_GL_EXTENSIONS])(void);
} ext;
};

更多相关文章

  1. Android_异步加载1
  2. Android(安卓)WebView 详解
  3. Android中插件开发篇之----应用换肤原理解析
  4. x86平台编译Android
  5. Android有效加载图片 之 有效加载大图片
  6. Android(安卓)Launcher3修改应用图标,隐藏应用图标
  7. Android(安卓)multidex 使用 与 实现原理
  8. 布局优化:使用include、merge、ViewStub
  9. 编译android部分模块

随机推荐

  1. php实现post请求 接收android客户端json
  2. Android开发---xml布局文件中的常见属性
  3. 大厂面试秘籍—— 深入理解 Handler
  4. 《Android内核剖析》读书笔记 第18章 And
  5. Android(安卓)操作串口 (android serial
  6. Android实践之简易天气(二)
  7. Android(安卓)图像绘制之 Drawable
  8. Android系统定制和源码开发以及源码编译(
  9. Android(安卓)命名规范 (提高代码可以读性
  10. 做好准备,让你的短信应用迎接Android(安卓