Sunxi平台图形开发

一、显示系统基础

硬件术语

1)layer:一个图层处理单元,可以处理一张输入图像,按支持的图像格式分为video和ui类型。
2)channel:一个硬件通道,包含若干个图层处理单元,可以同时处理若干(典型4个)格式相同的图层。
3)alpha:透明度,在混合时决定对应图像的透明度。
4)transform:图像变换,如平移、旋转等。
5)overlay:图像叠加,按顺序将图像叠加一起的效果。Z序大的靠近观察者,会把z序小的挡住。
6)blending:图像混合,按alpha比例将图像合成一起的效果。
7)enhance:图像增强,有目的地处理图像数据已达到改善图像效果的过程或方法。
8)capture:截屏,将de的输出保存到本地文件。
9)de:Display Engine,显示引擎用于实现对图层的管理以及显示工作,支持HDMI、TV、LCD、等输出模式,是负责将输入的多图层进行叠加、混合、缩放等处理的硬件模块。它不但支持linux标准的framebuffer接口,还支持多种显示效果处理,比如alpha,colorkey,图像增强,亮度、对比度、饱和度、色度调整。

软件术语

1)fb:帧缓冲(framebuffer),linux为显示设备提供的一个接口,把显存抽象成的一种设备。
2)al:抽象层,驱动中将底层硬件抽象成固定业务逻辑的软件层。
3)lowlevel:底层,直接操作硬件寄存器的软件层。

二、Sunxi平台DE引擎

不同的处理器中的DE模块支持的功能具有差异,典型的DE模块支持1路显示通路,该显示通路支持4个可以做alpha blending操作的通道(channel),通道之间的排序可以通过Z值控制,Z值越大越靠上。每个通道又支持4个可以做overlay操作的图层(layer)。但是这四个显示通路并不完全一致,通道0和通道1称为Video channel,支持YUV和RGB数据格式的输入:通道2和通道3称为UI channel,仅支持RGB数据格式的输入。典型的DE显示引擎内部流程图如下:

在这里插入图片描述

DE图层操作的典型demo:

/* 设置图层参数,disphd为显示驱动句柄 */
unsigned long arg[3];

/* struct disp_layer_config结构体对应一个图层的全部信息*/
struct disp_layer_config config;
unsigned int width = 1280;
unsigned int height = 800;
unsigned int ret = 0;

memset(&config, 0, sizeof(struct disp_layer_config));
/* 选择图层所需的通道以及本图层参数 */
config.channel = 0;
config.layer_id = 0;
config.info.enable = 1;
config.info.mode = LAYER_MODE_BUFFER;
config.info.fb.addr[0] = (unsigned long long)mem_in; //FB物理地址
config.info.fb.size[0].width = width;
config.info.fb.size[0].height = height;
config.info.fb.align[0] = 4; //4bytes align
config.info.fb.format = DISP_FORMAT_ARGB_8888

/* crop表示裁剪区域的大小 */
config.info.fb.crop.x = 0;
config.info.fb.crop.y = 0;
/* 定点小数。高32bit为整数,低32bit为小数 */
config.info.fb.crop.width = ((unsigned long)width) << 32;
config.info.fb.crop.height = ((unsigned long)height) << 32;

config.info.fb.flags = DISP_BF_NORMAL;
config.info.fb.scan = DISP_SCAN_PROGRESSIVE;
config.info.alpha.mode = 2;//global pixel alpha
config.info.alpha.value = 0xff;//global alpha value

/* 显示窗口大小 */
config.info.screen_win.x = 0;
config.info.screen_win.y = 0;
config.info.screen_win.width = width;
config.info.screen_win.height = hieght;
config.info.id = 0;

/* 上层调用DE显示引擎所用的ioctl接口 */
arg[0] = 0; //screen_id 0表示选择通路0
arg[1] = (unsigned long)&config;
arg[2] = 1;//表示设置图层数量为1
ret = ioctl(disphd, DISP_LAYER_SET_CONFIG, (void *)arg);

三、G2D

G2D主要实现图像缩放、数据格式、颜色空间转换和图像合成(包括alpha、colorkey、rotate、mirror、rop、maskblt)等加速功能。

由于部分功能和DE重合,实际使用中,一般使用G2D硬件旋转功能,比如对于APP是横屏而LCD是竖屏的情况,如果只是旋转UI可以考虑使用DE的软件旋转功能,而一旦涉及到video之类的大数据旋转,一般使用G2D的硬件旋转功能,效率更高,CPU占用资源低。

双通道显示方案

1)基本显示内容

以监控领域使用的监视器为例,一般输出设备的图形界面内容包括:

  • GUI图形界面:整套GUI界面包含很多的内容,比如分割线、时间、当前模式等内容。
  • Video视频监视界面:摄像头的实时监控界面。

2)双通道显示的处理方案

DE有两个UI通道和两个Video通道,每一个通道又有四个图层,图层之间可以做合成,通道之间可以做alpha blending。

具体实现方案:一个Video通道用于实现GUI界面的显示,而Video通道内的四个图层又可以进一步的细分,每一个图层用于实现专门的元素显示。另一个Video通道用于实现Video界面的显示。最后对两个通道进行合成,得到最终的输出内容给到显示设备。

同时为了防止一块FB缓冲被边绘制边显示的情况,建议使用FB双缓冲机制,它的原理是为FB分配2块大小相同的缓冲区作为显存交替绘制和显示。如DE正在显示缓冲2,则本次绘制的对象为缓冲1,然后对于FB标准模式可通过FB的PAN_DISPLAY调用通知DE显示缓冲1。

在这里插入图片描述

单通道方案

1)基本显示内容

当不需要显示Video视频界面,而只是简单的GUI显示,比如菜单栏、状态栏、背景框等显示内容,这种情况下可以使用单通道的显示方案,每个通道最多支持四个图层的叠加显示。

2)单通道对显示的处理方案

每个通道内的四个图层为layer0~3,通道内的四个图层可以做overlay操作,默认的优先级为layer3>layer2>layer1>layer0,即layer3在本通道内的优先级最高。基于此原理,可以将GUI界面分为四大块元素,绘制到各自的layer中去,最后通过默认的优先级将内容合成到一起,得到最终的GUI显示界面。也可以将全部的GUI显示数据绘制到一个layer中。

在这里插入图片描述

注: 由于绘制错误,上图中通道n的layer号码分别为0~3

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值