android opengl函数库之间的关系

2023-11-01

EGL/目录生成libEGL.so
eglApi.cpp eglGetDisplay()触发loader加载libEGL_xxx.so,libGLESv1_CM_xxx.so,libGLESv2_xxx.so
或者libGLES_android.so,从中取出EGL和GLES函数的地址,注册到
struct egl_connection_t
{
    inline egl_connection_t() : dso(0) { }
    void *              dso;
    gl_hooks_t *        hooks[2];//gles函数指针数组 v1和v2
    EGLint              major;
    EGLint              minor;
    egl_t               egl;//egl函数指针数组
};
有两个egl_connection_t
gEGLImpl[IMPL_SOFTWARE]
gEGLImpl[IMPL_HARDWARE]

应用调用Egl函数调用libEGL.so中的eglApi.cpp中的函数,进而调用到egl_connection_t:egl中注册的函数。

GLES_CM/目录生成libGLESv1_CM.so
GLES2/目录生成libGLESv2.so

应用调用GLES相关的api对调用到libGLESv1_CM.so/libGLESv2.so中的函数,gl.cpp/gl2.cpp中会根据threadprivate
变量找到对应的egl_connection_t,从而查找到hooks中注册的函数。

----------------------------------------

libEGL.so,libGLESv1_CM.so,libGLESv2.so是opengl对外的接口。

libGLESv1_CM.so,libGLESv2.so是绘制api,其通过查找hook表调用相应的程序,这个表通过
getGlThreadSpecific拿到,表中的函数指针是libEGL.so中初始化的。

软件的opengl实现库为libGLES_android.so,其中目前实现了egl和opengl1.1
硬件的通常对应三个文件,如libEGL_adreno200.so,libGLESv1_CM_adreno200.so,libGLESv2_adreno200.so

libEGL.so是适配层,应用调用egl的api,初始化一个session,libEGL.so可以根据client的请求参数和egl.cfg配置文件,打开相应的动态库(软件的或者硬件的),从中获得相应api的指针,初始化hook数组。

status_t EGLUtils::selectConfigForPixelFormat(
        EGLDisplay dpy,
        EGLint const* attrs,
        PixelFormat format,
        EGLConfig* outConfig)
{
    EGLint numConfigs = -1, n=0;

    if (!attrs)
        return BAD_VALUE;

    if (outConfig == NULL)
        return BAD_VALUE;
    
    // Get all the "potential match" configs...
    if (eglGetConfigs(dpy, NULL, 0, &numConfigs) == EGL_FALSE)
        return BAD_VALUE;

    EGLConfig* const configs = (EGLConfig*)malloc(sizeof(EGLConfig)*numConfigs);
    if (eglChooseConfig(dpy, attrs, configs, numConfigs, &n) == EGL_FALSE) {
        free(configs);
        return BAD_VALUE;
    }
    
    int i;
    EGLConfig config = NULL;
    for (i=0 ; i<n ; i++) {
        EGLint nativeVisualId = 0;
        eglGetConfigAttrib(dpy, configs[i], EGL_NATIVE_VISUAL_ID, &nativeVisualId);
        if (nativeVisualId>0 && format == nativeVisualId) {
            config = configs[i];
            break;
        }
    }

    free(configs);
    
    if (i<n) {
        *outConfig = config;
        return NO_ERROR;
    }

    return NAME_NOT_FOUND;
}


软件实现库libGLES_android.so调用libpixelflinger.so来进行底层的绘制操作。

EGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list,
                            EGLConfig *configs, EGLint config_size,
                            EGLint *num_config)

