Android环境下Mesa初始化流程重学习之eglCreateContext

news2024/10/6 22:19:56

Mesa初始化流程重学习之eglCreateContext


引言

没有啥好说的了,直接上手撸代码!总得找点事情干不是!我打工我快乐!我奋斗,我快乐!



一. 核心结构体之间的关联



在这里插入图片描述



二. eglCreateContext流程分析

eglCreateContext(...)//src/egl/main/eglapi.c
    _EGLContext *context;
        context = disp->Driver->CreateContext(disp, conf, share, attrib_list)//这里的Driver指向_eglDriver,定义在egl_dri2.c中
            dri2_create_context(...)//Called via eglCreateContext(), drv->CreateContext()
                struct dri2_egl_context *dri2_ctx;
                dri2_ctx = malloc(sizeof *dri2_ctx)
                dri2_ctx->dri_context = dri2_dpy->image_driver->createContextAttribs(...)//image_driver指向driImageDriverExtension,实现在dri_util.c中,指向driCreateContextAttribs
                return &dri2_ctx->base;
                
 
                
driCreateContextAttribs(...) //src/gallium/frontends/dri/dri_util.c
    __DRIcontext *context;
    context = calloc(1, sizeof *context);
    context->driScreenPriv = screen;//__DRIscreen *screen
    dri_create_context(...)//src/gallium/frontends/dri/dri_context.c
           __DRIscreen *sPriv = cPriv->driScreenPriv;
            struct dri_screen *screen = dri_screen(sPriv);
            struct dri_context *ctx = NULL;        
            ctx = CALLOC_STRUCT(dri_context);    
            cPriv->driverPrivate = ctx;//这个关系,后面必须通过关系图画出来
            ctx->cPriv = cPriv;
            ctx->sPriv = sPriv;
            ctx->st = st_api_create_context(&screen->base, &attribs, &ctx_err,
				   st_share);
            ctx->st->st_manager_private = (void *) ctx;
            
            
st_api_create_context(...) //src/mesa/state_tracker/st_manager.c
   struct st_context *st;
   struct pipe_context *pipe;
   pipe = smapi->screen->context_create(smapi->screen, NULL, ctx_flags);//详见章节2.1
   st = st_create_context(api, pipe, mode_ptr, shared_ctx,
                          &attribs->options, no_error,
                          !!smapi->validate_egl_image);//详见章节2.2
   return &st->iface;

            

2.1 smapi->screen->context_create的实现

这块我们在前面分析时,已经提到过了。在vendor里面会进行赋值,如下:

struct pipe_screen *
xxx_gpu_create_screen(struct xxx_gpu_winsys *winsys)
{
   struct xxx_gpu_screen *screen = CALLOC_STRUCT(xxx_gpu_screen);

   if (!screen)
      return NULL;

   screen->ws = winsys;

   screen->base.get_name             = xxx_gpu_get_name;
   screen->base.get_vendor           = xxx_gpu_get_vendor;
   screen->base.get_device_vendor    = xxx_gpu_get_device_vendor;

   screen->base.get_param            = xxx_gpu_get_param;
   screen->base.get_paramf           = xxx_gpu_get_paramf;
   screen->base.get_shader_param     = xxx_gpu_get_shader_param;
   screen->base.get_compute_param    = xxx_gpu_get_compute_param;
   screen->base.get_compiler_options = xxx_gpu_get_compiler_options;
   screen->base.is_format_supported  = xxx_gpu_is_format_supported;

   screen->base.get_timestamp   = xxx_gpu_get_timestamp;

   screen->base.context_create  = xxx_gpu_context_create;
   screen->base.destroy         = xxx_gpu_destroy_screen;

   screen->base.fence_reference = xxx_gpu_fence_reference;
   screen->base.fence_finish    = xxx_gpu_fence_finish;
   screen->base.fence_get_fd    = xxx_gpu_fence_get_fd;

   xxx_gpu_screen_resource_init(&screen->base);

   slab_create_parent(&screen->transfer_pool, sizeof(struct xxx_gpu_transfer), 16);

   glsl_type_singleton_init_or_ref();

   return &screen->base;
}


