硬件合成图像-Android

SurfaceFlinger中图像合成流程- https://blog.csdn.net/u014409795/article/details/51354595
Android P 图形显示系统(一)硬件合成HWC2- https://blog.csdn.net/chaojiangluo/article/details/81475607

所谓3D合成,其实是使用OpenGL标准,用GPU把图层画到统一的FrameBuffer上,然后送显。毫无疑问这是离线合成的一种。既然是按OpenGL标准的,我们来带着如下问题阅读: 
1、OpenGL渲染的FrameBuffer是如何送到LCD的? 
2、为了使用OpenGL绘制图像,必须把该图像内容作为纹理上传到GPU内存,然后使用OpenGL绑定纹理渲染。那么,每个图层是怎么样变成纹理的?glTexImage2D传输上去? 
3、每个图层的绘制区域是如何计算的,图层间存在重叠区域时,如何混合颜色? 
4、使用OpenGL ES的哪套标准(1.1 /2.0 /3.0)?

openCL image2d,openGL Texture2D;

  Android在此新增一个RenderEngine类,用来屏蔽OpenGL ES1.0、1.1和2.0的用法差异。基本用法和opengl是一样的,没有简化太多。 
在创建RenderEngine的时候,会根据GPU所支持的OpenGL ES 版本号,优先选择 2.0,没有2.0可用时使用1.1/1.0。

  适用于硬件实现的宽动态图像合成算法:实时宽动态图像合成方法。算法首先获取同一场景两幅不同曝光量的图片,通过使用线性亮度映射函数,从短曝光图像对应区域的信息恢复出长曝光图像中过曝区域的信息。本算法只需利用两幅原始图像,所需数据量少,且无需恢复图像中的亮度与曝光比信息,计算复杂度很低。同时应用线性函数表示二者关系,更易于硬件实现。
  Hardware Composer HAL (HWC) 是 SurfaceFlinger 用来将 Surface 合成到屏幕。HWC 可以抽象出叠加层和 2D 位块传送器等,其主要是帮忙GPU完成一些工作。
  SurfaceFlinger是一个系统服务,其作用是接受来自多个源的Buffer数据,对它们进行合成,然后发送到显示设备进行显示。在之前的Android版本中,显示基本都是基于硬件的FrameBuffer来实现的,例如/dev/graphics/fb0,但是在后来的版本中,实现可以多样化了,比如高通采用SDM,其他有些平台采用ADF,DRM等。

目前SurfaceFlinger中支持两种合成方式,一种是Device合成,一种是Client合成。SurfaceFlinger 在收集可见层的所有缓冲区之后,便会询问 Hardware Composer 应如何进行合成。
 1.Client合成 
Client合成方式是相对与硬件合成来说的,其合成方式是,将各个Layer的内容用GPU渲染到暂存缓冲区中,最后将暂存缓冲区传送到显示硬件。这个暂存缓冲区,我们称为FBTarget,每个Display设备有各自的FBTarget。Client合成,之前称为GLES合成,我们也可以称之为GPU合成。Client合成,采用RenderEngine进行合成。
 2.Device合成 
就是用专门的硬件合成器进行合成HWComposer,所以硬件合成的能力就取决于硬件的实现。其合成方式是将各个Layer的数据全部传给显示硬件,并告知它从不同的缓冲区读取屏幕不同部分的数据。HWComposer是Devicehec的抽象。

  Android 7.0 包含新版本的 HWC (HWC2),Android需要自行配置,到Android 8.0,HWC2正式开启,且版本升级为2.1版本。HWC2是 SurfaceFlinger 用来与专门的窗口合成硬件进行通信。SurfaceFlinger 包含使用 3D 图形处理器 (GPU) 执行窗口合成任务的备用路径,但由于以下几个原因,此路径并不理想.
  从Android 8.0开始的Treble项目,对Android的架构做了重大的调整,让制造商以更低的成本更轻松、更快速地将设备更新到新版 Android 系统。这就对 HAL 层有了很大的调整,利用提供给Vendor的接口,将Vendor的实现和Android上层分离开来。
  这样的架构让HWC的架构也变的复杂,HWC属于Binderized的HAL类型。Binderized类型的HAL,将上层Androd和底层HAL分别采用两个不用的进程实现,中间采用Binder进行通信,为了和前面的Binder进行区别,这里采用HwBinder。

按照数据格式分,可以分为RGB Layer,YUV Layer。
 RGB Layer 
Buffer是RGB格式,比较常见的就是UI界面的数据。
 YUV Layer 
Buffer是YUV类型的,平常播放Video,Camera预览等,都是YUV类型的。

猜你喜欢

转载自blog.csdn.net/ShareUs/article/details/89047816