Android14显示系统 - 开源图形库Mesa3d

文章目录

Android 图形库体系回顾

在这里插入图片描述


为什么找不到Mesa3d,OpenGL-ES的开源实现就是Mesa3d,对于图形库,我们把握框架即可

1、图形库使用

1)OPENGL ES 在Android的使用场景分析

OPENGL ES 在Android的使用,以转场动画为例 : https://juejin.cn/post/7472770757073649700

2)Android-Opengl学习专栏

https://juejin.cn/column/7140455108407459854

3)资料快车

1)mesa & gullium3D介绍:https://juejin.cn/post/6844903841096269837

2)mesa源码目录介绍:https://zhaogang.blog.ZEEKLOG.net/article/details/144786046

3)mesa框架与目录:https://winddoing.github.io/post/39ae47e2.html

4)Linux GPU系列-05-MESA架构 :http://joyxu.github.io/2021/05/13/gpu05/

2、mesa3d概述

1、mesa是一个免费的图形栈,支持多种GL(openGL、Vulkan) 和 平台(Linux、windows、mac),MESA同时实现了Vulkan、OpenGL、OpenGL ES、OpenCL、EGL、WGL、VA、VDPAU等规范,源码目录非常庞大杂乱,实现也十分复杂;

2、mesa的作用(本身就是OpenGL ES 、EGL的实现)

1)对接各种GPU硬件,将应用层对GL API的调用转换到对硬件GPU的调用上;

2)各种 GL API 的纯软实现,当没有可用的硬件时,它可以提供传软件的 GL API 的实现

3、传统mesa直接转换GL访问驱动,因此厂商需要适配每一种GL和不同平台下的GPU driver,复用低效导致工作量较大,gullium3D解决此问题,移植新平台只需适配较少代码,gullium3D当然也是我们重点学习分析对象;

3、mesa3d框架介绍

1)MESA现代框架

在这里插入图片描述

1)分为经典架构(Mesa Classics) 和 Gallium架构,不同应用依赖不同的架构;

2)对接GPU搭配libdrm使用;

2)Gallium架构

在这里插入图片描述

7、源码介绍(基于Gallium3D架构):

/android/external/mesa3d/src/gallium/drivers/panfrost/pan_job.c 1、Auxiliary 存放公共函数或辅助的服务,比如状态缓存和缓存管理 src/gallium/auxiliary 2、State Tracker 把上层库的state(blend modes \ texture state)和draw command (glDrawArrays\glDrawPixels)等转换mesa内部pipe对象和操作 src/mesa/state_tracker/ 3、frontend 前端接口是与上层图形API(OpenGL\Vulkan\Direct3D)交互的部分,前端驱动接口、命令缓冲区接口、api转换层、上下文管理、资源和状态管理 src/gallium/frontend/dri 4、pipe Driver 把Gallium的state、shader和primitive概念转换成硬件能懂的语言 src/gallium/drivers/panfrost 5、Winsys 实例化state tracker和pipe driver,并和具体的操作系统及2D显示器驱动绑定 src/gallium/winsys/panfrost 创建screen流程 /android/external/mesa3d/src/gallium/auxiliary/target-helpers/drm_helper.h pipe_panfrost_create_screen(int fd, const struct pipe_screen_config *config) --panfrost_drm_screen_create(fd); ----panfrost_create_screen() /android/external/mesa3d/src/gallium/drivers/panfrost/pan_screen.c ------panfrost_create_screen(int fd, struct renderonly *ro) --------panfrost_open_device(screen, fd, dev); /android/external/mesa3d/src/panfrost/lib/pan_props.c ----------panfrost_bo_create(dev, ...) 两个重要概念 1)CSO context:创建、销毁、管理GPU状态中不变的变量 2)Draw :有些GPU硬件不支持坐标变化、光照、裁剪,Gallium提供的软件实现 MESA调用流程 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通信 厂家主要实现哪些?两部分 src/gallium/drivers/panfrost src/gallium/winsys/panfrost 实现winsys可以参考纯软件实现的kms_dri_sw_winsys.c mesa生成物 libEGL.so //EGL动态库 libglapi.so //这是一个共享GLAPI库,用于提供OpenGL API调用的间接层; 

4、shading Language

SL : shading Language,着色器语言 1、着色是一个图形领域的专业术语,在白纸上着色 描绘各种颜色,说白一点就是画图的意思,处理单位: 1)顶点着色器 - 处理单位是顶点,并裁剪空间坐标 2)片段着色器 - 处理单位是区域 2、光栅化,将图元转化为像素数据; 3、纹理:比如 将图片数据放在某个绘制的图形区域 就叫纹理; 4、 为什么在用户态,而不是驱动?可以理解为OpenGL等图形库的特殊表达式罢了 为什么不使用编程语言?当编程语言较难满足,有必要使用新的方式! 从而达到效果:尽可能控制渲染过程,同时利用图形硬件的并行性,提高算法效率 着色器编程语言,用于在GPU上执行图形渲染管线中的可编程阶段,图形编程的核心语言,GPU本身也是一个处理器,可以运行程序,而着色器语言编写的程序会被GL转化为特定的数据结构,再让驱动提交给GPU进行处理; 5、Shader Language目前主流是GLSL和HLSL: 基于 OpenGL 的 OpenGL Shading Language,简称 GLSL; - 类C语言,嵌入式场景 基于 DirectX 的 High Level Shading Language,简称 HLSL; - windows 我们重点看GLSL 6、GLSL语法详解,从入门到实践 https://blog.ZEEKLOG.net/2503_92624912/article/details/156241550 GLSL编译器源码:android/external/mesa3d/src/compiler/SConscript.glsl 7、着色器文件编译-链接-使用流程 https://www.cnblogs.com/icmzn/p/19417570 glsl -> 编译器 -> 代码片段 -> GL库初步处理 -> 驱动发送给GPU执行 8、使用GLSL编写一个纹理采用 uniform sampler2D ourTexture; void main() { FragColor = texture(ourTexture, TexCoord); } 9、SKSL 参考GLSL,在Android上skia图形引擎也有自己的Shader Language - SKSL,类C++语言 https://juejin.cn/post/7199933874305712189 1)sksl库 /android/external/skia/resources/sksl 2)使用SKSL,编写一个线性渐变着色器 uniform float2 linear_gradient_start; uniform float2 linear_gradient_end; uniform half4 linear_gradient_start_color; uniform half4 linear_gradient_end_color; half4 main(float2 p) { float t = saturate((p.y - linear_gradient_start.y) / (linear_gradient_end.y - linear_gradient_start.y)); return mix(linear_gradient_start_color, linear_gradient_end_color, t); }` 

5、使用Mesa画一个静态彩色三角形案例

1)谁来调用Mesa

1.CTS测试用例 - 应用层 /android/cts/tests/tests/opengl/src/android/opengl/cts/ByteBufferTest.java 2.Frameworks java层 /android/frameworks/base/opengl/java/android/opengl/* 3.JNI /android/frameworks/base/opengl/java/com/google/android/gles_jni/* 4.native层 - Mesa glBindTexture(GL_TEXTURE_2D, textureHandle); 1)GL api(用户态功能) /android/external/mesa3d/include/GLES/gl.h 1.画三角形 glDrawArrays(GL_TRIANGLES, 0, 3); 

2)代码实现

1.完整代码 https://github.com/LinuxMadGuy/opengl-misc/blob/master/OpenGL/triangle/triangle.cpp 2.重点代码 void main() { float vertices[] = { -0.5f, -0.5f, 0.0f, // left 0.5f, -0.5f, 0.0f, // right 0.0f, 0.5f, 0.0f // top }; //1.GPU端生成一个顶点数组对象(VAO)和一个顶点缓冲对象(VBO),这是存放和管理顶点数据的基础。 unsigned int VBO, VAO; glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); // bind the Vertex Array Object first, then bind and set vertex buffer(s), and then configure vertex attributes(s). //绑定VAO glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); //准备Vertext数据 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(1); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); // render loop // ----------- while (!glfwWindowShouldClose(window)) { //2.render glClearColor(0.2f, 0.3f, 0.3f, 1.0f); //设置清屏背景颜色 glClear(GL_COLOR_BUFFER_BIT);//开始清屏 // draw our first triangle glUseProgram(shaderProgram); glBindVertexArray(VAO); // seeing as we only have a single VAO there's no need to bind it every time, but we'll do so to keep things a bit more organized glDrawArrays(GL_TRIANGLES, 0, 3); //开始GPU进行绘制三角形 //3.glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.) glfwSwapBuffers(window); //交换前后帧缓存区 glfwPollEvents(); //处理IO事件 } } 3.小结 准备好绘制数据(顶点数据、命令id等) -> GPU工作 -> 显示 
1、准备Vertext数据
glBufferData /android/external/mesa3d/src/mesa/main/bufferobj.c mesa_BufferData() --_mesa_buffer_data() ---buffer_data_error() -----buffer_data() ------ctx->Driver.BufferData() /android/external/mesa3d/src/mesa/state_tracker/st_cb_bufferobjects.c --------st_bufferobj_data() ----------bufferobj_data() /android/external/mesa3d/src/gallium/auxiliary/util/u_inlines.h ------------pipe_buffer_write() --------------pctx->buffer_subdata() /android/external/mesa3d/src/gallium/drivers/panfrost/pan_resource.c ----------------u_default_buffer_subdata() ------------------pipe->transfer_map() //各GPU厂商实现,panfrost使用MESA公共函数 /android/external/mesa3d/src/gallium/drivers/panfrost/pan_resource.c pctx->buffer_subdata = u_default_buffer_subdata; 
2、绘制
glDrawArrays /android/external/mesa3d/src/mesa/main/draw.c --_mesa_DrawArrays() ----_mesa_draw_arrays() ------gl_context.Driver.Draw() /android/external/mesa3d/src/mesa/state_tracker/st_draw.c --------st_draw_vbo() /android/external/mesa3d/src/gallium/auxiliary/cso_cache/cso_context.c ----------cso_draw_vbo(st->cso_context, &info); /android/external/mesa3d/src/gallium/auxiliary/util/u_vbuf.c ------------u_vbuf_draw_vbo(vbuf, info); --------------pipe->draw_vbo(pipe, &new_info); /android/external/mesa3d/src/gallium/drivers/panfrost/pan_context.c ----------------panfrost_draw_emit_vertext() /android/external/mesa3d/src/gallium/drivers/panfrost/pan_context.c ------------------pan_emit_draw_descs(batch, &cfg, PIPE_SHADER_VERTEX); 
3、切换Framebuffer
glfwSwapBuffers main::_mesa_Flush gl_context::Driver.Flush state_tracker::st_glFlush draw_do_flush panfrost::panfrost_flush panfrost::panfrost_batch_submit_jobs panfrost::panfrost_batch_submit_ioctl drm::drmIoctl(DRM_IOCTL_PANFROST_SUBMIT) 进入kernel panfrost驱动 /android/vendor/amlogic/common/kernel/common_5.4/drivers/gpu/drm/panfrost/panfrost_drv.c panfrost_ioctl_submit panfrost_job_push drm_sched_entity_push_job drm_sched_rq_add_entity panfrost_job_run panfrost_job_hw_submit panfrost_job_write_affinity (设置job和core的亲和性) job_write (写job manager寄存器) 

Read more

【MySQL#5】 事务的概念及ACID属性和使用

【MySQL#5】 事务的概念及ACID属性和使用

📃个人主页:island1314 ⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞 * 生活总是不会一帆风顺,前进的道路也不会永远一马平川,如何面对挫折影响人生走向 – 《人民日报》 🔥 目录 * 一、什么是事务 * 二、事务的属性及使用 * 2.1 事务的 ACID 属性 * 2.2 为什么存在事务 * 2.3 事务的版本支持 * 2.4 事务的提交方式 * 2.5 事务的常见操作方式 一、什么是事务 * 定义:由一条或者多条 sql 语句构成的 sql 集合体,这个集合体合在一起共同要完成某种任务。MySQL通过多线程实现存储工作,因此在并发访问场景中,事务确保了数据操作的一致性和可靠性。 事务还规定 不同的客户端看到的数据是不相同的 * 事务就是要做的或所做的事情,主要用于 处理操作量大,复杂度高的数据

By Ne0inhk
Flutter 组件 whitecodel_auto_link 适配鸿蒙 HarmonyOS 实战:交互式文本探针,构建信息流自动链接识别与极速预览架构

Flutter 组件 whitecodel_auto_link 适配鸿蒙 HarmonyOS 实战:交互式文本探针,构建信息流自动链接识别与极速预览架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 whitecodel_auto_link 适配鸿蒙 HarmonyOS 实战:交互式文本探针,构建信息流自动链接识别与极速预览架构 前言 在鸿蒙(OpenHarmony)生态迈向深度社交、企业办公及即时通讯全场景覆盖的背景下,如何将枯燥的长文本转化为具备可交互能力的“信息枢纽”,已成为提升用户操作效率的关键。在鸿蒙设备这类强调分布式协同与智慧感知的移动终端上,如果应用仅能显示纯文本,而无法识别其中的网址(URL)、邮箱(Email)或电话(Phone),用户就必须通过复杂的“长按、复制、切换应用、粘贴”链路来处理信息,这极大地割裂了鸿蒙系统的流转体验。 我们需要一种能够自动扫描文本特征、支持多维热点识别且具备高性能渲染能力的富文本处理引擎。 whitecodel_auto_link 为 Flutter 开发者引入了极其简便的长文本自动链接方案。它通过内置的高精度正则匹配矩阵,自动将文本中的特定识别域转化为可点击的高亮区域。在适配到鸿蒙

By Ne0inhk
Spring Boot 后端分层开发实战:从 MVC 到三层架构详解

Spring Boot 后端分层开发实战:从 MVC 到三层架构详解

应用分层 通过上面的练习,我们学习了 Spring MVC 简单功能的开发,但是我们也发现了一些问题。目前我们程序的代码有点 “杂乱”,然而当前只是 “一点点功能” 的开发。如果我们把整个项目功能完成呢?代码会更加的 “杂乱无章”(文件乱,代码内容乱)。 也基于此,咱们接下来学习应用分层。类似公司的组织架构:公司初创阶段,一个人身兼数职,既做财务,又做人事,还有行政。随着公司的逐渐壮大,会把岗位进行细分,划分为财务部门,人事部门,行政部门等。各个部门内部还会再进行细分。 项目开发也是类似,最开始功能简单时,我们前后端放在一起开发,随着项目功能的复杂,我们分为前端和后端不同的团队,甚至更细粒度的团队。后端开发也会根据功能再进行细分。MVC 就是其中的一种拆分方式。但是随着后端人员不再涉及前端,后端开发又有了新的分层方式。 4.1 介绍 阿里开发手册中,关于工程结构部分,定义了常见工程的应用分层结构: 那么什么是应用分层呢?应用分层是一种软件开发设计思想,

By Ne0inhk

大模型实习模拟面试面经:同花顺金融大模型算法一面深度复盘(RAG、LoRA、强化学习、Agent 架构全解析)

大模型实习模拟面试面经:同花顺金融大模型算法一面深度复盘(RAG、LoRA、强化学习、Agent 架构全解析) 关键词:大模型面试|RAG 重排序|LoRA 参数优化|GRPO 训练异常处理|Agentic RL|金融 Agent 开发|AI for SE 前言:为什么这场面试值得复盘? 2026 年,大模型技术已从“学术热点”全面转向“工业落地”,尤其在金融、医疗、法律等高价值垂直领域,智能 Agent 正成为企业核心竞争力的关键载体。作为国内领先的金融科技公司,同花顺近年来大力投入金融大模型与智能投研 Agent 的研发,其算法岗面试自然聚焦于工程实现能力 + 领域理解深度 + 技术前沿敏感度三大维度。 本文基于真实模拟面试场景,完整还原一场面向大模型算法实习生岗位的一轮技术面全过程。面试官围绕 RAG 重排序机制、LoRA

By Ne0inhk