2.2 st_create_context的实现

接着继续往下看:

xxx_gpu_create_screen(...)//src/gallium/drivers/xxx_gpu/xxx_gpu_screen.c
    screen->base.context_create  = xxx_gpu_context_create;

xxx_gpu_context_create(...)//src/gallium/drivers/xxx_gpu/xxx_gpu_context.c
   struct xxx_gpu_screen *screen = xxx_gpu_screen(pscreen);
   struct xxx_gpu_context *ctx = CALLOC_STRUCT(xxx_gpu_context);
   ctx->base.screen = pscreen;
   ctx->base.priv = priv;

   ctx->ws = screen->ws;
   ...
   ctx->base.flush = xxx_gpu_flush;
   ...

我们接着继续分析_mesa_initialize_context

_mesa_initialize_context

_mesa_initialize_context(...)//src/mesa/main/context.c
    ctx->Driver = *driverFunctions;
    /* setup the API dispatch tables with all nop functions */
    ctx->OutsideBeginEnd = _mesa_alloc_dispatch_table(false);
        _mesa_alloc_dispatch_table(...)//src/mesa/main/context.c
            struct _glapi_table *table = _mesa_new_nop_table(numEntries, glthread)//和gl_dispatch分发有关
                    struct _glapi_table *
                    _mesa_new_nop_table(unsigned numEntries, bool glthread)
                    {
                        struct _glapi_table *table;
                        table = _glapi_new_nop_table(numEntries);
                        return table;
                    }            
            return table;
            
            
 _glapi_table *_glapi_new_nop_table(...)//src/mapi/mapi_glapi.c
    struct _glapi_table *table;
    table = malloc(num_entries * sizeof(mapi_func));
    memcpy(table, table_noop_array, num_entries * sizeof(mapi_func));
    return table
            

//build-android-aarch64/src/mapi/shared-glapi/glapi_mapi_tmp.h   
static void APIENTRY noopFlush(void)
{
      noop_warn("glFlush");
}
const mapi_func table_noop_array[] = {
    ...
    (mapi_func) noopFlush,
    ...
}
            

我们接着继续分析st_create_context_priv

st_create_context_priv

st_create_context_priv(...)//src/mesa/state_tracker/st_context.c
   struct pipe_screen *screen = pipe->screen;
   struct st_context *st = CALLOC_STRUCT( st_context);    
   ctx->st = st;
   st->ctx = ctx;
   st->screen = screen;
   st->pipe = pipe;   
   _mesa_initialize_dispatch_tables(ctx);
   
 
 _mesa_initialize_dispatch_tables(...) //src/mesa/main/context.c
    _mesa_init_dispatch(ctx)//build-android-aarch64/src/mapi/glapi/gen/api_exec_init.cZ这个是构建完成以后生成的
    struct _glapi_table *table = ctx->OutsideBeginEnd;//还记得这个地方是怎么被赋值的吗
    SET_Flush(table, _mesa_Flush);//我们以这个实现来进行举例说明
    
// build-android-arm/src/mesa/main/dispatch.h   
#define SET_Flush(disp, func) do { \
   void (GLAPIENTRYP fn)(void) = func; \
   SET_by_offset(disp, _gloffset_Flush, fn); \
} while (0)  


#define SET_by_offset(disp, offset, fn) \
    do { \
        if ( (offset) < 0 ) { \
            /* fprintf( stderr, "[%s:%u] SET_by_offset(%p, %d, %s)!\n", */ \
            /*         __func__, __LINE__, disp, offset, # fn); */ \
            /* abort(); */ \
        } \
        else { \
            ( (_glapi_proc *) (disp) )[offset] = (_glapi_proc) fn; \
        } \
    } while(0)
   

这里的核心是_glapi_table,它在前面已经被初始化了!



mesa 调试 —— 运行时函数栈的打印
Mesa GL Dispatch
mesa调用主线分析与理解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1707436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb_SpringBootWeb

