Mesa Gallium框架入门初探

news2024/11/14 3:29:10

Mesa Gallium框架入门初探



MESA Gallium框架

MESA源码里面有2套架构,现在驱动主要基于Gallium架构。 这里我们重点来看看Gallium架构:

在这里插入图片描述

经典架构

在这里插入图片描述

Gallium架构

image




Gallium展开

Gallium中主要包含下面几块:

  • Auxiliary模块:一些公共函数或者辅助的服务,比如状态缓存和缓存管理等。

    tree   src/gallium/auxiliary/ -L 1
    src/gallium/auxiliary/
    ├── cso_cache
    ├── draw
    ├── driver_ddebug
    ├── driver_noop
    ├── driver_trace
    ├── gallivm
    ├── hud
    ├── indices
    ├── meson.build
    ├── nir
    ├── os
    ├── pipebuffer
    ├── pipe-loader
    ├── postprocess
    ├── renderonly
    ├── rtasm
    ├── target-helpers
    ├── tessellator
    ├── tgsi
    ├── translate
    ├── util
    └── vl
    
    21 directories, 1 file
    
    
  • State Tracker: 它负责把上层库的state(blend modes、texture statte等)和draw command(glDrawArrays、glDrawPixels)等转换成MESA内部的pipe对象和操作。

    tree src/mesa/state_tracker/  -L 1
    src/mesa/state_tracker/
    ├── st_atifs_to_nir.c
    ├── st_atifs_to_nir.h
    ├── st_atom_array.cpp
    ├── st_atom_atomicbuf.c
    ├── st_atom_blend.c
    ├── st_atom.c
    ├── st_atom_clip.c
    ├── st_atom_constbuf.c
    ├── st_atom_constbuf.h
    ├── st_atom_depth.c
    ├── st_atom_framebuffer.c
    ├── st_atom.h
    ├── st_atom_image.c
    ├── st_atom_list.h
    ├── st_atom_msaa.c
    ├── st_atom_pixeltransfer.c
    ├── st_atom_rasterizer.c
    ├── st_atom_sampler.c
    ├── st_atom_scissor.c
    ├── st_atom_shader.c
    ├── st_atom_stipple.c
    ├── st_atom_storagebuf.c
    ├── st_atom_tess.c
    ├── st_atom_texture.c
    ├── st_atom_viewport.c
    ├── st_cb_bitmap.c
    ├── st_cb_bitmap.h
    ├── st_cb_clear.c
    ├── st_cb_clear.h
    ├── st_cb_copyimage.c
    ├── st_cb_copyimage.h
    ├── st_cb_drawpixels.c
    ├── st_cb_drawpixels.h
    ├── st_cb_drawtex.c
    ├── st_cb_drawtex.h
    ├── st_cb_eglimage.c
    ├── st_cb_eglimage.h
    ├── st_cb_feedback.c
    ├── st_cb_feedback.h
    ├── st_cb_flush.c
    ├── st_cb_flush.h
    ├── st_cb_rasterpos.c
    ├── st_cb_rasterpos.h
    ├── st_cb_readpixels.c
    ├── st_cb_readpixels.h
    ├── st_cb_texture.c
    ├── st_cb_texture.h
    ├── st_context.c
    ├── st_context.h
    ├── st_copytex.c
    ├── st_copytex.h
    ├── st_debug.c
    ├── st_debug.h
    ├── st_draw.c
    ├── st_draw_feedback.c
    ├── st_draw.h
    ├── st_draw_hw_select.c
    ├── st_extensions.c
    ├── st_extensions.h
    ├── st_format.c
    ├── st_format.h
    ├── st_gen_mipmap.c
    ├── st_gen_mipmap.h
    ├── st_glsl_to_ir.cpp
    ├── st_glsl_to_ir.h
    ├── st_glsl_to_nir.cpp
    ├── st_interop.c
    ├── st_interop.h
    ├── st_manager.c
    ├── st_manager.h
    ├── st_nir_builtins.c
    ├── st_nir.h
    ├── st_nir_lower_builtin.c
    ├── st_nir_lower_tex_src_plane.c
    ├── st_pbo.c
    ├── st_pbo_compute.c
    ├── st_pbo.h
    ├── st_program.c
    ├── st_program.h
    ├── st_sampler_view.c
    ├── st_sampler_view.h
    ├── st_scissor.c
    ├── st_scissor.h
    ├── st_shader_cache.c
    ├── st_shader_cache.h
    ├── st_texture.c
    ├── st_texture.h
    ├── st_util.h
    ├── st_vdpau.c
    ├── st_vdpau.h
    └── tests
    
    1 directory, 90 files
    
  • Pipe Driver: 把Gallium的state、shader和primitive概念转换成硬件能懂的语言

    tree  src/gallium/drivers/  -L 1
    src/gallium/drivers/
    ├── asahi
    ├── crocus
    ├── d3d12
    ├── etnaviv
    ├── freedreno
    ├── i915
    ├── iris
    ├── lima
    ├── llvmpipe
    ├── xxx_gpu
    ├── nouveau
    ├── panfrost
    ├── r300
    ├── r600
    ├── radeonsi
    ├── softpipe
    ├── svga
    ├── tegra
    ├── v3d
    ├── vc4
    ├── virgl
    └── zink
    
    22 directories, 0 files
    
  • Winsys: 实例化state tracker和pipe driver,并和具体的操作系统及2D显示驱动绑定

    tree src/gallium/winsys/ -L 1
    src/gallium/winsys/
    ├── amdgpu
    ├── asahi
    ├── crocus
    ├── d3d12
    ├── etnaviv
    ├── freedreno
    ├── i915
    ├── iris
    ├── kmsro
    ├── lima
    ├── xxx_gpu
    ├── nouveau
    ├── panfrost
    ├── radeon
    ├── svga
    ├── sw
    ├── tegra
    ├── v3d
    ├── vc4
    └── virgl
    
    20 directories, 0 files
    

最后我们看下,构建完成生成gallium目录代码:

tree build-android-aarch64/src/gallium/  -L 2
build-android-aarch64/src/gallium/
├── auxiliary
│   ├── libgallium.a
│   ├── libgallium.a.p
│   ├── libgalliumvl.a
│   ├── libgalliumvl.a.p
│   ├── libgalliumvl_stub.a.p
│   ├── libgalliumvlwinsys.a.p
│   ├── pipe-loader
│   ├── tr_util.c
│   ├── tr_util.h
│   ├── u_indices_gen.c
│   ├── u_tracepoints.c
│   ├── u_tracepoints.h
│   └── u_unfilled_gen.c
├── drivers
│   └── xxx_gpu
├── frontends
│   └── dri
├── targets
│   └── dri
└── winsys
    ├── xxx_gpu
    └── sw

15 directories, 8 files

其中只有Pipe Driver和具体的硬件有关系。
对于GPU硬件厂家来说,主要实现Pipe driver和winsys层。

从数据流看,如下:

state tracker -> Pipe Driver -> Winsyst -> 具体的OS -> OS内核态GPU驱动 -> 具体的GPU硬件

另外Gallium中还有两个比较重要的概念:

  • CSO context:GPU中有些状态是不变的常量,Gallium提供了CSO机制帮助创建、销毁、管理这些对象
  • Draw: 有些硬件不支持坐标变换,光照、裁剪,Gallium也提供了软件机制帮忙实现
    加上这两个概念之后,数据流如下:
state tracker -> CSO context -> Draw -> Pipe Driver -> Winsys -> 具体的OS -> OS内核态GPU驱动 -> 具体的GPU硬件

state tracker和pipe driver通信是通过pipe context 和pipe screen这两个软件概念
state tracker也可以直接通过p_winsys和Winsys通信,一般GPU厂商也要实现一个自己的winsys,可以参考纯软的 kms_dri_sw_winsys.c



1. Mesa Gallium 驱动框架
2. GPU Mesa Gallium架构

这个系列博客,确实写得蛮好的。属于可以深入研读系列的!

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

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

相关文章

重庆耶非凡科技有限公司的选品师项目靠谱吗?

在跨境电商和零售市场日益繁荣的今天,选品师的角色愈发凸显出其重要性。重庆耶非凡科技有限公司作为一家致力于多元化服务的科技公司,其选品师项目备受关注。那么,重庆耶非凡科技有限公司的选品师项目靠谱吗?接下来,我们将从多个…

ai智能写作怎么样,5款ai写作软件创作文章太棒了

ai智能写作究竟怎么样呢?在当今数字化的时代,AI智能写作正逐渐成为一种引人瞩目的趋势。AI智能写作是指利用人工智能技术来辅助或代替人类进行文本创作的过程。随着人工智能技术的不断发展,AI智能写作在各个领域都呈现出越来越广泛的应用。本…

【软考】下篇 第13章 层次式架构设计理论与实践

目录 一、概述1.2 通用分层1.2 分层架构注意点 二、表现层(展示层)2.1 表现层设计模式(MVC、MVP、MVVM)2.2 使用XML设计表现层2.3 UIP2.4 表现层动态生成设计思想 三、中间层(业务层、业务逻辑层)3.1 组件设计3.2 工作流设计3.3 实体设计3.4 业务逻辑层框…

Java解析并修改JSON:将isShow属性改为false

哈喽,大家好,我是木头左! 在Java中,可以使用各种库来处理JSON数据。其中,Jackson和Gson是两个非常流行且功能强大的库。在这篇文章中,将使用Jackson库来解析给定的JSON字符串,将其转换为Map对象…

适合下班做的副业兼职、1天挣300,7天涨粉2万

最近小红书上有类视频火了! 周周近财:让网络小白少花冤枉钱,赚取第一桶金 利用AI制作的漫画解说历史小说视频。视频以《明朝那些事儿》为蓝本,一上线就疯狂吸粉,多条视频内容都大爆了。 就是这个账号,仅仅…

