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

基于Termux的Android平台OpenClaw部署:移动端AI助理实现

基于Termux的Android平台OpenClaw部署:移动端AI助理实现

基于Termux的Android平台OpenClaw部署:移动端AI助理实现 前言 Android作为全球最流行的移动操作系统,拥有庞大的用户基础和丰富的硬件生态。Termux作为Android上的终端模拟器,提供了完整的Linux环境,使得在Android设备上部署OpenClaw成为可能。本文将从环境搭建、性能优化、功耗管理、用户体验等多个维度,详细阐述基于Termux的Android平台OpenClaw部署方案,为移动端AI助理的实现提供完整的技术路线。 这台设备为什么适合跑 OpenClaw 优点 移动设备的便携性 Android设备具有便携性强的特点,可以随身携带,随时使用。OpenClaw部署在Android设备上,可以满足移动办公、现场查询、临时计算等场景需求。相比固定式服务器,Android设备提供了更大的灵活性和便利性。 Termux的Linux环境 Termux提供了完整的Linux环境,包括包管理器、编译工具、运行时环境等。OpenClaw可以在Termux中运行,无需root权限,无需修改系统。Termux的包管理器(pkg)提供了丰富的软件

By Ne0inhk
毕业论文怎么降低AI率?2026最全实用指南

毕业论文怎么降低AI率?2026最全实用指南

毕业论文怎么降低AI率?2026最全实用指南 又到了一年一度的毕业季,相信很多同学都在为论文发愁。今年的情况比较特殊——越来越多的高校引入了AIGC检测系统,不管你有没有用AI写论文,都可能面临"AI率偏高"的问题。 作为一个刚经历过这场"战斗"的过来人,我想把自己踩过的坑和总结的经验分享给大家。这篇文章会从原理到实操,从手动修改到工具辅助,给你一份真正用得上的降AI率指南。 一、先搞清楚:什么是论文AI率? 在动手改论文之前,你得先明白AI率到底是怎么回事。 简单来说,AI率就是检测系统判断你的论文中有多少内容"像是AI写的"。不同平台的叫法不一样,有的叫"AIGC检测率",有的叫"AI疑似度",但本质上都是同一回事。 目前主流的检测平台包括知网、维普、万方、Turnitin等。它们的检测原理略有不同,但大体上都是通过分析文本的语言模式、句式结构、词汇选择等特征来判断内容是否由AI生成。 AI检测的核心逻辑

By Ne0inhk

[AI提效-30]- 2026年国内OPC社区全景地图

🏙️ 2026年国内OPC社区全景地图 一、📍 核心城市OPC生态社区 1. 上海:OPC发源地与政策高地 上海是国内OPC概念最成熟、政策支持力度最大的城市。 社区/园区名称地点特色亮点加入方式上海临港“超级个体288”基地浦东新区临港新片区零租金创业空间、算力补贴、AI工具免费用 关注“临港新片区”公众号 → 搜索“超级个体” → 在线申请 张江AI小镇 OPC孵化中心浦东新区张江高科 聚焦AI应用开发、 大模型生态对接 访问张江高科官网 → 创业服务 → 提交BP NVIDIA AI Tech Center (上海)徐汇区/浦东新区国际技术资源、GPU算力支持、开发者社群 注册NVIDIA开发者账号 → 申请加入本地社群 微软加速器 (上海)闵行区/徐汇区面向早期初创企业、含一人公司官网提交申请 → 筛选面试 💡 上海特别提示: 临港新片区对“超级个体”有专项认定,通过认定后可享受3年免租及税收返还。 2.

By Ne0inhk
一句话生成PCB?和AI聊聊天,就把板子画了!

一句话生成PCB?和AI聊聊天,就把板子画了!

在键盘上敲下一句“我要一个STM32的电机驱动板,带CAN总线”,几秒后,一张完整的原理图和PCB布局在你眼前展开——这不是科幻电影,而是AI给硬件工程师带来的真实震撼。 清晨的阳光洒进办公室,资深硬件工程师李工没有像往常一样直接打开Altium Designer。他对着电脑屏幕上的对话框,敲入了一行简单的需求描述:“设计一个基于ESP32的智能插座PCB,要求支持Wi-Fi控制、过载保护,尺寸尽量小巧。” 15分钟后,一份完整的原理图草案、经过初步优化的双层板布局,甚至是一份物料清单(BOM)初稿已经呈现在他面前。这不可思议的效率背后,正是AI驱动的PCB设计工具在重新定义电子设计的边界。 01 效率革命,从对话到电路板 如今的PCB设计领域正经历着一场静悄悄的革命。传统上,一块电路板从概念到图纸,需要工程师经历需求分析、器件选型、原理图绘制、布局布线等一系列复杂工序,耗时数天甚至数周。 AI工具的出现彻底改变了这一流程。这类工具的核心是经过海量电路数据和设计规则训练的大型语言模型,它们能理解自然语言描述的需求,自动完成从逻辑设计到物理实现的全流程或关键环节。 比如,当

By Ne0inhk