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
。