1.前言:
如果处理器只有 2D 硬件加速而没有 3D 硬件加速,则可以利用 opengl 中的 libagl ,实现封装在 libagl 里的 copybit ,因为相对 3D API 来说,这个模块的封装 google 基本是做好的,只要去实现一个 copybit HAL 即可;如果处理器 2D/3D 硬件加速均有,那么可以丢开 copybit ,去实现 openGLES 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硬件加速均需要:
需研究 opengles ,并实现 /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 。
转自http://blogold.chinaunix.net/u2/89569/showart_2359581.html
如果处理器只有 2D 硬件加速而没有 3D 硬件加速,则可以利用 opengl 中的 libagl ,实现封装在 libagl 里的 copybit ,因为相对 3D API 来说,这个模块的封装 google 基本是做好的,只要去实现一个 copybit HAL 即可;如果处理器 2D/3D 硬件加速均有,那么可以丢开 copybit ,去实现 openGLES 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硬件加速均需要:
需研究 opengles ,并实现 /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 。
转自http://blogold.chinaunix.net/u2/89569/showart_2359581.html