【GPU驱动开发】- mesa编译与链接过程详细分析

前言

不必害怕未知,无需恐惧犯错,做一个Creator!

一、总体框架图

暂时无法在飞书文档外展示此内容
在这里插入图片描述

二、Mesa API 处理 OpenGL 函数调用

Mesa API 负责实现 OpenGL 和其他图形 API 的函数接口。Mesa API 表是一个重要的数据结构,用于存储 OpenGL 函数的指针、版本信息、扩展支持等。_glapi_table 包含了大量的函数指针,每个指针对应于一个特定的 OpenGL 函数。这些指针在运行时被动态设置为对应的实现函数,例如 glCompileShader()、glLinkProgram() 等。
暂时无法在飞书文档外展示此内容

src/mesa/shaderapi.c:实现OpenGL API和Mesa函数接口的对应。

三、State Tacker对GLSL代码链接处理

在链接过程,state tracker层协调着色器程序的链接,将多个着色器链接为最终可执行的着色器程序,即NIR。并且将链接后的着色器程序最终传递给gallium驱动。ST层还管理着色器对象的状态,包括编译状态、链接状态等。
暂时无法在飞书文档外展示此内容

src/mesa/state_tracker/st_glsl_to_nir.c:在ST层主要实现了 GLSL 到 NIR 的转换功能,包括 GLSL 程序的链接、NIR 的最终化、优化以及统一变量的处理。

四、GLSL 编译器对GLSL代码编译和链接处理

在编译过程,当应用程序通过OpenGL函数调用提交GLSL着色器源代码时,Mesa API将GLSL代码传递给GLSL编译器,并进行编译生成Mesa IR中间表示。
在链接过程,ST层负责将Mesa IR中间表示传递给GLSL编译器,GLSL编译器将Mesa IR转化成NIR并回传给ST层进行后续处理。
1、编译过程,GLSL源码转化成IR

  • src/compiler/glsl/glsl_parser_extras.cpp :提供了对 GLSL 源代码的解析和语法分析所需的额外功能,包括处理预处理指令、处理注释、管理源代码中的位置信息
  • src/compiler/glsl/ast_to_hir.cpp: 将抽象语法树(AST)转换为高级中间表示(HIR)的过程。
    在这里插入图片描述

2、链接过程,IR转化成NIR
src/compiler/glsl/glsl_to_nir.cpp:在Compiler层负责将GLSL源码转化成NIR,包括GLSL IR的释放和NIR的创建和验证
暂时无法在飞书文档外展示此内容

五、NIR转换与优化

GLSL IR 通常会被转换为 NIR(New Intermediate Representation)。st_glsl_to_nir.cpp 文件负责 GLSL 到 NIR 的转换,其中 NIR 提供了更抽象和可优化的中间表示。优化后的NIR将提供给gallium层供各个硬件驱动层进行转化。
暂时无法在飞书文档外展示此内容

GLSL编译器转化成NIR后,在ST还需进行以下处理和优化:

  • NIR 统一变量处理
  • 统一变量的位置分配
  • 顶点着色器输入位置分配
  • 变量位置的分配
  • NIR 向量化和坐标系变换
  • NIR 缓存加载和存储
  • 释放 NIR 变体

六、核心数据结构

_glapi_table 结构体:
_glapi_table 结构体是 Mesa API 层的核心数据结构,包含了 OpenGL 函数的指针、版本信息、扩展支持等。它被用于表示 OpenGL API 的实现层次。

struct _glapi_table {/* OpenGL function pointers */GET_DISPATCH_PTR();
/* Version information */GLuint Version; 
/* Extension support */GLuint Extensions[32];
};

st_context结构体:
st_context 是一个表示Gallium3D状态跟踪上下文的结构体,负责跟踪和管理图形状态、与Gallium3D框架进行交互。

struct st_context
{struct st_context_iface iface;struct gl_context *ctx;struct pipe_context *pipe;struct draw_context *draw;  /< For selection/feedback/rastpos only */
**   struct draw_stage *feedback_stage;  /**< For GL_FEEDBACK rendermode */struct draw_stage *selection_stage;  /< For GL_SELECT rendermode */
**   struct draw_stage *rastpos_stage;  /**< For glRasterPos */
// 省略
};

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

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

相关文章

数据中台的演进与实践——构建企业的数字核心_光点科技

数据中台&#xff0c;一个在近年来被频繁提及的概念&#xff0c;已经成为众多企业数字化转型的核心组成部分。然而&#xff0c;尽管它的重要性被业界广泛认可&#xff0c;对于数据中台的深入理解和有效实践仍然是许多企业面临的挑战。在本文中&#xff0c;我们将从数据中台的演…

基于window安装Elasticsearch详细教程

目录 一、安装Java环境1.1 Java版本选择 二、下载和安装ES2.1 下载地址2.2 文件目录 3、启动服务3.1 以管理员身份打开cmd3.2 首次登录会有密码&#xff0c;需要记住3.3 访问 一、安装Java环境 1.1 Java版本选择 官网地址&#xff1a;https://www.elastic.co/cn/support/matr…

9个接口性能优化方案,RT从9000ms到180ms

昨天接到生产 SkyWalking 链路监控告警: 服务的百分位数响应时间在过去的 10 分钟内超过 2000 毫秒的次数达到 3 次。 经过不断的优化&#xff0c;将接口从 9000ms 优化到 180ms&#xff0c;先看结果 优化前&#xff1a; 优化后&#xff1a; 废话不多我们开始 一、定位性能差的…

Maven实战(2)之搭建maven私服

