Android display system introduce(Qualcomm 8x60 platform)(二、SW架构--1)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

一、Overview

 

  

  上图的原型取自高通的文档,由于原图无法描述现有的架构,我在原图的基础了做了些修改,主要是增加了overlay部分,另外其他部分根据现有的软件也做了些许改动。下面先对上图做个大概的介绍,后面会针对重点部分做详细的分析。

         最上面一层为应用程序,根据数据类型以及应用的不同可以分为几种。

第一种是最普通的应用,如UI界面的显示,这部分通常数据类型为RGB格式,数据无须再经过特殊的处理。该应用可以说遍布各个应用程序,几乎是实时存在的。

第二种是针对大块YUV数据的应用,如camerapreview、视频的播放等。该应用只针对特定的应用程序,开启时通过overlay直接把大块的YUV数据送到kernel显示。

        第三种其实和第一种类似,只不过由于应用的需求在显示之前需要对数据进行2D3D的处理(使用OpenGLOpenVGSVGSKIA),处理之后的流程和普通的显示就没什么差别了。一般在Game、地图、Flash等应用中会用到。

        应用之下是framework,其中最核心的就是surfaceflinger了,它为所有的应用程序的显示提供服务。由于overlay的接口挂在surfaceflinger里面(虽然2者在功能上不相干),所有使用overlayAP需要通过surfaceflinger才可以访问overlay;另外,由于surfaceflinger需要使用OpenGLcompose surface,这也就是为什么surfacelfinger会调用EGL wrapper了,EGL wrapper是对Graphics HAL的封装,除了surfaceflinger会调用它来compose surface外,上层的2D3D应用也会调用它来进行图形处理。

        再下一层就是HAL了。

首先一个是overlay模块,对上提供control channeldata channel;对下则通过系统调用到kernel中的MDP driver

再一个是Gralloc模块,注意它是和overlay并列的,它包含2个部分,一部分是为上层提供pmem的接口,另一部分则是对framebuffer进行刷新,这里的framebuffer其实就是UI的数据。由此可见上层有2个通道把显示数据送到kernel中,framebuffer是传统的方式,overlayandroidéclair以后)后增加的。

         红色及右边部分是OpenGLHAL,其中红色部分代表HW solution,高通提供的,这部分是没有源码的;右边的software graphics librarySW solutionandroid自身的。HWSW solution可以同时存在也可以只有一个,后面会讲解。

        再往下就是kernel中的driver了,最主要的就是fb设备驱动以及MDP4 overlay的驱动,从硬件上看2者是并列的,framebuffer最终也是通过overlay方式送入MDP的。PMEMKGSL分别对应kernelpmemdriver/dev/pmem)和Adreno220driver

二、Surfaceflinger详解

1.overview

        Surfaceflinger可以说是Android显示系统中的核心,在android当中它是一个service提供系统范围内的surface composer 功能,它能够将各种应用程序的2D 3D surface 进行组合,合并最终得到的一个main surface数据会送入显存。简单的说,surfaceflinger就像是画布,它不关心画上去的内容,只是一味的执行合成功能,当然要根据画的位置、大小以及效果等参数。这很像Photoshop中的各个Layer,你可以在不同的layer画任意的内容,每个layer可以设置位置、大小、效果参数等,最终通过merge合成一个layer。

        从应用的角度看,每个应用程序可能对应一个或多个图形界面,每个界面可以看作是一个surface。首先每个surface有它的位置、大小、内容等元素,这些元素是可以随便变化的;另外不同的surface的位置会有重叠,会涉及到透明度等效果处理问题,这些都是通过surfaceflinger来完成的。当然了,surfaceflinger担任是一个管理的职责,对于效果处理及合成它是通过OpenGL来做的,但前提是surfaceflinger需要把相关参数计算好,如重叠的位置等。

2.Surfaceflinger在系统中的位置

Android中的图形系统采用Client/Server架构。服务端负责Surface的合成等处理工作,客户端提供接口给上层操作自己的Surface,并向服务端发送消息完成实际处理工作服务端 (SurfaceFlinger)主要由c++代码编写而成。客户端端代码分为两部分,一部分是由Java提供的供应用使用的api,另一部分则是由c++写成的底层实现。如下图所示:

 

除去最上层的应用不算,surface最上层的接口就是java surface了,文件路径如下:

frameworks/base/core/java/android/view/Surface.java,该文件中的接口会被应用间接调用。