不怕YOLOv10高歌猛进,我有YOLOv8稳扎稳打

YOLOv10 出来有几天时间了,这次我没有选择第一时间出文章解析,如此频繁的发布数字版本的 YOLO 着实让人头疼,虽然数字的更新并非旧版技术的过时, 但是这肯定会让很多在校同学增加很多焦虑情绪。这里还是请大家辩证看待。 v10 这次…

钉钉企业内部H5微应用或小程序之钉消息推送

钉钉简单的推送钉消息 一、钉钉准备工作 首先进入钉钉开放平台 你得有企业内部微应用或者小程序 没有创建的话去看我另一篇文章有说明 钉钉开放平台创建企业内部H5微应用或者小程序-CSDN博客 看不懂话也可以参考官方文档:创建应用 - 钉钉开放平台 二、开发的准备…

mfc140u.dll丢失的解决方法有哪些?怎么全面修复mfc140u.dll文件

mfc140u.dll丢失其实相对来说不太常见到,因为这个文件一般是不丢失的,不过既然有人遇到这种问题,那么小编一定满足各位,给大家详细的唠叨一下mfc140u.dll丢失的各种解决方法,教大家以最快最有效率的方法去解决mfc140u.…

二零二四充能必读 | 618火热来袭,编程书单助你提升代码力

文章目录 📘 Java领域的经典之作🐍 Python学习者的宝典🌐 前端开发者的权威指南🔒 并发编程的艺术🤖 JVM的深入理解🏗 构建自己的编程语言🧠 编程智慧的结晶🌟 代码效率的提升 亲爱的…

开源监控工具monit安装部署

Monit 简介 Monit是一个轻量级(500KB)跨平台的用来监控Unix/linux系统的开源工具。部署简单,并且不依赖任何第三方程序、插件或者库。 Monit可以监控服务器进程、文件、文件系统、网络状态(HTTP/SMTP等协议)、远程主机、服务器资源变化等等。…

Android 架构 UseCase最佳实践

Android 架构 UseCase最佳实践 前言UseCase 的职责UseCase 的命名UseCase 的线程安全UseCase 的签名依赖UseCase 的引用透明UseCase 的接口抽象 前言 Android 官方的最新架构中引入了 Domain (网域层 or 领域层),Domain Layer 由一个个 UseC…

《征服数据结构》双向链表

摘要: 1,双链表的介绍 2,双链表的用途 3,双链表的节点插入和删除 1,双链表的介绍 前面我们讲过单链表,单链表的特点就是只能往后访问不能往前访问。单链表一般在面试中用的比较多,比如删除倒数第…

【数据分析面试】55. 寻找双词组 (Python)

题目: 寻找双词组 (Python) 编写一个名为 find_bigrams 的函数,该函数接收一个句子或段落的字符串,并按顺序返回其所有双词组的列表。 注意: 双词组是指连续的两个单词。 示例: 输入&#x…

gitLab 使用tortoiseGit 克隆新项目 一直提示tortoiseGitPlink输入密码 输完也不生效

问题描述:准备用TortoiseGit拉取gitlab上一个新项目代码,出现tortoiseGitPlink提示让输入密码,输入后又弹出,反复几次,无法down下来代码。 解决方案: 1.找到PuTTYgen工具,打开 2. 点击load 按钮…

Docker是什么?使用场景作用及Docker的安装和启动详解

目录 Docker是什么? Docker的发展 Docker的安装 Docker使用 Docker的运行机制 第一个Docker容器 进入Docker容器 客户机访问容器 Docker是什么? Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker …

网络安全防御之下一代防火墙部署思路分享

随着企业在数字化转型过程中不断深化,为了促进业务快速且安全地推出和更新,企业所采用的应用架构和部署方式经历了显著的演进:它们从单一应用转变为分层架构,进而发展为微服务架构;同时部署方式也由传统的本地部署进化…

区间选点问题-贪心-C++

问题: 给定 𝑁 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数 𝑁,表示区间数…

这样问问题, 客户才会下单!

和供应商沟通时,提问方式至关重要。如何提问是外贸交流的关键,而针对客户的合适提问更是促成交易的秘诀。前不久, 我有一个客户想要一个不属于我们行业的新品, 于是我准备去阿里巴巴找找供应商。但因为我对该领域并不了解&#xf…

MYSQL 使用子查询id数据做条件更新

举例,我想查出某个表里面符合条件的前5条数据的id 做数据更新 : 想法 报错 更正写法 : 示例: UPDATE t_authorisation_record ar1JOIN (SELECT IDFROM t_authorisation_recordWHERE device_company_name JCcccORDER BY id ASCLI…

Python代码:二十一、增加派对名单(二)

1、题目 描述 为庆祝驼瑞驰在牛爱网找到合适的对象,驼瑞驰通过输入的多个连续字符串创建了一个列表作为派对邀请名单,在检查的时候发现少了他最好的朋友“Allen”的名字,因为是最好的朋友,他想让这个名字出现在邀请列表的最前面…