e. display & window之硬件合成HWC2

一、概述

大多数Adnroid应用通常在屏幕上有三个层:屏幕顶部的状态栏、底部或侧面的导航栏以及应用的界面,有些应用会拥有更大或者更少的层(例如默认主屏幕应用有一个单独的壁纸层,而全屏游戏可能会隐藏状态栏)。每个层都可以单独更新,状态栏和导航栏由系统进程渲染,而应用层由应用渲染,两者之间不进行协调。

image-20240218-031126.png

SurfacceFlinger是一种独立的服务,它接管所有Window的Surface作为输入,根据ZOrder、透明度、大小、位置等参数,计算出每个Surface在最终合成图像中的位置。在Android系统中,一个surface和一个window对应,window内容通常是变化的,

二、HWC2是什么

HWC2(Hardware Composer 2)是一种用于Android系统的显示框架,它可以协调和管理Android系统中的多个图形层(layer)和硬件显示设备之间的交互和协作。在实现HWC2时,需要实现以下几个方法:

  1. hotplug(); 通知客户端一个显示器已经连接或者断开。每个活动的显示器(即使是内置的物理显示器)都必须触发至少一个热插拔通知,即使它只是在回调注册后立即出现。

  2. refresh();通知客户端触发屏幕刷新操作。这将强制所有与该显示器相关的图层状态被重新发送,该函数的调用将导致屏幕上的所有内容被重新绘制并呈现,这可以用于强制更新显示器上的内容.

  3. vsync();通知客户端垂直同步事件的发生。只有在为该显示器启用垂直同步(通过setVsyncEnabled)时,才应触发此回调。

  4. createVirtualDisplay():创建一个虚拟显示器,用于在硬件显示设备上显示图形层和其他内容。

  5. destroyVirtualDisplay():销毁一个虚拟显示器,释放相关资源和内存。

  6. createLayer(); 在给定的显示器上创建一个layer。

  7. destroyLayer();销毁一个layer。

  8. setPowerMode():设置硬件显示设备的电源模式,例如开启、关闭或休眠等。

  9. setVsyncEnabled():启用或禁用垂直同步(Vsync)功能,用于协调图形层和硬件显示设备之间的显示刷新。

  10. setClientTarget():设置客户端图像作为渲染目标,用于将图形层和其他内容合成到一个图像中。

  11. setActiveConfig():设置硬件显示设备的活动配置,包括分辨率、刷新率等。

  12. setColorMode():设置硬件显示设备的颜色模式,例如RGB、YUV等,以及相关参数。

  13. setOutputBuffer():设置硬件显示设备的输出缓冲区,用于存储渲染后的图像。

  14. validateDisplay():验证显示器的状态和配置,以确保显示器可以正常工作。

  15. presentDisplay():提交显示器的渲染请求,将渲染后的图像显示到硬件显示设备上。

更多方法声明在此:https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/hwcomposer2.h