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

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调用主线分析与理解

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker-compose jira、bugzilla

一、jira 同这篇文章&#xff1a; linux docker 部署破解版本jira:8.4.0——测试体验(非商用)_jira docker-CSDN博客 直到构建完破解版本的镜像就可以了&#xff5e; 二、bugzilla 1. 拉取镜像&#xff1a; 官网镜像搜索bugzilla&#xff0c;第一个就是&#xff1a; 直接…

OLED写入指令和数据

1.OLED写命令 写命令/数据的代码 / * 1. start() 2. 写入 b0111 1000 0x78 3. ACK 4. cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据 5. ACK 6. 写入指令/数据 7. ACK 8. STOP */ void Oled_Write_Cmd(char dataCmd)5.1.4 OLED的寻址模式 如何显示一个点&#x…

信息系统项目管理师0136:工具与技术(8项目整合管理—8.9结束项目或阶段—8.9.2工具与技术)

点击查看专栏目录 文章目录 8.9.2 工具与技术 8.9.2 工具与技术 专家判断 结束项目或阶段过程中&#xff0c;应征求具备如下领域相关专业知识或接受过相关培训的个人或小组的意见&#xff0c;涉及领域包括&#xff1a;管理控制&#xff1b;审计&#xff1b;法规与采购&#xf…

实验八 单区域OSPF路由协议配置

一、实验目的 掌握 OSPF 动态路由协议的配置、诊断方法。 二、实验步骤 1、 运行Cisco Packet Tracer软件&#xff0c;在逻辑工作区放入三台路由器、两台工作站PC及一台笔记本&#xff0c;分别点击各路由器&#xff0c;打开其配置窗口&#xff0c;关闭电源&#xff0c;分别加…

小红书广告如何推广?投放费用是多少?

小红书以其独特的社区文化和用户粘性&#xff0c;成为了众多品牌争相推广的热门平台&#xff0c;如何在小红书上有效推广广告&#xff0c;让品牌信息精准触达目标用户&#xff0c;成为了众多营销人员关注的焦点&#xff0c;云衔科技为企业提供专业的开户和代运营服务。 一、小…

音乐传奇告别之作:《杰作》未解之谜❗❗

坂本龙一的《杰作》不仅是一部音乐会纪录电影&#xff0c;更是他赠予世界的一封深情告别信。 这部影片精心收录了这位音乐巨匠生前最后一场钢琴独奏音乐会的珍贵瞬间&#xff0c; 其中涵盖了《圣诞快乐&#xff0c;劳伦斯先生》、《末代皇帝》、《水》等二十首令人陶醉的经典…

爬虫的福音-移动蜂窝代理

在爬虫与反爬虫斗争愈演愈烈的情况下&#xff0c;各大网站和 App 的风控检测越来越强&#xff0c;其中一项就是 IP 封禁。 为了解决 IP 封禁的困扰&#xff0c;一个有效的方式就是设置代理&#xff0c;设置代理之后&#xff0c;爬虫可以借助代理的 IP 来伪装自己的真实 IP 地址…

SpringBoot 之基础(一)

文章目录 SpringBoot 基础基本概念创建 SpringBoot 项目编码编写启动类写 Controller运行 / 测试properties 和 yml关闭 Spring banner日志spring-boot 默认的日志格式 解决 start.spring.io 不能访问不使用 spring boot 的 parent pom SpringBoot 基础 Spring Boot 是由 Pivo…

探析GPT-4o:技术之巅的跃进

如何评价GPT-4o? 简介&#xff1a;最近&#xff0c;GPT-4o横空出世。对GPT-4o这一人工智能技术进行评价&#xff0c;包括版本间的对比分析、GPT-4o的技术能力以及个人感受等。 随着人工智能领域的不断发展&#xff0c;GPT系列模型一直处于行业的前沿。最近&#xff0c;GPT-4…

[数据集][图像分类]家庭场景下的家具分类数据集1010张101类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;1010 分类类别数&#xff1a;101 类别名称:[“bath_bath”,“bath_heated_t…