我们从JNI开始看,surfaceJNI文件路径如下:

frameworks/base/core/jni/android_view_Surface.cpp,里面的接口大概分为2类,一类是负责管理ibinder通信的;另一类才是和显示控制相关的,第二类接口会直接调用C实现函数。

C实现的文件路径如下:

frameworks/base/libs/ui/Surface.cpp

        我们来看看JNI中一些重要的接口:

        SurfaceSession_init:本接口只会被调用一次,负责创建surfacecomposerclient,主要为进程间通信做准备。对应的销毁函数有SurfaceSession_destroySurfaceSession_kill

Surface_init负责创建surface,最终会调用到surfaceflinger中的createSurface,对应的销毁函数有Surface_destroySurface_release

Surface_lockCanvas:当对一个surface进行绘图之前要调用的,将该surface锁定,并且得到surfaceback buffer,应用可以绘图。

Surface_unlockCanvasAndPost:当上层绘图完毕后,通过该函数通知底层back buffer已绘制完毕,可以更新到显存中。

Surface_setLayer/

Surface_setPosition/

Surface_setSize/

Surface_hide/

Surface_show/

Surface_setOrientation/

Surface_freeze/

Surface_unfreeze

Surface_setFlags/

Surface_setAlpha/

Surface_setMatrix:设置surface的一些属性,如大小、位置、方位、截取范围,Zorder等。其最终改变的都是surface的结构体属性,如下:

            uint32_t        what;//哪一项属性改变

            int32_t         x;//显示位置

            int32_t         y; //显示位置

            uint32_t        z; //layer顺序

            uint32_t        w;//宽度

            uint32_t        h;//高度

            float           alpha;//透明度

            uint32_t        tint;//色彩,未使用

            uint8_t         flags;// 标志

            uint8_t         mask;//屏蔽命令

            uint8_t         reserved;

            matrix22_t      matrix;//截取范围

            Region          transparentRegion;//透明度设置

3.JNISurfaceflinger的连接通讯

由于JNIC函数实现与surfaceflinger不在同一个进程(一个在应用端-客户端,另一个在服务端),android中通过IPCBinder)方式实现进程间通信,下图来源于网上,不过我修改了里面的一些错误,它演示了JNIsurfaceflinger建立连接以及创建surface的流程。

 

JNIC函数实现我们看作是一个部分

这里看到一个比较重要的部分——SurfaceComposerClient,它是surfacelinger的客户端,通过它上层才可以和surfaceflinger使用Binder联系到一起,IsurfaceComposerIsurfaceFlingerClient都是用来实现Binder通信的。具体流程讲解 如下:

应用程序通过JNI接口SurfaceSession_init创建SurfaceComposerClient。通过SurfaceComposerClient函数中调用getComposerService获得IsurfaceComposerIBinder对象,然后通过这个对象的createConnection又获得IsurfaceFlingerClientIBinder,通过这个IBinderJNI就可以调用Surfaceflinger中的接口了,如createSurface。由于采用Binder方式,代码部分稍微复杂一些,需要多看几遍才能把流程理清楚。

4.SurfaceflingerlibuiOpenGL、显示设备的连接

这里不得不提到android对媒体框架中一个很重要的部分,那就是libui,它是一个框架库提供对底层操作的接口,比如会调用GrallocOverlayHAL层接口。其他的库类继承的方式来调用libuisurfaceflinger就是这样和显示设备连接的(包括写显存和对pmem的使用)

Surfaceflinger使用OpenGL来合成surface,所以surfaceflinger会直接调用到OpenGL的接口。

它们的架构如下:

 

 

这部分的流程比较复杂,主要是各个类的继承绕的比较多,我也是看了很多遍代码以及参考了些资料才理出来,下面来详细解释下这个图:

Surfaceflinger在设计时考虑到支持多个屏幕,但目前的版本只支持一个,在surfaceflinger当中一个显示设备对应一个图中的DisplayHardwaresurfaceflinger在初始化时会新建Displayhardware(请参考surfaceflinger.cpp中的readyToRun函数),它完成的主要任务一个是建立FramebufferNativeWindow,确定数据输出设备接口(请参考FramebufferNativeWindow.cpp),再一个就是初始化OpenGL,并创建main surface,后续surfaceflinger中所有的layer最终都将被画到这个main surface上(请参考displayhardware.cppinit函数)。这样main surfaceOpenGLlibui中的FramebufferNativeWindow接口就绑定在一起。

