Android OpenGL ES 分析与实践 (3)
来源:互联网 发布:有人gprs模块与单片机 编辑:程序博客网 时间:2024/06/05 05:07
3.4 OpenGL ES 执行过程
运行android操作系统之后,输入logcat命令,然后执行gltest中的test-opengl-tritex,屏幕上打印了以下信息
D/libEGL ( 1962): egl.cfg not found, using default config
D/libEGL ( 1962): loaded /system/lib/egl/libGLES_android.so
可以看出,在执行OpenGL调用的过程中,会自动加载libGLES_android.so动态链接库。后面将会通过分析和修改源码的方式,了解OpenGL ES系统的调用过程。
通过3.3中的说明,我们在tritex测试程序中插入一些调试信息,查看OpenGL ES的调用过程。
在调用eglGetDisplay之前会执行early_egl_init函数,这是一个静态的函数。
在eglGetDisplay中会去初始化驱动,最终调用到egl_init_drivers_locked函数中。这个函数的主要内容如下
EGLBoolean egl_init_drivers_locked()
{
if (sEarlyInitState) {
// initialized by static ctor. should be set here.
return EGL_FALSE;
}
// get our driver loader
Loader& loader(Loader::getInstance());
// dynamically load all our EGL implementations for all displays
// and retrieve the corresponding EGLDisplay
// if that fails, don't use this driver.
// TODO: currently we only deal with EGL_DEFAULT_DISPLAY
egl_connection_t* cnx;
egl_display_t* d = &gDisplay[0];
cnx = &gEGLImpl[IMPL_SOFTWARE];
if (cnx->dso == 0) {
cnx->hooks[GLESv1_INDEX] = &gHooks[GLESv1_INDEX][IMPL_SOFTWARE];
cnx->hooks[GLESv2_INDEX] = &gHooks[GLESv2_INDEX][IMPL_SOFTWARE];
cnx->dso = loader.open(EGL_DEFAULT_DISPLAY, 0, cnx);
if (cnx->dso) {
EGLDisplay dpy = cnx->egl.eglGetDisplay(EGL_DEFAULT_DISPLAY);
LOGE_IF(dpy==EGL_NO_DISPLAY, "No EGLDisplay for software EGL!");
d->disp[IMPL_SOFTWARE].dpy = dpy;
if (dpy == EGL_NO_DISPLAY) {
loader.close(cnx->dso);
cnx->dso = NULL;
}
}
}
cnx = &gEGLImpl[IMPL_HARDWARE];
if (cnx->dso == 0) {
char value[PROPERTY_VALUE_MAX];
property_get("debug.egl.hw", value, "1");
if (atoi(value) != 0) {
cnx->hooks[GLESv1_INDEX] = &gHooks[GLESv1_INDEX][IMPL_HARDWARE];
cnx->hooks[GLESv2_INDEX] = &gHooks[GLESv2_INDEX][IMPL_HARDWARE];
cnx->dso = loader.open(EGL_DEFAULT_DISPLAY, 1, cnx);
if (cnx->dso) {
EGLDisplay dpy = cnx->egl.eglGetDisplay(EGL_DEFAULT_DISPLAY);
LOGE_IF(dpy==EGL_NO_DISPLAY, "No EGLDisplay for hardware EGL!");
d->disp[IMPL_HARDWARE].dpy = dpy;
if (dpy == EGL_NO_DISPLAY) {
loader.close(cnx->dso);
cnx->dso = NULL;
}
}
} else {
LOGD("3D hardware acceleration is disabled");
}
}
if (!gEGLImpl[IMPL_SOFTWARE].dso && !gEGLImpl[IMPL_HARDWARE].dso) {
return EGL_FALSE;
}
return EGL_TRUE;
}
由此代码可以看出,egl_init_drivers_locked函数主要的工作就是填充gEGLImp数组变量,这个变量是egl_connection_t类型。还有一个工作就是填充gDisplay数组(只有一个元素)的disp[IMPL_HARDWARE].dpy以及disp[IMPLSOFTWAREWARE].dpy,填充的来源来自gEGLImpl【soft or hard】.egl.eglGetDisplay(EGL_DEFAULT_DISPLAY);
在Loader.cpp中的Loader::open中会加载对应的硬件和软件加速的驱动(动态链接库)。软件的对应的是/system/lib/egl/libEGL_android.so,没有默认的硬件so,因此在硬件加速时,返回值hnd会指向NULL,在需要硬件加速时这个动态链接库需要进行实现。
LoadDriver函数会根据其第三个参数,决定加载egl/gles,glesv1_cm,glesv2驱动。。。
加载几个动态链接库的过程如下图
- Android OpenGL ES 分析与实践 (3)
- Android OpenGL ES 分析与实践
- Android OpenGL ES 分析与实践
- Android OpenGL ES 分析与实践(1)
- Android OpenGL ES 分析与实践(2)
- Android OpenGL ES 分析与实践(4)
- Android OpenGL ES 分析与实践(5)
- Android OpenGL ES 分析与实践(6)
- Android OpenGL ES 分析与实践
- Android OpenGL ES 分析与实践
- Android OpenGL ES与EGL
- Android OpenGL ES与EGL
- Android OpenGL ES与EGL
- Android OpenGL ES与EGL
- [android] OpenGL与OpenGL ES简介
- OpenGL ES 纹理实践
- 3D----OpenGL与OpenGL ES
- Android OpenGL ES 开发教程(3):OpenGL ES管道(Pipeline)
- Objective-C中判断字符串是否包含其他字符串
- ORA-00257 archiver error. 错误的处理方法
- Android OpenGL ES 分析与实践(4)
- c/c++试题
- Android 获取坐标
- Android OpenGL ES 分析与实践 (3)
- Castle 系列:Castle DynamicProxy动态生成透明代理类型详解
- android 中bitmap 缩放和阴影效果
- Java学习之路
- 服务器处理能力,你估算正确过吗?
- linux下查找某个文件位置的方法
- 第十周实验报告(二)
- Phone界面上文本框UITextField的软键盘隐藏和移动键盘下面的内容和限制字数
- PL/SQL导出sql脚本