Python开发:简单的密码爆破工具

当我们进行在线密码破解时&#xff0c;使用 BurpSuite 以及 wfuzz 足以应对大部分网站应用场景。但是在遇到一些特殊情况时我们还是需要自己来开发密码爆破工具&#xff0c;本文将介绍如何使用Python开发一款简单的密码爆破工具。 0x01 背景介绍 密码破解 记得有大佬曾经说过…

AI预测体彩排3采取888=3策略+和值012路一缩定乾坤测试5月29日预测第5弹

昨天的排三再次命中&#xff01;今天继续基于8883的大底进行测试&#xff0c;今天继续测试&#xff0c;好了&#xff0c;直接上结果吧~ 首先&#xff0c;888定位如下&#xff1a; 百位&#xff1a;6,7,5,8,4,9,1,0 十位&#xff1a;4,3,5,2,1,8,0,9 …

时间|基于SprinBoot+vue的时间管理系统(源码+数据库+文档)

时间管理系统 目录 基于SprinBootvue的时间管理系统 一、前言 二、系统设计 三、系统功能设计 1管理员功能模块 2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农…

多激光雷达ip与端口配置

首先是雷达的ip 我们连上雷达&#xff0c;想要进入雷达的上位机的时候&#xff0c;需要对本机ip进行一些配置&#xff1a; 第一个是ip&#xff0c;第二个是掩码&#xff0c;第三个是网关。 其中ip可以通过wireshark来进行读取&#xff0c;一般就是192.168.102(雷达默认) 然后掩…

echarts高级应用

目录 一、显示相关 1.1、主题 1.1.1、内置主题 1.1.2、自定义主题 1.2、调色盘和颜色渐变 1.2.1、主题调色盘<全局调色盘<局部调色盘 1.2.2、线性渐变(linear)、径向渐变(radial) 1.3、直接样式和高亮样式 1.3.1、直接样式 1.3.2、高亮样式 1.4、图表自适应 …

Java break细节(标签)

Java break细节(标签)continue也可以使用标签 break是用来跳出循环的。 当有多重循环时&#xff0c;可以配合标签来使用&#xff0c;决定跳出那一重循环。 尽量不要使用标签 1、不代标签时&#xff0c;默认跳出 break 所在的那重循环&#xff1a; 可见在 i 3 时&#xff0…

【后端篇】后端开发工程师-面试攻略

后端开发在系统、软件开发的生命周期过程中有着至关重要的作用&#xff0c;下面就简单聊聊后端开发工程师需要具备的一些知识和技能。 一、扎实的基础知识 作为一名后端开发工程师&#xff0c;对编程语言的深刻理解是必不可少的。无论是 Java、Python、C 等&#xff0c;都需要…

从这些原理中,读懂迅软DSE加密系统

加密技术是保护信息安全的系统&#xff0c;通过对原始数据进行加密&#xff0c;使得未经授权的人无法读取这些信息。 一、迅软DSE加密系统干什么用的&#xff1f; ★保护隐私&#xff1a;加密确保个人、机构的敏感信息在传输和存储过程中不被未授权的人访问。 ★防止数据泄露…

双指针+前缀和,蓝桥云课 近似gcd

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 0近似gcd - 蓝桥云课 (lanqiao.cn) 二、解题报告 1、思路分析 考虑近似gcd的子数组的特点&#xff1a;不为g的倍数的数字个数小于等于1 我们用前缀和pre[]来存储不为g的倍数的数字个数 那么枚举左端点l&a…

AIGC降重:如何2分钟降低论文AI率和查重率?推荐使用SpeedAI科研小助手

确保学术论文的独立性与诚信性&#xff0c;对于学业的成就及学位的获取至关重要&#xff0c;其中&#xff0c;论文的人工智能查重与降低AIGC相似度扮演着核心角色。 常规的查重手段主要围绕查重软件的运用和个体的自行审查&#xff1b;而降重则通常通过语句重组、同义替换、内…