一, 背景: 如果使用国外镜像,下载速度比较慢; 如果使用阿里云镜像,速度还算OK,但是假如网速不好的时候,其实也是比较慢的; 如果没有网的情况下更加下载不了. 二, 本地仓库、个人/公司私服、远程仓库关系如下: 三, 下载安装nexus私服 略

Notepad3:告别Windows记事本,轻松进行文本编辑

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、什么是Notepad3&#xff1f;①Notepad3②核…

openGauss学习笔记-234 openGauss性能调优-系统调优-资源负载管理-资源管理准备-设置控制组

文章目录 openGauss学习笔记-234 openGauss性能调优-系统调优-资源负载管理-资源管理准备-设置控制组234.1 背景信息234.2 前提条件234.3 操作步骤234.3.1 创建子Class控制组和Workload控制组234.3.2 更新控制组的资源配额234.3.3 删除控制组 234.4 查看控制组的信息 openGauss…

第八节 龙晰Anolis 8.8 安装 DDE 桌面环境

一、前言 最小化安装的龙晰 Anolis OS 8.8 是不带图形化界面的&#xff0c;只能使用命令行&#xff0c;有些时候需要用到桌面环境&#xff0c;而DDE (Deepin Desktop Enviroment) 就是很好的桌面环境&#xff0c;它是指龙晰 Anolis 所搭载的中国自主桌面环境&#xff0c;用起来…

【算法沉淀】刷题笔记:并查集 带权并查集+实战讲解

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

Day13:信息打点-JS架构框架识别泄漏提取API接口枚举FUZZ爬虫插件项目

目录 JS前端架构-识别&分析 JS前端架构-开发框架分析 前端架构-半自动Burp分析 前端架构-自动化项目分析 思维导图 章节知识点 Web&#xff1a;语言/CMS/中间件/数据库/系统/WAF等 系统&#xff1a;操作系统/端口服务/网络环境/防火墙等 应用&#xff1a;APP对象/API接…

多模态大语言模型的ai反馈增强机器人操作研究

本研究关注于利用大语言模型&#xff08;LLMs&#xff09;提供的自动化偏好反馈来增强决策过程 ○ 提出了一种多模态LLM&#xff0c;称为CriticGPT&#xff0c;可以理解机器人操作任务中的轨迹视频&#xff0c;并提供分析和偏好反馈 ○ 从奖励建模的角度验证了CriticGPT生成的…

使用 MongoDB Atlas 无服务器实例更高效地开发应用程序

使用 MongoDB Atlas无服务器实例更高效地开发应用程序 身为开发者&#xff0c;数据库并不一定需要您来操心。您可不想耗费时间来预配置集群或调整集群大小。同样地&#xff0c;您也不想操心因未能正确扩展而导致经费超标。 MongoDB Atlas 可为您提供多个数据库部署选项。虽然…

【javascript】快速入门javascript

本文前言及说明 适合学过一门语言有一定基础的人看。 省略最初学习编程时的各种编程重复的基础知识。 javascript简介 编程语言&#xff08;主前端&#xff09; 用途&#xff1a;主web前后端&#xff0c;游戏&#xff0c;干别人网站 优点&#xff1a;速度快&#xff0c;浏…

一文扫盲:室内导航系统的应用场景和技术实现(入门级)

hello&#xff0c;我是贝格前端工场&#xff0c;之间搞过一些室内导航项目&#xff0c;有2D也有3D的&#xff0c;算是有些经验&#xff0c;这里给大家分享一下室内导航的基本尝试&#xff0c;欢迎老铁们点赞、关注&#xff0c;如有需求可以私信我们。 一、室内导航是什么 室内…

Vue开发实例(十)Tabs标签页打开、关闭与路由之间的关系

创建标签页 一、创建标签页二、点击菜单展示新标签页1、将标签数据作为全局使用2、菜单点击增加标签页3、处理重复标签4、关闭标签页 三、点击标签页操作问题1&#xff1a;点击标签页选中菜单进行高亮展示问题2&#xff1a;点击标签页路由也要跳转 四、解决bug 先展示最终效果 …

Android 基础入门 基础简介

1. 观察App运行日志 2.Android 开发设计的编程语言 koltin Java c c 3.工程目录结构 4.Gradle 5.build.gradle 文件解析 plugins {id("com.android.application")//用了哪些插件 主配置文件版本控制 所以这里不用写版本 }android {namespace "com.tiger.myap…

基于springboot+vue的二手车交易系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

C++进阶(二) 多态

一、多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c; 具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会 产生出不同的状态。举个栗子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&#xff1b;学…

Java中的List

List集合的特有方法 方法介绍 方法名描述void add(int index,E element)在此集合中的指定位置插入指定的元素E remove(int index)删除指定索引处的元素&#xff0c;返回被删除的元素E set(int index,E element)修改指定索引处的元素&#xff0c;返回被修改的元素E get(int inde…

动态规划5,粉刷房子,买卖股票的最佳时期

粉刷房子 思路&#xff1a; 1.经验题目要求 dp[i][0] 表示&#xff1a;粉刷到 i 位置的时候&#xff0c;最后一个位置粉刷上红色&#xff0c;此时的最小花费。 dp[i][1] 表示&#xff1a;粉刷到 i 位置的时候&#xff0c;最后一个位置粉刷上蓝色&#xff0c;此时的最小花费。…

mybatis开发一个分页插件、mybatis实现分页、mybatis拦截器

mybatis开发一个分页插件、mybatis实现分页、mybatis拦截器 通过官网的mybatis插件说明可知&#xff0c;我们可以通过拦截器进行开发一个插件。 例如这样的&#xff1a; UserMapper mapper sqlSession.getMapper(UserMapper.class);// 开始分页MagicPage.startPage(1, 3);//…