设为首页 加入收藏

TOP

Android 图形系统加速学习系列(二)
2014-11-24 14:36:54 来源: 作者: 【 】 浏览:8
Tags:Android 图形 系统 加速 学习 系列
应的OpenGL ES API的地址去执行。这个地方为什么会跳过去呢??因为从线程局部存储保存的线程指针,指向了一个gl_hooks_t指针,而这个指针指向的结构体里的成员已经在EGL中被初始化为了libGLES_android.so里的函数地址了。所以就可以跳过去了。



那么在哪里初始化gl_hooks_t指针的呢? (frameworks\base\opengl\libs\EGL\Loader.cpp)


FILE* cfg = fopen("/system/lib/egl/egl.cfg", "r");
if (cfg == NULL) { // 如果找不到这个配置则默认加载软件3D库即 libGLES_android.so
// default config
LOGD("egl.cfg not found, using default config");
gConfig.add( entry_t(0, 0, "android") );
}


否则根据配置文件加载硬件3D库,egl.cfg 文件格式是“dpy impl tag”比如自己添加的硬件加速库是libGLES_mali.so,则需要在此文件里这样编写
0 1 mali


修改后要重启才可生效。


加载就是利用dlopen、dlsym加载并赋值:


void* dso = dlopen(driver_absolute_path, RTLD_NOW | RTLD_LOCAL);


char const * const * api = egl_names;
while (*api) {
char const * name = *api;
__eglMustCastToProperFunctionPointerType f =
(__eglMustCastToProperFunctionPointerType)dlsym(dso, name);
if (f == NULL) {
// couldn't find the entry-point, use eglGetProcAddress()
f = getProcAddress(name);
if (f == NULL) {
f = (__eglMustCastToProperFunctionPointerType)0;
}
}
*curr++ = f;
api++;
}


char const * const gl_names[] = {
#include "entries.in"
NULL
};


char const * const egl_names[] = {
#include "egl_entries.in"
NULL
};


这里面包含的函数头文件在:gl2_api.in 及 gl_api.in 中对应于不同的版本,对应用C头文件接口是: include/RGL/egl.h 及


include\GLES\中的gl.h和glext.h,这些接口供外部调用OpenGL本库所使用接口,这些接口基本上和OpenGL标准接口一致。


#include
#include



#include
#include



插一句如何知道哪些OpenGL函数没有实现呢?


在init_api函数添加打印即可知道哪些函数没有实现:


if (f == NULL) {
//LOGD("%s", name);
f = (__eglMustCastToProperFunctionPointerType)gl_unimplemented;
}
最麻烦的事情也就是实现以上两个头文件,扩展OpenGl函数最好不要使用,需要进行GPU编程,一般由芯片公司提供。



目前手机上使用最广范的GPU CORE当属 Imagination Technologies 公司开发的 PowerVR graphics core


ARM公司收购的 Falanx公司提供 Mali, Mali-200, Mali-400


Vivante公司提供的 GPU core


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android 2.3 ADB源码分析 下一篇Android Home键详解

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: