Mesa GL Dispatch分发分析与理解

Mesa GL Dispatch分发分析与理解



引言

这篇博客的核心是从OpenGL应用程序的典型api入手,分析gl api 调用到用户态驱动后端的过程,进而总结出一个典型的调用栈。理解了这个典型调用栈,对后续任何一个API的调用过程分析,都是a piece of cake。

在正式分析相关分发流程之前,我们必须明确的一点就是现在的Mesa采用的是最新的gallium架构,下图的左侧调用栈是在gallium 架构之前采用的模式,右侧是gallium架构下的模式。可以看出gallium架构有比较明显的三个分层(夹心饼干):

  • state_tracker层:负责收集OpenGL状态

  • GPU-specific层:厂商的用户态驱动核心部分

  • OS WinSys层:操作系统对接层

下面章节出现的build-android-aarch64目录是通过meson编译的out目录!



二. glClear和glFlush的调用栈分析

接下来以glClear的函数实现,来分析从应用程序到GPU-specific的调用栈。先把关键调用栈组织如下(省略了不相关的调用)。

glClear(GL_COLOR_BUFFER_BIT);_mesa_Clear(GL_COLOR_BUFFER_BIT);st_Clear(ctx, GL_COLOR_BUFFER_BIT);st->pipe->Clear(...);gpu_specific_Clear(...);

我们详细分析下glFlush的流程实现:

GL_API void GL_APIENTRY glFlush (void)//gl.h
//build-android-aarch64/src/mapi/es2api/glapi_mapi_tmp.h
GLAPI void APIENTRY glFlush(void)
{const struct _glapi_table *_tbl = entry_current_get();//核心点,找到tablemapi_func _func = ((const mapi_func *) _tbl)[217];((void (APIENTRY *)(void)) _func)();
}    // src/mapi/entry.c   
static inline const struct _glapi_table *
entry_current_get(void)
{return GET_DISPATCH();
}    //build-android-aarch64/src/mapi/glapi/glapi.h 
_GLAPI_EXPORT extern __THREAD_INITIAL_EXEC struct _glapi_table * _glapi_tls_Dispatch;
_GLAPI_EXPORT extern __THREAD_INITIAL_EXEC void * _glapi_tls_Context;    
# define GET_DISPATCH() _glapi_tls_Dispatch
# define GET_CURRENT_CONTEXT(C)  struct gl_context *C = (struct gl_context *) _glapi_tls_Context

这个_glapi_tls_Dispatch是在那里被实现的呢,我们继续往下看:

//build-android-aarch64/src/mapi/u_current.c
__THREAD_INITIAL_EXEC struct _glapi_table *_glapi_tls_Dispatch= (struct _glapi_table *) table_noop_array;

这个table_noop_array是不是似曾相见,有点眼熟,是的在前面eglCreateContext里面见过:

//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分析可知,获取到table表以后,然后通过id会找到对应的函数,即指向了_mesa_Flush。

//build-android-aarch64/src/mesa/main/context.c
/*** Execute glFlush().*/
void GLAPIENTRY
_mesa_Flush(void)
{GET_CURRENT_CONTEXT(ctx);//转换成gl_contextASSERT_OUTSIDE_BEGIN_END(ctx);_mesa_flush(ctx);
}
_mesa_flush(...)struct st_context *st = st_context(ctx);st_glFlush(st, ...)//src/mesa/state_tracker/st_cb_flush.cst->pipe->flush(st->pipe, fence, flags);//st->pipe指向pipe_context,最终会调用到gpu_specific代码,这里通过前面的eglCreateContext分析可以知道会调用到xxx_gpu_flushxxx_gpu_flush(...)//src/gallium/drivers/xxx_gpuxxx_gpu_context.c   


三.对于GL Dispatch分发的理解

3.1 gl开头的函数

gl_开头的函数是gl的api入口函数,其是通过libglapi.so作为入口切入的。


3.2 _mesa_开头的函数

gl_打头的函数是OpenGL API,首先这些函数都是函数指针,这些函数挂载的函数就是mesa里以_mesa_打头的对应函数。这里有个调试技巧,把函数名gl_前缀换成_mesa_前缀即可。例如glGenBuffers的mesa入口函数是_mesa_GenBuffers。 _mesa_打头函数在前文的libmesa.a静态库中,而libmesa.a又被libgallium_dri.so包含,因此这些代码都是后端驱动的一部分,可以随意修改。


3.3 st_开头的函数

_mesa_打头的函数会调用st_开头的函数。这些st函数就是上图中的state tracker层。


3.4 pipe层字样的函数

pipe层,是接近于硬件的模块,GPU-specific层是从pipe层继承的。可以把pipe层看成接口层,各家驱动实现该接口。


3.5 GPU-specific层的函数

把pipe层的OpenGL状态转换为厂商支持的状态字段。该层一般会封装和处理硬件相关的状态,即硬件命令字。这些封装数据一般要由kmd交给硬件配置相关寄存器。



四、gl api 典型调用栈

通过以上分析,这里给出一个典型的gl函数的调用栈。即:mesa层、st层、pipe层、gpu-spec层。

image

mesa典型调用栈

这里并没有给出winsys层,因为不同的OS有不同实现,这里关注Android。就是上图中的与libdrm交互的那一层,这层会使用ioctl将gpu-spec层组织的数据交给kms,再由kms把数据下发到gpu硬件。



总结

本文从glClear和glFlush的函数的调用栈分析了mesa实现OpenGL的一个典型流程。对于任何一个gl api可以套用该流程,熟悉mesa代码的调用脉络。

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

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

相关文章

文本匹配.grep与Select-String用法对比

Linux Shell与PowerShell上匹配字符串 grep与Select-String用法对比 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article…

家居厨房安全无小事:可燃气体报警器探头校准检测重要性解析

家居厨房作为日常生活中烹饪美食的重要场所,其安全问题不容忽视。 近年来,随着家庭用气设备的普及,煤气泄露事件时有发生,给人们的生命财产安全带来了严重威胁。 因此,安装可燃气体报警器探头,及时检测并…

Python Orange3库:数据挖掘与机器学习的终极利器

更多Python学习内容:ipengtao.com Orange3是一个开源的数据挖掘和机器学习库,提供了丰富的工具和算法来处理和分析数据。Orange3的图形用户界面使得非编程用户也能轻松进行数据分析,而其Python API则为编程用户提供了强大的灵活性。本文将详细…

如何在线转换图片的格式?一键修改图片格式的方法

图片是日常生活和工作中的一种常用的内容展示类型,在使用图片的时候不同用途需要使用的图片格式也是不同的,比如我们手中有一张jpg格式图片,但是平台上传要求格式是png,那么怎样才能将jpg转png格式呢?下面将教大家图片…

模拟量4~20mA电流传感器接线方式

一、模拟量4~20mA电流传感器接线方式 无源双线制是常见的电流型传感器接线方式,它具有简单、经济的特点。其接线方式如下: 传感器的“”接到数据采集器的电源“”上, 传感器的“-”端子连接到数据采集器的“AI”端子上, 数据采集器…

无人机+EasyDSS互联网视频平台:构建秸秆焚烧监控的“天眼”系统

一、方案背景 在每年的夏收时节,秸秆禁烧成为各地政府面临的一项重要任务。随着夏收季节的结束,大量农作物秸秆的处理问题逐渐凸显。一方面农作物种植面积辽阔,禁烧区域面积较大,监管巡逻人员的数量有限,无法全面顾及…

使用 ASM 修改字段类型,解决闪退问题

问题 我的问题是什么? 在桥接类 UnityBridgeActivity 中处理不同 unity 版本调用 mUnityPlayer.destroy(); 闪退问题。 闪退日志如: 闪退日志说在 UnityBridgeActivity中找不到类型为 UnityPlayer 的属性 mUnityPlayer。 我们知道,Android…

【鸟叔的Linux私房菜】2-主机规划与磁盘分区

文章目录 2.1 Linux与硬件的搭配各硬件设备在Linux的文件名使用虚拟机学习 2.2 磁盘分区磁盘连接方式和设备文件名的关系MBR(MS-DOS)与GPT磁盘分区表MBR(MS-DOS)GPT磁盘分区表 启动流程的BIOS与UEFI启动检测程序BIOS搭配MBR/GPT的启动流程UEFI BIOS搭配 GPT启动的流程 Linux安装…

RGB 平均值统计

