- 博客(238)
- 资源 (71)
- 收藏
- 关注
原创 Android下HWC以及drm_hwcomposer普法(下)
Android下HWC以及drm_hwcomposer普法(下)引言不容易啊,写到这里。经过前面的普法(上),我相信童鞋们对HWC和drm_hwcomposer已经有了一定的认知了。谷歌出品,必须精品。我们前面的篇章见分析到啥来了,对了分析到了HwcDisplay::init,然后设置Backend后端来着!
2024-05-30 19:42:24
3220
5
原创 Android下HWC以及drm_hwcomposer普法(上)
当VSync信号到来时,SurfaceFlinger被唤醒,处理Layer的新建,销毁和更新,并且为相应Layer设置期望的合成方式。所有Layer更新后,SurfaceFlinger调用validateDisplay,让HWC决定每个Layer的合成方式。
2024-05-29 15:25:30
4368
9
原创 Mesa软件框架以及重要数据结构分析
MESA的核心数据结构很多很复杂,上图列举了一些核心数据结构主要强调了它们的层次关系,即上层使用下层的抽象结构(比如 函数指针调用),下层为上次做具体的实现(比如具体的函数实现),虽然是C代码但设计理念基本上与C++的继承类似(这个也是C语言实现大型代码框架的核心)。Mesa的实现比较复杂,其中还有许多的数据结构之间的关系逻辑还不是很清楚。这里的核心主要是Mesa软件EGL/GL层级的递进调用。1.1 Mesa下EGL/GL核心数据结构和层级关系。1.2 Mesa下核心文件和核心结构体。
2024-05-28 19:11:26
1452
原创 Android环境下Mesa初始化流程重学习之eglCreateContext
总得找点事情干不是!2.1 smapi->screen->context_create的实现。这块我们在前面分析时,已经提到过了。我们接着继续分析_mesa_initialize_context。这里的核心是_glapi_table,它在前面已经被初始化了!我们接着继续分析st_create_context_priv。Mesa初始化流程重学习之eglCreateContext。Mesa初始化流程重学习之eglCreateContext。2.2 st_create_context的实现。
2024-05-28 17:33:44
766
原创 Android环境下Mesa初始化流程重学习之eglInitialize
那么这里的xxx_driver_descriptor是怎么实现的,刚开始我通过grep搜索发现只有定义,没有怎么实现。这里的__driDriverGetExtensions_xxx_gpu函数符号表是怎么拼凑成的了,如果我们通过grep在mesa搜索,怎么搜索也搜不到了。分析完了pipe_loader_drm_probe_fd流程,我们接着咔咔一顿接着继续分析,pipe_loader_create_screen它会构建pipe_screen的结构体类型!真可以说的上是你中有我,我中有你的典范啊。
2024-05-28 17:30:06
1448
原创 Mesa GL Dispatch分发分析与理解
gl_打头的函数是OpenGL API,首先这些函数都是函数指针,这些函数挂载的函数就是mesa里以_mesa_打头的对应函数。在正式分析相关分发流程之前,我们必须明确的一点就是现在的Mesa采用的是最新的gallium架构,下图的左侧调用栈是在gallium 架构之前采用的模式,右侧是gallium架构下的模式。通过我们前面的st_create_context_priv分析可知,获取到table表以后,然后通过id会找到对应的函数,即指向了_mesa_Flush。
2024-05-28 17:14:39
1286
原创 Mesa Gallium框架入门初探
它负责把上层库的state(blend modes、texture statte等)和draw command(glDrawArrays、glDrawPixels)等转换成MESA内部的pipe对象和操作。state tracker也可以直接通过p_winsys和Winsys通信,一般GPU厂商也要实现一个自己的winsys,可以参考纯软的 kms_dri_sw_winsys.c。: 把Gallium的state、shader和primitive概念转换成硬件能懂的语言。这个系列博客,确实写得蛮好的。
2024-05-28 17:03:30
1629
原创 Android 13 VSYNC重学习
在VSyncDispatchTimerQueueEntry的callback方法中,会调用类型为CallbackRepeater::callbackk,然后在该方法中接着调用mCallback(vsyncTime, wakeupTime, readyTime)方法,而这里的mCallback(指向DispSyncSource::onVsyncCallback,最后回调EventThread的onVSyncEvent方法。由于偏移量不同VSync-sf信号和VSync-app信号的回调时机也不同。
2024-05-28 14:50:49
3144
原创 Android Graphics图形栈SurfaceFlinger之间各种Layer以及对应Buffer之间的关系
Android Graphics图形栈SurfaceFlinger之间各种Layer以及对应Buffer之间的关系。Android Graphics图形栈SurfaceFlinger之间各种Layer以及对应Buffer之间的关系。
2024-05-28 14:42:08
604
原创 SurfaceFinger layer创建过程
SurfaceFlinger::setTransactionState中比较复杂容易忽略将TransactionState state放入mTransactionQueue的过程,mTransactionQueue在后面创建hwc layer的时候会用到。mClient->createSurface会调用到android12\frameworks\native\services\surfaceflinger\Client.cpp 中Client::createSurface。app端创建Surface。
2024-05-28 14:39:04
835
原创 Android Surface对应的Buffer怎么传递给HWC
因为要预研Android Video overlay,需要将SurfaceView对应的GraphicBuffer从drm_hwcomposer中剥离出来,这就需要们了解SurfaceView对应的GraphicBuffer的前世今生,以及它的数据流向以及在各个模块之间的对应关系。这里我们对该函数单独站看来分析下,ensureOutputLayer将创建Output layer,不是所有layer都会创建对应的hwc layer,创建出来的这些layer最后是要显示到屏幕上的。我先分析下,再告诉你!
2024-05-28 14:33:15
1433
原创 Android Graphics模块中的各种State和重要类普法
这个我的理解它主要是Layer的一个前端,主要用来处理Layer合成相关的,!表示一个"前端"Layer,跟Layer相对应,用于处理Layer在合成阶段的工作。机会是每年一个版本,前进的胶布不能停啊,继续干。Display: 表示所有输出层最终对应的显示设备,可以有硬件合成器支持的显示设备,也可以对应虚拟显示设备。这里的Layer.State主要存储了该Layer相关的数据,例如长宽,各种矩阵,阴影等。这里需要注意CompositionState对应的域空间,不要和Layer里面的搞混淆了!
2024-05-28 14:28:39
893
2
原创 BLASTBufferQueue端的GraphicBuffer怎么和SurfaceFlinger端的BufferStateLayer关联上
在跟进hwc_layer是如何产生的,并如何被填充上GraphicBuffer的,怎么也找不到被填充的GraphicBuffer的来源,最终找到了,它的来源是客户端的BLASTBufferQueue传递过来的,我们这里跟进下这个流程。一. BLASTBufferQueue是如何传递GraphicBuffer到SurfaceFlinger端的BufferStateLayer的。我们接着继续往下看,layer->setBuffer会调用子类的setBuffer,子类是BufferStateLayer。
2024-05-28 14:23:44
1200
原创 OpenHarmony下musl编译工具链普法
LLVM 成长之后已成为众多编译工具及低级工具技术的统称,使得这个名字变得更不贴切,所以开发者决定放弃这个缩写的涵义,现在 LLVM 已独立成为一个品牌,适用于 LLVM 下的所有项目,包括 LLVM 中介码、LLVM 除错工具、LLVM cpp 标准库等。对于一个比较大的第三方库,其头文件和库文件的数量是比较多的,如果我们一个个手动地写,那将是相当的麻烦的。事实上,pkg-config只是一个工具,所以不是你安装了一个第三方库,pkg-config就能知道第三方库的头文件和库文件的位置的。
2024-03-06 09:32:45
2903
3
原创 Android minigbm框架普法
因为前端就是gralloc hal的接口定义,都是一致的,然后后端backend抽象出来,然后根据实际的情况,调用具体的gpu用户层接口实现!这里我们可以看到这里抽象出来了几种典型的GPU的backend,然后再根据前面获取到的drm的驱动名称进行匹配,匹配到了则返回合适的backend,没有则返回NULL。这里我们以evdi为例子来进行相关的分析。minig的核心主要是提供gralloc的HAL实现,但是我看它也提供了私有的HIDL service实现,关于HIDL的实现这个暂时不在我们考虑的范围之内。
2024-03-01 16:40:28
2133
2
原创 OpenHarmony下GN语法普法
鉴于无法测试列表项的添加引入,可以这样使用:设置一个文件或标志的主列表,然后根据各种条件删除不适用于当前版本的文件或标志。构建应该做的大多数事情通常都可以在不这样做的情况下来完成,如果你觉得有必要,这可能表明你在元构建中做了太多的工作。一个值可以是一个域。当最终在命令中使用源路径时,它们会转换为对应于操作系统的(OS-appropriate)路径,这些路径是绝对的或相对于构建目录(运行命令的位置)的路径。这意味着,例如,当您定义target目标时,您在块内执行的任何操作都不会“泄漏”到文件的其余部分。
2024-02-20 16:58:06
1855
2
原创 OpenHarmony下gn相关使用
为了提高OpenHarmony下移植vivante gpu的成功率,先得把准备工作做足了,这样后续就好搞了。所以本文档的核心工作介绍GN构建工具在OpenHarmony中的常见使用方法,指导三方库由cmake或者其它的脚本构建到GN构建的转换!好了今天的博客OpenHarmony下gn相关使用就到这里了。当使用GN进行相关的构建时,需要了解如何指定动态库、静态库和可执行文件的构建规则。在GN中,可以使用executable模板来指定可执行文件的构建规则。3.4 GN在OpenHarmony上的扩展。
2024-02-20 16:52:18
1758
1
原创 关于Android下gralloc,hwcompoer以及surface模块的重新认识
native_handle/native_handle_t只是定义了一个描述buffer的结构体原型,这个原型是和平台无关的,方便buffer在各个进程之间传递,注意成员data是一个大小为0的数组,这意味着data指向紧挨着numInts后面的一个地址.我们可以把native_handle_t看成是一个纯虚的基类.对于native_handle和native_handle_t,以及private_handle_t这三个类型可以看作是同一个东西,而buffer_handle_t则是指向他们的指针.
2024-02-19 19:06:57
2012
3
原创 Android下SF合成流程重学习之GPU合成
通过上述的代码我们可以看到在启动之初就搭建好了EGL环境,并将当前线程与context绑定,为后面使用gl命令做好准备,然后创建了ImageManager 线程,这个线程是管理输入Buffer的EGLImage,然后创建了GLFrameBuffer,用来操作输出的buffer。当需要GPU合成时,会通过生产者RenderSurface::dequeueBuffer请求一块图形缓存,然后GPU就合成/绘图,把数据保存到这块图形缓存中,通过RenderSurface::queueBuffer提交这块缓存。
2024-02-18 16:30:12
5283
8
原创 Android下SF合成流程重学习之Refresh流程
至此,SurfaceFlinger刷新的主体函数分析完了,可以看出来,如果是走device合成,SurfaceFlinger是直接把layer信息提交给hwc,由hwc去合成.prepareFrame 的作用是根据hwc的能力选择合成方式,如果是device合成则直接走hwc present上屏,如果是GPU合成后面则走hwc validate,然后根据hwc过来的变化改变layer的合成方式。composeSurface的主要核心逻辑是针对GPU合成,对于device合成,则直接return了。
2024-02-18 16:14:56
2329
5
原创 Android下SF合成流程重学习之onMessageInvalidate
handleMessageInvalidate主要作用是执行 latchBuffer 去 acquire 应用queue过来的Buffer,然后拿到queueBuffer时设的Bufferslot一些状态属性给到BufferQueueLayer的mBufferInfo,同时还把这个Buffer做成EGLImage为后面的GPU合成做准备,期间都是数据之间的传递,所以说SurfaceFlinger并未真正触碰Buffer的内容。总之,青山不改绿水长流先到这里了。本篇引用的代码,主要是Android R的。
2024-02-18 16:13:05
1914
1
原创 普法GraphicBuffer诞生以及跨进程传递
SurfaceFlinger进程 和 IAllocator服务进程之间通过 hidl_handle 类型的数据传递 图形buffer共享内存的fd数据传输中对 hidl_handle 类型数据特化处理,并把binder数据类型设置为 BINDER_TYPE_FDAbinder内核对 BINDER_TYPE_FDA 类型数据特化处理同时在 IAllocator.allocate 的回调函数中调用 IMapper.importBuffer 把内存映射到当前进程。
2024-02-18 14:01:08
2638
2
原创 repo sync fatal: this operation must be run in a work tree
又有好久没有写点偏重实战类型的博客了,最近一直都在捣鼓源码分析和项目相关事情,是时候来点偏重实战类型的博客了。由于这是一篇实战类型的博客,所以废话不多说,直接上解决办法,其最最核心的逻辑是直接删除.repo内报错的对应的.git文件即可,我们这里以上面的adeb为例,来进行说明。并且注意上述-j4 --fail-fast的参数,是在进行repo sync时候报错会提示执行的,这个也不能解决上述错误!注意,这里发生这个问题通常是在进行APSP下载,执行repo sync的时候异常中断导致的!
2023-05-23 10:17:57
1998
1
原创 OpenHarmony dump渲染和合成图层SurfaceBuffer指南
好了,感慨也发完了,是时候切入正题了。各位读友,千万不要喷我,因为我这也是第一次深入到OpenHarmony显示这块的源码逻辑,为啥我深入到了这块,因为入职了一家原厂。是的,这是因为无论是渲染的图层还是合成之后的图层它们都是通过SurfaceBuffer来进行存储指向的。有的只有是兄弟就砍一刀。其中,我们引用上述封装好的dump函数时候,我们在对应的BUILD.gn中必须,引入如下的库和头文件,如下。然后将获取到的地址中的内容,以一定的格式进行存储,通常是GRB888格式(也可以进行相关的封装)
2023-05-19 10:06:15
2838
15
原创 OpenHarmony下如何打印C/C++调用堆栈
没有关系,因为你看到了这篇,从此可以为你打开新世界的大门,增加一种调试手段,那就是OpenHarmony下打印C/C++调用堆栈。OpenHarmony值路漫漫吾将上下而求索,总之,各位,青山不改绿水长流先到这里了!这里的BUILD.gn必须是你需要跟踪堆栈的文件所对应的BUILD.gn中,而不是随便一个。这里的BUILD.gn必须是你需要跟踪堆栈的文件所对应的BUILD.gn中,而不是随便一个。这里的BUILD.gn必须是你需要跟踪堆栈的文件所对应的BUILD.gn中,而不是随便一个。
2023-05-12 09:14:41
2243
2
原创 普法OpenHarmony送显流程
OpenHarmony送显流程分析OpenHarmony送显流程分析引言本文档主要记录OpenHarmony在渲染完成之后如何进行合成和送显流程的。这个过程牵涉的代码很多,而且流程也是比较繁琐的。所以我一定要坚持下来。千万不能半途而废,也不要想着一口气吃出一个胖子,路漫漫其修远兮吾将上下而求索!一. 应用端发送NextVSnc请求,服务端响应还记得那年大明湖畔的夏雨荷吗!
2023-05-06 17:23:44
4521
5
原创 从bootanimation出发分析OpenHarmony下Gralloc buffer管理机制
从bootamition出发分析OpenHarmony下Gralloc buffer管理机制从bootamition出发分析OpenHarmony下Gralloc buffer管理机制引言这个文档主要记录从bootamition角度出发,分析OpenHarmony下对gralloc buffer的管理!由于OpenHarmony图形子系统过于复杂,且个人由于能力有限,这里我仅从gralloc buffer出发,从整体上对Gralloc buffer进行梳理!虽然过程会很艰辛,但是我一定要坚持下来。
2023-05-06 17:16:08
1877
4
原创 Android/Linux 子系统Graphics图形栈入门普法介绍
GTK+和QT是GUI toolkits,属于软件库,类似c语言的stdio.h,win32,java里import的各种外部包,可以任开发者调用(应该是C/C++使用的库)去创建一些图形界面里面的控件,例如button,下拉菜单,窗口等。而人机交互的本质,是人脑通过人的输出设备(动作、声音等),控制终端的输入设备,终端经过一系列的处理后,经由终端的输出设备将结果输出,人脑再通过人的输入设备接收电脑的输出,最终实现“人脑终端”之间的人机交互。这是一个非常耗时的操作,GPU 的引入就是为了加快栅格化。
2023-01-16 10:17:51
6171
19
原创 Android AOSP和Android-X86源码下载编译终极普法
其实这个说简单也简单,说复杂吗也不复杂。如果仅仅是想获取代码,不需要tag或者git信息,可以有一种更加快速的方法,repo sync --no-tags --no-clone-bundle。在具体的编译过程中,可能会遇到各种错误提示,通常是有一些依赖没有安装造成的,朋友可以在编译的过程中自行安装即可。2.如果使用清华的源下载的速度非常慢的话,建议开发者可以切换到中科大的源进行先关的操作,具体可以详见博客。1.由于国内的环境,此处默认大伙是不能翻墙的情况下进行相关源码的下载,如果能翻墙的话那就比较简单了。
2022-12-08 18:09:16
2853
7
原创 Android R系统aidl文件怎么对应的java文件找不到了?
这不趁着这两天有点空闲时间,准备调试下Android,可是尼玛确突然发现Android的系统aidl文件转换生成的java文件一直找到不,我find,grep找了个寂寞怎么也找不到。这才有了今天的博客。而对于Android R中如果aidl文件被标记为hide,则需要通过aidl命令,手动转换aidl文件到java文件。通常的一个好的命令通常会提供说明使用的命令,它肯定也不例外,我们可以在终端下输入aidl或者aidl --help。对于实战类型的博客,我们不来虚的,必须真刀真枪的实干才可以。
2022-11-11 17:35:18
2442
5
原创 Android R窗口Window的requestlayout过程大揭秘
是的我也有这个感觉,因为我这篇博客是为了后续引出应用Surface创建而添加的一个博客,所以写得简单也是清理之中的,因为该篇博客是一个过渡主要是为了后续的博客不唐突而添加的。虽然这里我提到了了应用绘制三部曲,但是很遗憾我们今天的重点也不是它,我们今天的重点是ViewRootImpl,如何向WMS服务请求relayoutWindow布局,主要是填充Surface,构建对应的Window的BufferLayer。好了,不多说了,我们直接看代码!该系列博客尘封很久很久了,是时候该再续前缘,重新上路了!
2022-11-11 11:28:37
1563
4
原创 普法Android.mk中的一些宏和Android.bp对应关系
陆陆续续有不少小伙伴在后台咨询关于Android.mk怎么转换成Androdi.bp的问题,虽然也解答了不少,但是也有一些当时我没有能够给出及时的答复(不是我不想答复,而是确实有些我当时也没有一个具体的答案)。这里最后留下一个小彩蛋,对于上述的Android.mk读者朋友看看能否正确的转换为Android.bp,当然也希望读者能我一起探讨是最好的了。同时在同一个目录下面的androidmk_test.go,为我们提供了许多Android.mk转换为Android.bp的实例,这个非常值得我们借鉴。.....
2022-08-09 14:44:59
2800
2
原创 普法安利一个调试debug小技巧
博客沉寂很久,肯定不是干坏事被抓吃公交粮食去了!而是最近忙着给OpenHarmony鸿蒙适配GPU渲染加速。尼玛,其中的各种坑啊,填了一个又一个,其中最最拖延了开发进度的事情就是给鸿蒙适配我司的GPU的时候,无法使用鸿蒙自身的hilog调试!不能查看调试相关打印信息,你说这个还能继续下去吗。辛亏最最后想到了一种间接的调试小技巧,通过函数回调OpenHarmony鸿蒙进行相关打印。 当你在一个操作系统上移植第三方库时候,由于种种原因第三方库无法直接使用操作系统的debug接口,那么真的没有办法了吗,这里
2022-07-06 17:36:24
1205
3
原创 Android怎么开发自己底层的NuPlayer音视频播放器框架
Android怎么开发自己底层的NuPlayer播放器框架引言 远离博客好久了,因为一直在忙于新的一个领域那就是Android底层音视频播放器框架的搭建,此时此刻公寓干的差不多了(虽然其中还是有许多的不足,和需要改进的,但是万事开头难吗,还是有一种小有成就的感觉!)。本篇博客不会大书特书音视频领域的相关知识,因为它太庞大了,那我写这篇博客的目的是什么呢,主要是总结概括一下如何搭建自己的Android底层音视频播放器框架。重要的事情说三遍:1.如果多Android音视频领域不感兴趣,可以
2022-05-23 09:43:27
2128
13
原创 Android怎么prebuilt预制动态库和静态库
Android.bp和Android.mk怎么预制so引言 关于Android相关的源码和技术分析博客,停更有蛮久的了。因为一直忙于新的工作和新知识点的学习当中!当然药不能停,错了博客不能停!正好今天偷得一会闲,也恰好有个小伙伴咨询在Android高版本上面(R Q)上面怎么进行预制已经编译好的so。当时就简单的给小伙伴答复了下,这里就简单的安排总结一下,所以没有啥矫揉造作的,直接开干就是了。重要的事情说三遍,重要的事情说三遍,重要的事情说三遍!这里的所说的预制不是简单的把so库简单拷贝
2022-04-07 10:49:17
11788
25
原创 git删除相关历史提交记录,相关文件保持当前状态
git删除相关历史提交记录,相关文件保持当前状态引言 新年新气象,趁着现在新的一年开始项目的事情还不是非常繁忙的时候,多整点下酒菜。这不实战类型的博客记录又开始了!当然实战类型的博客,肯定是有相关的实际需求才会诞生的,这里我们来简单复盘一下实际需求的诞生和由来!场景一:原来我们有一个私有的仓库不对外开放,当开发到一定程度的时候,希望对外开放,在准备开发前当然得检查一番不是,但是在检查的时候,我们误提交了某些隐私文件(肯定不是朋友们想的那种隐私了啊,莫多想。这里的隐私可能牵涉到密码啊,
2022-02-08 17:12:26
2515
2
原创 Android HIDL模型下HAL Service添加SELinux规则实战
Android HIDL模型下HAL Service添加SELinux相关规则实战
2022-02-07 17:19:29
8021
5
原创 Ubuntu git服务器搭建指南
Ubuntu git服务器搭建指南引言 关于Android相关的源码分析博客,停更有蛮久的了。因为一直忙于新的工作和新知识点的学习当中!当然药不能停,错了博客不能停!正好在最近的工作中,需要自己从头开始搭建自己的git服务器供团队使用(不要问我,为啥这个技能一直没有学会,因为以前有专门的小组或者说人员来干这个事情,现在是一穷二白必须自己亲自下场干!)。通过本篇博客,我们将学会如何搭建自己的Git服务器(可以作为共有,或者私有仓库使用,这个就看自己的需求了).那么搭建我们的gi
2021-11-22 11:49:17
1530
5
原创 repo sync repo reset: error: entry ‘comand.py ‘ not uptodate . cannot merge
repo reset: error: entry 'comand.py ’ not uptodate . cannot merge引言 又有好久没有写点偏重实战类型的博客了,最近一直都在捣鼓源码分析和项目相关事情,是时候来点偏重实战类型的博客了。捯饬点啥实战的呢,这不吃着火锅,唱着歌,正准备下载下AOSP的源码来玩一玩,可是当我切换到一台新的服务器上第一次正准备repo sync下载AOSP源码的时候,怎么也不成功,一直提示如下错误:Fetching: 100% (784/784), done
2021-11-15 14:22:00
6454
5
原创 Android dump渲染和合成图层GraphicBuffer指南
Android dump渲染和合成图层GraphicBuffer指南引言 博客停更很久了,提起笔来渐感生疏啊!看来,还是得抽出时间来更新更新啊!好了,感慨也发完了,是时候切入正题了。本篇博客将主要详细介绍如何dump Android渲染和合成图层GraphicBuffer,并通过YUV软件查看流程!通过本篇博客,读者将会至少学会如下两点:通过dump Android渲染图层GraphicBuffer,查看Android渲染结果是否正确通过dump Android合成图层Graph
2021-11-08 18:47:01
8319
36
Android不同版本SELinux的介绍
2019-01-01
谷歌自带文档查看工具.7z
2020-12-23
AsyncChannelFun.zip
2020-07-22
Settings_Framework_ethernet_patch.zip
2020-04-24
JNI_NDK_GUIDE.zip
2020-01-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人