先通过一个小练习简单了解以下SpringBootWeb。 小练习&#xff1a; 需求&#xff1a;使用SpringBoot开发一个Web应用&#xff0c;浏览器发起请求/hello后&#xff0c;给浏览器返回字符串"Hello World~"。 步骤&#xff1a; 1.创建SpringBoot项目&#xff0c;勾选We…

杨若歆发布最新单曲《迷雾之谜》从啦啦女神到音乐新星的华丽转身

5月28日&#xff0c;台北——杨若歆&#xff0c;这位被粉丝封为"啦啦女神"的多才多艺艺人&#xff0c;近日推出了她的最新单曲《迷雾之谜》&#xff0c;这首歌曲以其空灵的旋律和杨若歆独特的高音&#xff0c;迅速在歌迷中引起了热烈的反响。 杨若歆&#xff0c;身高…

【算法】递归、搜索与回溯——汉诺塔

题解&#xff1a;汉诺塔(递归、搜索与回溯算法) 目录 1.题目2.题目背景(拓展了解)3.题解4.参考代码5.细节6.总结 1.题目 题目链接&#xff1a;LINK 2.题目背景(拓展了解) 汉诺塔问题是一个通过隐式使用递归栈来进行实现的一个经典问题&#xff0c;该问题最早的发明人是法国…

linux系统——bg命令,linux运行的级别

在linux中可以使用bg命令&#xff0c;将进程任务置于后台执行 在这里&#xff0c;使用ping www.baidu.com命令后再使用ctrlz&#xff0c;可以将命令先暂停并保留在后台&#xff0c;jobs可以对任务进行查看 使用runlevel可以查看系统当前的运行级别

解决npm卡死,无法安装依赖

npm卡死&#xff0c;无法安装依赖 异常描述原因分析与解决方法 异常描述 1.无法进入命令行&#xff0c;或是很慢没反应 2.装表格无限滚动的el-table-infinite-scroll依赖一上午了&#xff0c;也不能装&#xff0c;报错提示 原因分析与解决方法 1.命令行的问题&#xff1a;缓…

【头歌】计算机网络DHCP服务器配置第二关access口配置答案

头歌计算机网络DHCP服务器配置第二关access口配置操作步骤 任务描述 本关任务&#xff1a;创建 vlan &#xff0c;并且将与 pc 机相连接口划分 vlan 。 操作要求 在第一关的拓扑图的基础上&#xff0c;配置交换机&#xff0c;具体要求如下&#xff1a; 1、在特权模式下进入 vla…

开源VS闭源:谁更能推动AI技术的普及与发展?

一、引言 在人工智能&#xff08;AI&#xff09;技术的浪潮中&#xff0c;开源与闭源两种模式一直并存&#xff0c;并各自在推动AI技术普及与发展上发挥着重要作用。然而&#xff0c;关于哪种模式更能有效地推动AI技术的普及与发展&#xff0c;一直存在着激烈的讨论。本文将深…

【前端工程化指南】Git常见操作之协作相关操作

获取远程仓库的更新 我们可以使用 git fetch 或者 git pull 两个命令从远程仓库获取最新的提交和分支信息&#xff0c;两者区别如下&#xff1a; git fetch&#xff1a;该命令将远程仓库的最新更改下载到本地&#xff0c;但不会自动合并到当前分支。你可以随后使用其他命令&a…

电子围栏(地理围栏)设计逻辑

做完整的项目时需要考虑安全问题&#xff0c;判断车辆在不该出现的位置出现时自动刹车。 只能说可以有吧。 地理围栏的概念 自动驾驶地理围栏是指在自动驾驶系统中定义的一种虚拟边界&#xff0c;用于限制车辆的运行范围。地理围栏可以通过全球定位系统&#xff08;GPS&#…

超详细Lambda表达式与Stream流及Maven环境搭配

目录 1.什么是Lambda表达式 2.为什么使用Lambda表达式 3.Lambda表达式语法 4.语法糖 5.Stream流 5.1stream流是什么 特点 5.2为什么要用Stream 5.3Stream流中的静态方法 6.Maven(项目编译打包软件) 6.1什么是Maven 6.2为什么要使用Maven 6.3Maven 中的相关概念 6.…

