K230 GPU API参考
1. 功能介绍
本模块主要用于加速矢量图形的绘制,可用于绘制菜单等页面等,支持加速部分lvgl绘制。GPU有一系列绘制指令,将绘制指令写入内存,提交地址及指令总长度给GPU后即可开始绘制。本模块支持多边形、二次贝塞尔曲线、三次贝塞尔曲线和椭圆曲线的填充绘制,支持线性渐变色填充,支持颜色查找表,支持图像合成和混合以及BLIT。
2. 数据流向
GPU软件驱动部分包括设备/dev/vg_lite及其内核模块驱动程序vg_lite.ko,以及用户态函数库libvg_lite.so,libvg_lite.so会打开/dev/vg_lite设备,通过ioctl()及mmap()与内核态的驱动程序进行交互。内核态驱动主要由vg_lite_hal.c实现,vg_lite.c中的函数通过vg_lite_kernel函数调用vg_lite_hal.c中的函数,执行实际的寄存器操作。
注意:驱动不会检查绘制指令中的物理地址,调用VGLite API可以间接读写DDR内存的所有物理地址。
3. 软件接口
软件接口详见软件包中的头文件vg_lite.h。
3.1 主要类型及定义
3.1.1 参数类型
名称 | 类型定义 | 含义 |
---|---|---|
Int32_t | int | 32位有符号整数 |
uint32_t | Unsigned int | 32位无符号整数 |
VG_LITE_S8 | enum vg_lite_format_t | 8位有符号整数坐标 |
VG_LITE_S16 | enum vg_lite_format_t | 16位有符号整数坐标 |
VG_LITE_S32 | enum vg_lite_format_t | 32位有符号整数坐标 |
vg_lite_float_t | float | 单精度浮点数 |
vg_lite_color_t | uint32_t | 32位颜色值 颜色值指定了各种功能中使用的颜色。颜色是用8位RGBA通道形成的。红色通道在颜色值的最低8位,其次是绿色和蓝色通道。alpha通道在颜色值的最高8位。 对于L8目标格式,通过使用默认的ITU-R BT.709转换规则将RGB颜色转换为L8。 |
3.1.2 错误类型 vg_lite_error_t
枚举 | 描述 |
---|---|
VG_LITE_GENERIC_IO | 无法与内核驱动通信 |
VG_LITE_INVALID_ARGUMENT | 非法参数 |
VG_LITE_MULTI_THREAD_FAIL | 多线程错误 |
VG_LITE_NO_CONTEXT | 无上下文错误 |
VG_LITE_NOT_SUPPORT | 功能不支持 |
VG_LITE_OUT_OF_MEMORY | 无可分配的驱动堆内存 |
VG_LITE_OUT_OF_RESOURCES | 无可分配的系 统堆内存 |
VG_LITE_SUCCESS | 成功 |
VG_LITE_TIMEOUT | 超时 |
VG_LITE_ALREADY_EXISTS | 对象已存在 |
VG_LITE_NOT_ALIGNED | 数据对齐错误 |
3.1.3 功能枚举
枚举 | 描述 |
---|---|
gcFEATURE_BIT_VG_BORDER_CULLING | 边界剪裁 |
gcFEATURE_BIT_VG_GLOBAL_ALPHA | 全局Alpha |
gcFEATURE_BIT_VG_IM_FASTCLEAR | 快速清除 |
gcFEATURE_BIT_VG_IM_INDEX_FORMAT | 颜色索引 |
gcFEATURE_BIT_VG_PE_PREMULTIPLY | Alpha通道预乘 |
gcFEATURE_BIT_VG_RADIAL_GRADIENT | 径向灰度 |
gcFEATURE_BIT_VG_RGBA2_FORMAT | RGBA2222格式 |
3.2 GPU控制
如果没有特殊说明,那么在调用任何API函数之前,应用程序必须通过调用vg_lite_init来初始化GPU隐式(全局)上下文,该函数将填充特征表、重置快速清除缓冲区、重置合成目标缓冲区,以及分配命令和细分缓冲区。
GPU驱动程序只支持一个当前上下文和一个线程来向GPU发布命令。GPU驱动程序不支持在多个线程/进程中同时运行的多个并发上下文,因为GPU内核驱动程序不支持上下文切换。GPU应用程序在任何时候都只能使用一个上下文来向GPU硬件发出命令。如果GPU应用程序需要切换上下文,应该调用vg_lite_close来关闭当前线程中的当前上下文,然后可以调用vg_lite_init来初始化当前线程中或其他线程/进程中的新上下文。
如果没有特殊说明,则所有函数都返回vg_lite_error_t。
3.2.1 上下文初始化和控制函数
3.2.1.1 vg_lite_set_command_buffer_size
-
描述
这个函数是可选的。如果需要修改命令缓冲区的大小,必须在vg_lite_init前调用。命令缓冲区大小默认为64KB,这并不是说一帧的命令就必须小于64KB,当缓冲区填满时会直接提交渲染以清空缓冲区,更大的缓冲区意味着更低频率的渲染提交,可以减少系统调用开销。
-
参数
参数名称 | 描述 | 输入/输出 |
---|---|---|
size | 命令缓冲区长度 | 输入 |
3.2.1.2 vg_lite_init
-
描述
该函数初始化GPU绘图/填充功能所需的内存和数据结构,为命令缓冲区和指定大小的嵌片缓冲区分配内存。嵌片缓冲区的宽度和高 度必须是16的倍数。嵌片窗口可以根据系统中可用的内存量和所需的性能来指定。一个较小的窗口可以有较少的内存占用,但可能会导致较低的性能。可用于镶嵌的最小窗口是16x16。如果高度或宽度小于0,那么就不会创建嵌片缓冲区,可以用于只有填充的情况。
如果这将是第一个访问硬件的上下文,硬件将被打开并初始化。如果需要初始化一个新的上下文,必须调用vg_lite_close来关闭当前的上下文。否则,vg_lite_init将返回一个错误。
-
参数
参数名称 | 描述 | 输入/输出 |
---|---|---|
tessellation_width | 嵌片窗口宽度。必须是16的整数倍,最小为16,最大不能大于帧宽度,如果为0表示不使用tessellation,那么GPU将只运行blit。 | 输入 |
tessellation_height | 嵌片窗口高度。必须是16的整数倍,最小为16,最大不能大于帧宽度,如果为0表示不使用tessellation,那么GPU将只运行blit。 | 输入 |
3.2.1.3 vg_lite_close
-
描述
删除所有的资源,并释放先前由vg_lite_init函数初始化的所有内存。如果这是唯一的活动上下文,它还会自动关闭硬件。
3.2.1.4 vg_lite_finish
-
描述
这个函数明确地将命令缓冲区提交给GPU,并等待其完成。
3.2.1.5 vg_lite_flush
-
描述
这个函数明确地将命令缓冲区提交给GPU,而不等待它的完成。
3.2.2 像素缓冲区
3.2.2.1 内存对齐要求
3.2.2.1.1 源图像对齐要求
GPU硬件要求光栅化图像的宽度是16像素的倍数。这一要求适用于所有图像格式。因此,用户需要将任意的图像宽度垫成16像素的倍数,以便GPU硬件能够正确工作。
像素的字节对齐要求取决于具体的像素格式。
图像格式 | 每像素比特数 | 对齐要求 | 支持作为源图像 | 支持作为目标图像 |
---|---|---|---|---|
VG_LITE_INDEX1 | 1 | 8B | 是 | 否 |
VG_LITE_INDEX2 | 2 | 8B | 是 | 否 |
VG_LITE_INDEX4 | 4 | 8B | 是 | 否 |
VG_LITE_INDEX8 | 8 | 16B | 是 | 否 |
VG_LITE_A4 | 4 | 8B | 是 | 否 |
VG_LITE_A8 | 8 | 16B | 是 | 是 |
VG_LITE_L8 | 8 | 16B | 是 | 是 |
VG_LITE_ARGB2222组 | 8 | 16B | 是 | 是 |
VG_LITE_RGB565组 | 16 | 32B | 是 | 是 |
VG_LITE_ARGB1555组 | 16 | 32B | 是 | 是 |
VG_LITE_ARGB4444组 | 16 | 32B | 是 | 是 |
VG_LITE_ARGB8888/XRGB8888组 | 32 | 64B | 是 | 是 |
3.2.2.1.2 渲染目标缓冲区对齐要求
GPU硬件要求像素缓冲区的宽度是16像素的倍数。这一要求适用于所有图像格式。因此,用户需要将任意的像素缓冲区宽度对齐成16像素的倍数,以便GPU硬件能够正确工作。像素的字节对齐要求取决于具体的像素格式。
请参阅本文件后面的对齐说明表2:图像源对齐摘要。
像素缓冲区的起始地址对齐要求取决于缓冲区布局格式是平铺还是线性(vg_lite_buffer_layout_t enum)。
- 如果格式是平铺(4x4平铺),起始地址和stride需要64字节对齐。
- 如果格式是线性的,起始地址和stride没有对齐要求。
3.2.2.2 像素缓存
GPU包括两个完全关联的高速缓存。每个缓存有8行,每行有64字节。在这种情况下,一个缓存行可以容纳一个4x4像素的Tile或一个16x1像素的行。