。。。

    for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
        egl_connection_t* const cnx = &gEGLImpl[i];
        if (cnx->dso) {
            if (cnx->egl.eglChooseConfig(
                    dp->disp[i].dpy, attrib_list, configs, config_size, &n)) {
                if (configs) {
                    // now we need to convert these client EGLConfig to our
                    // internal EGLConfig format.
                    // This is done in O(n Log(n)) time.
                    for (int j=0 ; j<n ; j++) {
                        egl_config_t key(i, configs[j]);
                        intptr_t index = binarySearch<egl_config_t>(
                                dp->configs, 0, dp->numTotalConfigs, key);
                        if (index >= 0) {
                            configs[j] = EGLConfig(index);
                        } else {
                            return setError(EGL_BAD_CONFIG, EGL_FALSE);
                        }
                    }
                    configs += n;
                    config_size -= n;
                }
                *num_config += n;
                res = EGL_TRUE;
            }
        }
    }

同一个dpy可能支持两种实现,gEGLImpl[IMPL_SOFTWARE],gEGLImpl[IMPL_HARDWARE]

分别查询这两种实现支持的config,硬件优先

。。。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android opengl函数库之间的关系 的相关文章

  • Android - 如何以编程方式定义 ShapeDrawables?

    我想要实现的是使用内部有几个层的 Drawable 但在运行时控制一些值 例如渐变的 startColor 这是 my layered shape xml 中的内容
  • 如何在Eclipse调试器中查看崩溃原因

    按照这个 Android 教程 http developer android com resources tutorials hello world html http developer android com resources tut
  • Android 使用键盘上的“完成”按钮来单击按钮

    好的 在我的应用程序中 我有一个供用户输入数字的字段 我已将该字段设置为仅接受数字 当用户单击该字段时 它会弹出键盘 键盘 ICS 上 上有一个完成按钮 我希望键盘上的完成按钮能够触发我的应用程序中的提交按钮 我的代码如下 package
  • 如何在每个项目的列表视图中实现简单的点赞按钮

    我的列表视图项目中有某些条目 我有一个简单的 喜欢按钮 不是像 Facebook 的按钮 您可以看到上面提到的屏幕截图 供参考 当我点击 喜欢 按钮的那一刻 我希望更改 喜欢 按钮的颜色 并且 喜欢 按钮的颜色应保持不变 改变了喜欢 当我再
  • 如何在 Kotlin 中获取可绘制对象?

    I am working on a small project in Android Studio I have drawable added to res drawable folder 但是我无法从代码中获取它 我尝试过不同的方法 Co
  • android java.lang.OutOfMemoryError 错误

    当我从网站下载大数据时 我收到以下错误信息 I global 20094 Default buffer size used in BufferedInputStream constructor It would be better to b
  • Jetpack Compose 预览未显示

    我似乎在撰写预览时遇到问题 当我使用 preview 注释撰写方法时 布局面板不会出现 我假设我缺少依赖项 但我已从此处复制并粘贴了代码https developer android com jetpack compose setup ht
  • 如何在 Android 中正确设置 google play 登录?

    我在安卓上开发了一个游戏 我尝试实现 GooglePlay SignIn 但显示错误 我无法调试此错误 我尝试在模拟器以外的不同手机型号中安装该应用程序 Code public void startSignInIntent startAct
  • 使用选项卡的应用程序崩溃

    我正在构建一个使用选项卡实现蓝牙 Wifi 电话和短信的应用程序 MainActivity java 文件如下所示 package com example servicesdemo import android os Bundle impo
  • 尝试在 Android Studio 上运行单元测试时出现 NoClassDefFoundError

    我正在尝试为我的 Android 应用程序创建一些简单的测试 但在运行测试时遇到了问题 当我尝试运行测试时 我不断收到 NoClassDefFound 错误 但我似乎无法弄清楚其原因是什么 如果我能有一双新的眼睛来看待这个问题 我将不胜感激
  • 如何在 Android 上将 ISO 8601 字符串解析为 Java 日期 [重复]

    这个问题在这里已经有答案了 我正在 Android 上创建一个与服务器通信的应用程序 该服务器给我返回了一个ISO 8601 http en wikipedia org wiki ISO 8601日期字符串 如下所示 2014 11 21
  • Geo Fix 在 Android SDK 2.2 中不起作用

    我正在尝试测试 Android 应用程序 我需要发送模拟位置来测试这一点 我已经注册了 requestlocation update 方法 如下 locationManager requestLocationUpdates bestProv
  • WindowsFromDc 返回 null

    我需要一些有关 win32 api 特别是 WindowsFromDc 的帮助 我有一个应用程序挂钩另一个应用程序 这两个应用程序通过 NamedPipe 进行通信 在第二个应用程序中 我挂钩了 DrawTextExW 函数 并从该函数中获
  • Google App Engine 的示例 Android 应用程序,抛出异常

    我的 GAE 示例 Android 应用程序直到昨天都工作正常 除了在 Consts java 中添加了我的项目 ID 之外 我没有对客户端应用程序进行任何更改 现在每次我尝试插入 我的意思是发送消息 时都会抛出以下异常 06 06 09
  • Android avd 管理器根本不工作 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我最近想尝试创建一个 Android
  • Android:如何从我的主要活动中调用 findPreference()?

    我正在处理 Android 应用程序的首选项屏幕 如果前一项具有特定值 我想禁用 将其灰显 一项 我已经实现了两个类 MainActivity 和 PreferencesActivity 在 MainActivity 中我这样做 publi
  • 发布 apk 中的“来源不明”

    我的调试 APK 中的所有内容都运行良好 但是 当我导出 APK 并安装它时 一切正常 直到我调用引用的库 E AndroidRuntime 32571 at com znood znoodapp ShowResultsActivity a
  • 在 Jetpack compose 中使用 ModalDrawer 从右向左打开导航抽屉

    我一直在尝试在 Jetpack compose 中实现导航抽屉 以下代码显示了一种简单的方法 Composable fun ModalDrawerSample val drawerState rememberDrawerState Draw
  • Android Path addArc 在canvas中两点之间

    我正在尝试在 android 中绘制弧线 在IOS中 用这个方法确实很简单 path addArcWithCenter radius startAngle endAngle clockwise 在android中 我有3个点 我的圆的中心
  • 刷新 ArrayAdapter onResume [notifyDataSetChanged() 不起作用]

    我正在使用片段创建一个联系人列表应用程序 其中一个片段是联系人列表中的姓名列表 另一个是其余详细信息 这是显示名称列表的类 public class MyListFragment extends ListFragment private C