Android应用开发之AndroidManifest.xml

一.AndroidManifest.xml介绍 1.定义 AndroidManifest官方解释是应用清单&#xff08;manifest意思是货单&#xff09;&#xff0c;每个应用的根目录中都必须包含一个&#xff0c;并且文件名必须一模一样。 它是Android程序的全局配置文件&#xff0c;是每个 android程序中必须…

Java入门基础学习笔记45——String使用的注意事项

String使用时的注意事项&#xff1a; 1&#xff09;String对象的内容不可改变&#xff0c;被称为不可变字符串对象。 Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings. Because String objects are im…

最新百度专用站群seo官网程序源码二级泛程序

发布站专用站群SEO推广网站源码支持泛解析无限扩张功能&#xff1a; 1、支持伪静态功能&#xff0c;减少生成静态页增加网站内容&#xff0c;比动态网站更有利于网站收录。 2、支持百度seo优化效果&#xff0c;主动提交百度收录&#xff0c;可生成sitemap.xml文件提交百度减少…

企业内网终端监控管理软件有哪些?推荐4款企业终端监控管理软件

企业内网终端监控管理软件是一种专为企业内部网络设计的安全与管理工具&#xff0c;旨在帮助企业管理、监控和保护其内部网络中的各种终端设备&#xff0c;如个人电脑、笔记本、移动设备等。 这类软件的主要功能包括但不限于以下几个方面&#xff1a; 1&#xff0c;实时监控&a…

总结常见漏洞的代码审计方法

前言 这篇文章主要是总结一下在安全工作中常见漏洞的代码审计方法&#xff0c;以及修复方案&#xff0c;希望能对初学代码审计小伙伴们有所帮助&#xff0c;笔芯♥️ 代码审计的思路 通常做代码审计都是检查敏感函数的参数&#xff0c;然后回溯变量&#xff0c;判断变量是否可…

探索Solana链上DApp开发:高性能区块链生态的新机遇

Solana 是一个新兴的区块链平台&#xff0c;致力于为 DApp&#xff08;去中心化应用程序&#xff09;开发者提供高性能、低成本的解决方案。Solana 的独特之处在于其创新性的共识机制和高吞吐量的网络&#xff0c;使得开发者可以构建高度可扩展的 DApp&#xff0c;并为用户提供…

如何在Python 中如何导入和引用外部文件(Colab VS Code)

1. 上传文件 在 Google Colab 中&#xff0c;从左侧界面的文件选项中使用 "Upload" 按钮上传文件。 在 VS Code 中&#xff0c;通过菜单栏中的 "File" -> "Open File/Folder" 选项上传文件&#xff08;建议将所有文件放入一个文件夹中&#…

Linux--进程间通信(2)(有名管道)

目录 1.原理 2.创建命名管道 3.使用命名通道实现简单的通信 4.使用创建的命名管道 1.原理 匿名管道没有名称&#xff0c;它们是通过句柄在父进程和子进程之间传递的。这意味着匿名管道只能用于具有父子关系的进程之间。 但如果程序之间没关系&#xff0c;那么这时候就要用…

向传音手机学习产品市场定位与产品需求定义

2024 年第一季度全球智能手机发货量同比增长 11%&#xff0c;排在第一名的是三星&#xff0c;占比 21%&#xff0c;苹果占比 17% 排在第二位&#xff0c;小米 14%排在第三名&#xff0c;传音手机10% 排在第四位&#xff0c;OPPO为 9% 排在第五名。 「非洲之王」传音手机表现十…

增强创作者能力:The Sandbox 首届 “创作者挑战” 回顾

首届 "创作者挑战" 为创作者在平台上赚取收入提供了难得机会。 我们发起 “创作者挑战” 的目的是支持创作者&#xff0c;赋予他们构建元宇宙的能力。我们提出三大行动号召&#xff1a;发布、参与和赚钱。新推出的「参与奖池」&#xff08;Engagement Pool&#xff0…