由于libEGL负责所有layer的最终合成,所以最后数据送往HAL一定要libEGL来触发,对应的函数流程是:

postFrameBuffer(surfaceflinger)>Flip(displayhardware)> eglSwapBuffers(OpenGL)-> queueBuffer(libui)->fbpost(gralloc)

另外图中的GraphicBufferlibui中提供的对pmem的操作接口,它会直接调用gralloc模块。关于OpenGLGralloc后面会有单独的章节来介绍。

保留内存(PMEM/ION)申请 chipset: msm8x25 codebase: android4.1 PMEM是高通使用的固定内存分配机制,ION是Google为了使各家厂商使用同一种固定内存分配机制而出现的产物。 当然在ION使用的情况下,PMEM也是可以被定义使用的,主要看用户空间选择哪个了,不过两者并存实在没这个必要,毕竟很浪费内存。 先看下kernel在开机的时候是如何申请这部分内存作为PMEM使用 阅读详情

相关推荐

adreno系列()kgsl driver

static int __init kgsl_3d_init(void) { int ret; // 初始化kgsl_driver[见第2节] ret = kgsl_core_init(); if (ret) return ret; // 初始化gmu[见第3节] gmu_core_register(); // 注册adreno_platform_driver:见"adreno源码系列()注册platform_driver" ret = platform_driv

weixin_44901612的博客 2093

Android图形子系统概述

Android图形子系统是Android操作系统的重要组成部分,负责处理图形渲染和显示。通过深入理解Android图形子系统的工作原理和使用方式,开发人员可以更好地优化应用程序的图形性能和交互体验。Android操作系统的图形子系统是负责处理图形渲染和显示的关键组件。它提供了丰富的功能和API,使开发人员能够创建各种各样的图形界面和用户体验。在本文章中,我们将详细介绍Android图形子系统的工作原理和主要组件,并提供相关的代码示例。它提供了一组强大的函数和工具,使开发人员能够创建逼真的3D图形效果。

ScriptCharm的博客 321

【无标题】

为什么使用 Android GPU 驱动程序 虽然该漏洞本身是一个相当标准的使用后释放漏洞,涉及 GPU 驱动程序中的严格竞争条件,并且这篇文章主要关注如何绕过设备而非 GPU 上的许多缓解措施,但仍然值得给出一些动机来解释为什么 Android GPU 成为攻击者的有吸引力的目标。 正如 Maddie Stone 在文章“你知道的越多,你知道的越多,你不知道的越多”中提到的,在 2021 年检测到的七个被利用的 Android 0-day 中,有五个针对的是 GPU 驱动程序。截至撰写本文时,另一个被

技术超强的网络安全平台 1124

高通display显示框架学习(一)

高通显示框架,display框架学习

5910

高通平台GPU动态调频DCVS . 篇2 . Framework & Procedure

1. 高通平台 GPU DCVS架构 GPU DCVS是基于Linux Devfreq来实现 高通的kgsl(kernel-graphics-support-layer)作为devfreq device msm-adreno-tz 作为devfreq governor 简单的架构如下 如上图所示 首先 KGSL 作为device,msm-adreno-tz 作为governor注册到dev...

Schedule Plus 8721

()Android display system introduceQualcomm 8x60 platform)(SW架构--1

一、Overview    除去最上层的应用不算,surface最上层的接口就是java surface了,文件路径如下:frameworks/base/core/java/android/view/Surface.java,该文件中的接口会被应用间接调用。我们从JNI开始看,surface的JNI文件路径如下:frameworks/base/core/jni/android_view_Surface.cpp,里面的接口大概分为2类,一类是负责管理ibinder通信的;另一类才是和显示控制相关的,第类接口

lovekoala的专栏 1286

()Android display system introduceQualcomm 8x60 platform)(一、HW架构

<br /><br />一、8x60平台显示系统硬件模块讲解<br /><br /><br />上图取自8x60硬件的架构图,都是和显示比较相关的部分,其中最主要的就是MDP,同时为了兼容各种显示接口,8x60又集成了MIPI、HDMI的transmitter以及TV  Encoder。这样一来,可以支持多种显示设备,如下:<br />1.MIPI接口的LCD<br />2.RGB接口的LCD<br />3.LVDS接口的LCD(需外加一颗Transmitter)<br />4.电视(模拟接口)<br />

lovekoala的专栏 2117

Android显示系统详解

一、显示系统的分类: 我们来思考一个问题:从普通用户角度来说,某个APP页面(例如购物APP首页)是怎么被显示到屏幕的? 首先看到的是物理屏幕,然后是屏幕中软件工程师编写的APP页面,也就是手机屏幕驱动+应用APP,能看出来必然要有一个中介将应用APP图像数据传递渲染到屏幕的驱动,投递到硬件屏幕去显示,这就是Android框架的作用,称之为Android显示系统模块。也就是说能分为以下几块: 1、硬件屏幕+驱动(我就知道个汇顶),驱动节点是 /dev/graphics/fb*,(fb0代表第一个moni

dream_caoyun的博客 5500

安卓Android目录sys/class目录下常见设备及其解释

以下是一些sys/class目录下常见设备类和子目录的说明:

希望能对你有用 2447

Android中使用eBPF跟踪进程kgsl内存分配

在微信公众号写了一篇关于高通平台 kgsl 内存文章,可以参考:Android中使用eBPF跟踪进程kgsl内存分配

weixin_42136255的博客 885

Android 图像显示系统 - 开篇

Android图像显示子系统中, /frameworks/native/libs/gui/DisplayEventReceiver.cpp 及 /frameworks/native/services/surfaceflinger/Scheduler/EventThread.cpp 中可以看到使用BitTube的身影。然后使用fork系统调用创建新的进程,来模拟跨进的通信中的不同进程(一个父进程,一个子进程)至于具体的使用过程,在接下来的文章中我们会再详细介绍,,本篇就仅先讲解必要的基础知识。

Gaga246的博客 707

Android显示系统 概述

一篇文章,介绍Android显示系统的全貌与联结细节。Android显示系统,是Android知识体系中一个非常重要的组成部分。酝酿许久,写出此文,希望能最大化降低各位的学习成本,给各位应有的帮助。Android显示系统的内容,太大,太深了。内容之繁杂,让我很难只通过一篇文章,就介绍详尽。而我已经给自己立下了目标了,不能轻易退缩。SurfaceHALVSync多缓冲机制我将尽可能将细节描述清楚,但篇幅有限,我也会在必要之处做些简化。如若有疏漏或错误,还请不吝赐教。

TyearLin的专栏 817

Android显示系统SurfaceFlinger详解 超级干货

本文详细讲解了Android显示系统SurfaceFlinger,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

WolfKingzyh的博客 1万+

Android display架构分析

Android display架构分析(一) http://hi.baidu.com/leowenj/blog/item/429c2dd6ac1480c851da4b95.html 高通7系列硬件架构分析 如上图,高通7系列 Display的硬件部分主要由下面几个部分组成: A、MDP 高通MSM7200A内部模块,主要负责显示数据的转换和部分图像处理功能理,如YUV转RGB,放大缩

BonderWu的专栏 2万+

高通平台GPU动态调频DCVS . 篇1 . Interface

高通平台的GPU内核驱动架构趋于稳定,代码和接口都具备通用性,故分析整理出来以供快速参考 高通平台GPU内核驱动框架全称是 Kernel-Graphics-Support-Layer KGSL 1. KGSL kernel interface kgsl驱动所暴露出来的GPU相关常规控制接口位于 /sys/class/kgsl/kgsl-3d0 路径下 /sys/class/kgsl/kgsl-3d...

Schedule Plus 1万+

Android 图形系统详解

一个页面(Activity)显示到屏幕上流程分析: 启动 Activity → 创建 Window → WMS 注册 Window → SurfaceFlinger 创建 Surface → 合成 layer → 显示 主要涉及三个进程:App进程、System_server进程、SurfaceFlinger进程

xyTianZhao 4911

Android SurfaceFlinger导读(07)理解HWComposer

本章节思维导图如上。主要从7个方面讲述了HWC的概念,这里 主要关注 HWC的流程、功能、效率。1 HWC概述HWC(hwcomposer)是Android中进行窗口(Layer)合成和显示的HAL层模块(注意:不是SurfaceFlinger代码中HWcomposer这个类),通常由显示设备制造商 (OEM)实现并完成,为服务提供硬件支持。2 为什么使用HWC可以使用OpenGL ES合成Layer,这需要占用并消耗GPU资源。大多数GPU都没有针对图层合成进行优化,因此当。

wangdsh的博客 9877
上一篇: Android display架构分析
下一篇: 介绍---memory和client/server
mfbao01
博客等级 码龄18年 19粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值