任务:有一一对应的图片多组如下,希望统计灰色部分原有grb平均值,彩色部分rgb平均值。 方法:由下图对各个像素分析,分为3类,并记录坐标,根据坐标统计上图的rgb平均值,结果放在一张Exc…

linux开发之设备树基本语法二

设备树特殊节点,对节点定义别名,chosen节点用来uboot给内核传参 上面的mmc0就是sdmmc0节点的别名 device_type属性 只对cpu节点和memory节点进行描述 自定义属性 这部分自定义,比如定义管脚标号,初始数值等 为什么我们可以在设备树上自己定义属性呢?设备树文件描述的是硬…

JD3-40/23漏电继电器 AC220V 50-500mA 0.1s 导轨安装

系列型号: JD3-40/13漏电继电器JD3-40/23漏电继电器JD3-40/33漏电继电器JD3-40/43漏电继电器 JD3-70/13漏电继电器JD3-70/23漏电继电器JD3-70/33漏电继电器JD3-70/43漏电继电器 JD3-100/23漏电继电器JD3-100/43漏电继电器JD3-100/33漏电继电器JD3-100/13漏电继电…

260 基于matlab的工业乙醇发酵GUI仿真

基于matlab的工业乙醇发酵GUI仿真。首先对经典的流加半经验半理论模型进行动态和稳态仿真,考虑实际情况密,逐步将温度,气体排放等因素考虑到模型中去,进行综合性仿真。结合GUI技术,以动力学模型为核心,制作…

svg画简单的立方体

开发背景 要开发一个拖拽的大屏项目,其中涉及到一个装饰组件,是一个立方体cube,要求颜色可以修改,大小可以拖拽改变。 效果如下 分析 经过我一番奇思妙想,决定用svg实现,因为对svg比较熟悉。那就先来在草…

柯桥成人职场英语/Excuse me 是 “不好意思”,那 Excuse you呢?

口语中,excuse me的使用频率非常高 甚至已经成为大家的口头禅 用在一些表示歉意或者打扰对方的场合 本来excuse me的用法就已经够丰富了 没想到竟然还有excuse you? 哈哈哈,别蒙圈 这篇就给大家捋捋excuse的那些表达 快和小编一起来学学…

【博客20】缤果Matlab串口调试助手V1.0(中级篇)

超级好用的Matlab串口调试助手 开发工具: MATLAB 2024a中文版 (编程语言matlab) 目录 前言 一、软件概要: 二、软件界面: 1.App演示 ​ ​---- ◇♣♡♠ ---- 2.其他扩展App展示 ​编辑 三、获取 >> 源码以及Git记录: 总结 前…

海外仓系统要多少钱?最贵的未必是最好的,性价比高的才是

海外仓系统可以说已经是现在海外仓管理不可或缺的重要工具,然而,很多海外仓企业在选择海外仓系统时最头疼的问题就是不知道到底多少钱才合适。 确实,现在的海外仓系统市场价格体系非常多,几万几十万各种定价都有,让人…

第13章 层次式架构设计理论与实践

层次式架构的核心思想是将系统组成为一种层次结构,每一层为上层服务,并作为下层客户。其实不管是分层还是其他的架构都是为了解耦,更好的复用,只要秉承着这种思想去理解一切都迎刃而解了。 13.1 层次上体系结构概述 回顾一下软件…

【uniapp】uniapp页面介绍

目录 开发工具:HBuilderX介绍特点和功能 页面简介页面管理新建页面删除页面页面改名pages.json 设置应用首页 页面内容构成template模板区script 脚本区export default 外的代码export default 里的代码 style样式区 页面生命周期Vue2 页面及组件生命周期流程图Vue3…

重生奇迹MU剑士两把单手剑

重生奇迹mu觉醒剑士在武器的选择上非常广泛,可以单手操作也可以双手,那么许多玩家觉得单手剑特别帅气,能否装备两个单手剑,感兴趣的玩家一起来看看详情介绍。 单手剑是一个单手武器,你可以选择装备一个单手剑&#xf…

13.Redis之数据库管理redis客户端JAVA客户端

1.数据库管理 mysql 中有一个重要的概念,database 1个 mysql 服务器上可以有很多个 database1个 database 上可以有很多个 表mysql 上可以随心所欲的 创建/删除 数据库~~ Redis 提供了⼏个⾯向 Redis 数据库的操作,分别是 dbsize、select、flushdb、flushall 命令…