GPU应用笔记

说明:GPU是GR5526 SoC系列芯片(存在于GR5526VGBIP和GR5526RGNIP封装)扩展的外设,其他芯片系列没有GPU。

1. 基本功能介绍

1.1 GPU主要能力特点

  • 硬件组件:具有可编程着色器引擎、基于DMA可减少CPU开销的命令列表、原始光栅化器、纹理映射单元、混合单元

  • 绘制基元:像素/线条图、填充矩形、三角形(Gouraud Shaded)、四边形

  • 颜色格式:32位RGBA8888/BGRA8888/ABGR8888、24位RGB、16位RGBA5551/RGB565、8位A8/L8/RGB332、TSC™等

  • 压缩方案:TSC™4(每像素4位)、TSC™6/TSC™6a(每像素6位,具备/不具备Alpha通道)

  • 图像变换:纹理映射、点采样、双线性过滤、位块传输、任意角度旋转、镜像、拉伸(独立于x轴和y轴)、源和/或目标颜色键控、即时格式转换、2.5D透视投影

  • 文本渲染支持:位图抗锯齿A1/A2/A4/A8、字体紧缩、Unicode(UTF8)

  • 混合支持:完全可编程的Alpha混合模式(源和目标)、源/目标颜色键控

  • 抗锯齿:8 x MSAA(Multi-Sampling Anti-Aliasing,多重采样抗锯齿)、每条边的四边形抗锯齿、每条边的三角形抗锯齿、抗锯齿粗线、抗锯齿圆

1.2 GPU使用要点

1.2.1 帧缓冲区

  • 帧缓冲区是一个内存缓冲区,包含代表完整视频帧中所有像素的数据。在GR5526上,帧缓冲区通常被放置于RAM,若帧缓冲区过大或存在于不止一个帧缓冲区,可以将帧缓冲区放置于PSRAM。PSRAM的读写访问速率相对比RAM慢一些,但其容量大, 可以提供足够的帧和资源缓冲区。

  • 帧缓冲区具有关联的颜色格式,适用于该缓冲区中的所有条目,每一个条目被称之为像素。帧缓冲区的每一存储单元对应屏幕上的一个像素,整个帧缓冲区对应一帧图像。

简单来说,帧缓冲区, 就是我们一般意义上的Frame Buffer,用来渲染和缓存用于绘制到屏幕的像素数据的存储空间。

1.2.2 内存的分配和使用

内存单元是GPU内部各模块及其他模块沟通的桥梁。典型的GPU应用程序存在三类内存占用:

  • 命令列表缓冲区(Command List Buffer):用于存放GPU执行和渲染的命令列表,因为需要提供较快的访问速度,一般放在SRAM区间。

  • 纹理图像缓存(Texture Cache):持久化存储时放在Flash存储器,可支持内存映射寻找,也可根据需要,在使用时加载到PSRAM区间。

  • 帧缓冲区(Frame Buffer):帧缓冲区的空间一般是屏幕长x宽x像素深度,使用双缓冲区的情况下,还需要x2。一般占用空间较大,可以放置在SRAM/PSRAM空间。

1.2.3 参考推荐

  • 我们优先推荐用户基于GR5526 SDK提供的参考示例工程进行图形化产品的开发。实例化工程提供了GPU面向LVGL GUI框架的移植。用户无需关心GPU底层的驱动适配及实现,只需要关注应用层的LVGL实现即可。

  • 如需更系统地阅读GPU的使用,请参考《GR5526 GPU开发者指南》。

2. 应用笔记

  • 基于SDK下GPU版本LVGL进行图形化产品开发时,为获得最佳适配性,推荐的色彩深度参数如下:

    • LVGL的COLOR_DEPTH配置为32位色深。

    • LVGL采用双缓冲区机制,缓冲区帧格式(Frame Buffer)采用RGB565。

    • 屏幕侧颜色格式建议采用RGB565。

  • GPU需要和显示控制模块(Display Controller)以及PSRAM模块一起工作,图形化工程需要专用的芯片电压策略。在main初始化阶段,注意调用接口初始化电压策略。

    app_graphics_adjust_dcore_policy();
    
  • 指令缓冲区大小尽可能定义在10 KB以上。如果发现UI绘制出现一些随机的破坏画面,可检查是否是缓冲区大小不足导致。

    #define HAL_GFX_RING_BUFFER_SIZE            (10*1024u)
    
  • GPU版LVGL框架支持GPU专用的图片压缩格式TSCx,TSCx要求图片宽度为4的整数倍。如果屏幕缓冲区宽度不满足4的整数倍,可考虑将宽度向上取整为4的倍数进行处理。

  • 当使用GPU版本LVGL进行图形化产品开发时,项目的图片资源和字体资源需要使用适配后的工具生成,参考如下: