现在的位置: 首页 > 综合 > 正文

Android系统2D/3D硬件加速分析报告

2013年09月04日 ⁄ 综合 ⁄ 共 1985字 ⁄ 字号 评论关闭

1
.前言:

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

的加速功能。

2

Android
系统硬件加速流程:

frameworks/base/opengl/libs/EGL/egl.cpp
文件中通过
egl_init_drivers() ->

egl_init_drivers_locked()
调用定义在
frameworks/base/opengl/libs/EGL/Loader.c
文件中的
loader::open
函数打开软件和硬件
EGL
加速驱动。
frameworks/base/opengl/libs/EGL/Loader.c

文件中,通过
Loader::Loader()
函数打开硬件加速配置文件
/system/lib/egl/egl.cfg
,并赋给
dpy

impl

tag
三个变量,如果硬件加速配置文件
/system/lib/egl/egl.cfg
不存在,则
dpy=0

impl=0

tag=android
,因此
Loader::open()
函数中通过获取该
dpy

impl

tag
来决定加载默认的软件加速动态库
/system/lib/egl/libGLES_android.so
中的
EGL

GLESv1_CM

GLESv2
三个部分的函数,如果加载成功则
new
一个
driver_t
架构,并用加载的函数进行初始化。本文研究的系统中存在
/system/lib/egl/egl.cfg
文件,其格式为
0 1 sxwboy
,因此
dpy=0

impl=1

tag=sxwboy

Loader::open()
函数中通过获取该
dpy

impl

tag
来决定是否加载硬件加速动态库
/system/lib/egl/libGLES_sxwboy.so
中的
EGL

GLESv1_CM

GLESv2
三个部分的函数,如果加载成功则
new
一个
driver_t
架构,并用加载的函数进行初始化;如果加载失败则分别加载
/system/lib/egl/libEGL_sxwboy.so

/system/lib/egl/libGLESv1_CM_sxwboy.so

/system/lib/egl/libGLESv2_sxwboy.so
三个动态库中相应的函数。

注:
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
硬件加速。

3
.仅
2D
硬件加速:

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

      

注:并不是所有代码都使用了封装好的
copybit
,也并不是仅有
opengl
能够使用
copybit
模块。如:
libagl/egl.cpp
文件中有个
copyBIt
函数直接用了
copybit

blit

frameworks/base/libs/surfaceflinger/Layerbuffer.cpp
文件中
LayerBuffer::BufferSource::onDraw()
函数直接用了
copybit

set_parameter

LayerBuffer::onFirstRef()
函数也直接打开了
copybit
模块。

4

2D/3D
硬件加速均需要:

      

需研究
opengl
es

,并实现
/system/lib/egl/libGLES_sxwboy.so或者
/system/lib/egl/libEGL_sxwboy.so

/system/lib/egl/libGLESv1_CM_sxwboy.so

/system/lib/egl/libGLESv2_sxwboy.so
动态库来提供
openGL ES 2D/3D
硬件加速
API

抱歉!评论已关闭.