高通Android平台下关于display部分的几个关键问题

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
       显示部分的几个问题这几天通过实际测试澄清了一下,主要是下图中各个模块的使用状况以及HAL层几个模块的调用流程。以问题的方式描述如下:

0. SurfaceFlinger主要功能

    SurfaceFlinger只是负责merge Surface的控制,如计算出两个Surface重叠的区域,至于Surface需要显示的内容,则通过Skia、OpenGL和pixflinger来计算。

 

1. Ap是怎么进行显示的?

       Surfaceflinger负责所有上层的显示处理,对于AP(2D或是3D的应用程序)而言,只要到surfaceflinger中创建surface,设置好参数,接下来都是统一交给surfaceflinger进行处理

 

2. SurfaceFlinger是怎么管理多个surface的?

      不管有多少个surface,最终送到显示部分的只能是屏幕大小数据,surfaceflinger中利用MDP或是GPU进行多个surface的合成处理,普通的合成MDP就可完成,但如果是复杂的比如3D的应用等就必须使用GPU,最终合成的好数据会被送到framebuffer中。

 

3. Framebuffer是什么?

       Framebuffer是Linux中为显示数据分配的一块显存(fb设备中),通常大小是一整个屏幕数据的两倍,对于上层AP而言,只需要将要显示的数据丢到framebuffer中就OK了,但此时显示数据并未真正的被送到LCD上,而是暂存在framebuffer中而已。

 

4. 上层是通过什么方式将显示内容送到framebuffer的?

有2个方式(二选一,不会同时在运行):

A、 普通的显示,使用copybit(MDP)(未使用GPU)

      Surfaceflinger通过copybit将要显示的数据送到framebuffer。

Note:copybit可以看做是MDP PPP的接口,它提供了MDP的功能,如多个layer合成,scale、rotate等。

其接口在:android/hardware/msm7k/libcopybit/copybit.cpp

B、 使用GPU(即使用图中的Graphics driver)

       当进行复杂的显示处理时,比如3D的应用,GPU把处理好的数据直接丢到framebuffer中,和MDP没有任何关系

 

5. Framebuffer中的数据是如何被送到LCD显示的?

   图中的Gralloc完成的。

Gralloc有2个功能:

1)一个是和copybit相同的,里面有MDP PPP的接口(目前没有使用)

2)另一个则是刷屏(整屏刷)的接口,即将framebuffer中的数据送到lcd上,调用的是MDP DMA的接口

这部分的code在android/hardware/msm7k/libgralloc-qsd8k目录下,之前没有留意,以为没有使用。现在可以看出开机初始化后就创建了disp_loop thread,里面的操作就是调用系统接口

ioctl(m->framebuffer->fd, FBIOPUT_VSCREENINFO, &m->info)

将数据送到lcd

Note:送数据的时候是2个buffer切换的

另外,上层surfaceflinger也是通过Gralloc中的接口获知屏幕的大小,调用接口为

ioctl(fd, FBIOGET_VSCREENINFO, &info),info中的屏幕宽高对应的就是底层driver设置的宽高值

 

6. OpenGL是什么?

     它是一个图像处理引擎,当需要一些复杂的显示(2D/3D)操作时会用到它。它分为SW方案和HW方案,软件方案就是图中的libagl.so,对应到目前项目中是libGLES_android.so,它可以完成简单的2D(文字,icon等)处理,通过trace看目前大部分显示操作都是它来完成的。

Note:它是软件方案,处理好的数据是通过copybit送到framebuffer的,而不是GPU。

其接口部分参考:android/frameworks/base/opengl/libagl

HW方案就是图中的Graphics driver,它通过使用GPU硬件来完成图像处理,处理后的数据直接送到framebuffer中。其接口部分参考:android/frameworks/base/opengl/libs(有几个版本)

 

7. OpenGL在项目中是如何配置的?

     在android/vendor/qcom/msm7627_ffa目录下有一个egl.cfg文件,里面指定了当前版本中的OpenGL信息,目前如下:

0 0 android

0 1 adreno200

第一行代表该codebase支持SW 方案的OpenGL,是android default的

第二行代表该codebase也支持HW方案的OpenGL,是高通的adreno引擎

如果该cfg文件为空,则只支持default的SW方案。

如果2个方案都在,上层将根据实际应用自行选择使用其一。

该部分请参考:android/frameworks/base/opengl/libs/EGL/loader.cpp

display:高通display overview ViG pipe –For video and graphics RGB pipe –For graphics DMA pipe–For graphics and rotation 这里我将高通display overview原文档重要部分贴出来 1.4 Display driver in APQ8016E Android  Provides the optimized inter... 阅读详情

相关推荐

高通平台msm8953 display子系统学习

硬件上,高通平台有一个mipi-dsi接口连接LCM,由MDP(mobile display processor)进行管理,就是一般说的LCD控制器 软件上,高通平台提供MDSS(Multimedia Display Sub-system)进行管理 软件驱动目录:kernel/msm-4.9/drivers/video/fbdev/msm 主要分为三部分: MDP驱动:对使用的硬件资源进行初始化,同时在fb设备中注册mdp的使用接口,文件mdss_mdp3.c DSI驱动:解析模组厂商提供的panel的dt

Neil驱动的博客 7113

高通平台 Display 杂记

一、代码位置 User space SurfaceTexture– \\frameworks\native\libs\gui SurfaceFlinger– \\frameworks\native\services\surfaceflinger Graphics alloc– \\hardware\qcom\display\libgralloc HWC –...

jlgcumt的博客 2619

高通开发专业术语(解析)

高通开发专业术语(解析),高通 开发 术语 缩写

高通android display subsystem

MDSS:Multimedia Display Sub-system Display driver包括: SurfaceFlinger,Hardware Composer(HWC),以及overlayFramebufferMIPI DSI驱动 系统架构 MDSS 1.0显示子系统 Soure Surface Processor(ViG, RGB,DMA-SSPA)---格式转

shichaog的专栏 8625

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

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

5910

高通android充电常用问题,高通Android平台下关display部分几个关键问题

显示部分几个问题这几天通过实际测试澄清了一下,主要是下图中各个模块的使用状况以及HAL几个模块的调用流程。以问题的方式描述如下:1、Ap是怎么进行显示的?Surfaceflinger负责所有上层的显示处理,对于AP(2D或是3D的应用程序)而言,只要到surfaceflinger中创建surface,设置好参数,接下来都是统一交给surfaceflinger进行处理2、Surface是怎么管理...

weixin_30666751的博客 309
上一篇: Android 显示系统简介
下一篇: Linux查看磁盘空间的好方法
MARTINGANG
博客等级 码龄16年 51粉丝 14原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值