随机推荐

  • 02 Oracle 批量导出建表语句和数据

    1 点击 工具 导出表 2 点击SQL插入 然后选中要导出的表 如果不选择表则导出全部表 选择导出文件的位置 点击导出 转载于 https www cnblogs com xiaonengxiong p 11514575 html
  • Console输出时报log4j警告解决办法

    log4j WARN Please initialize the log4j system properly org springframework context support ClassPathXmlApplicationContex
  • Spring动态代理的两种方式

    Spring动态代理的两种方式 1 Spring创建的动态代理类在哪 1 1 什么叫动态字节码技术 2 JDK的动态代理 2 1 Proxy newProxyInstance 法参数详解 2 1 编码 3 CGlib的动态代理 3 1 编码
  • 浏览器地址栏输入一个网址到页面展示网页内容的这段时间内,浏览器和服务器都发生了什么事情?

    1 在接受到用户输入的网址后 浏览器会开启一个线程来处理这个请求 对用户输入的URL地址进行分析判断 如果是HTTP协议就按照HTTP方式来处理 2 调用浏览器引擎中的对应方法 比如WebView中的loadUrl方法 分析并加载这个URL
  • UE5 添加插件

    1 编辑 gt 插件 gt 添加 2 选择插件类型 输入插件名称 设置插件目录 点击 创建插件 3 在工程目录下生成Plugins目录 而且在Plugins目录下生成各个插件的目录
  • 爽,我终于掌握了selenium图片滑块验证码

    因为种种原因没能实现愿景的目标 在这里记录一下中间结果 也算是一个收场吧 这篇文章主要是用selenium解决滑块验证码的个别案列 思路 用selenium打开浏览器指定网站 将残缺块图片和背景图片下载到本地 对比两张图片的相似地方 计算要
  • typeScript中tsconfig.json无故报错

    报错 原因 是由于该文件的同级目录下 没有ts文件 所以会报这种类似于语法错误的 只要在同级下创建一个ts文件即可
  • 回调函数的用法和好处

    回调函数的用法和好处 2009 07 01 18 19 Agzer0 分类 其他编程语言 浏览7080次 1 回调函数的功能是什么 有什么好处 有没有坏处 2 可以的话请编写一个简答的回调函数 看看怎样调用实现的 WndProc里面的不算
  • 数据结构2.4.1顺序队列

    include
  • [1] quick-cocos2d-x 介绍

    quick cocos2d x 是一个可以让您觉得 爽快 的 cocos2d x 的扩展版 基于 cocos2d x 完全的跨平台能力 优异的性能和可靠性 而 quick cocos2d x 在这一切的基础上 添加了完善的 Lua 脚本语言
  • MySQL基础语法--(标量子查询,列子查询,行子查询)

    概念 出现在其他语句内部的SELECT 语句 可以理解为嵌套在一个查询语句中的另外一个SELECT的查询语句 外部查询语句称为主查询或者外查询 分类 按照子查询出现的位置 select 后面 FROM 后面支持表子查询 WHERE 或HAV
  • C语言注释风格(函数、功能、输入、输出、返回)

    C语言编程规范 注释 规则 1 一般情况下 源程序有效注释量必须在20 以上 说明 注释的原则是有助于对程序的阅读理解 在该加的地方都加了 注释不宜太多也不能太少 注释语言必须准确 易懂 简洁 2 说明性文件 如头文件 h文件 inc文件
  • dubbo整合nacos

    文章目录 前言 一 搭建工程框架 新建maven空工程作为父工程 新建服务提供者provider模块 新建消费者 consumer模块 新建公共接口interface模块 二 各模块代码 2 1服务提供者 boot user service
  • 【Linux命令-shell】案例练习:进度条、菜单选择、fork炸弹

    目录 1 进度条 2 菜单选择 3 fork炸弹 1 进度条 progress sh文件内容如下 bin bash bar while do echo en 033 42m 033 0m en是不换行 42m是背景色 sleep 0 5 间
  • 闪烁星空背景(html/css)

    效果视频 starts 源码
  • 无需外设实现电脑远程开机

    所谓的远程开机本质上就是触发电脑电源的断电 通电功能 台式机 笔记本都是同样的道理 向日葵等远程软件的什么智能插拔 某某棒等本质上就是这个原理 并没有特殊功能 就是借助BIOS自身的功能 实现通断电触发开机 没必要花那个冤枉钱 开机原理 电
  • python爬虫网络请求超时_python爬虫多次请求超时的几种重试方法

    第一种方法 headers Dict url https www baidu com try proxies None response requests get url headers headers verify False proxi
  • Checklist设计编写规范及模板

    一 编写CHECK LIST的目的 1 保障所有的测试面都考虑到并被记录 与无线相关的接口要考虑到无线 联动优势的退款要考虑到断账日前后 2 保障TESTCASE已经覆盖所有的测试主体 3 提高TESTCASE的REVIEW通过率 二 CH
  • 用rust写一个玩具解释器2(lexer)

    词法分析器 输入 由字符 ASCII码 组成的字符串 输出 token 任务 读取输入 并且按规则输出token token 想简单点 就是一个字符串和它的类型 比如说关键字 变量名 非法字符串 所以说我们现在需要 read char sk
  • android opengl函数库之间的关系

    EGL 目录生成libEGL so eglApi cpp eglGetDisplay 触发loader加载libEGL xxx so libGLESv1 CM xxx so libGLESv2 xxx so 或者libGLES androi