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像素的行。
3.2.3 枚举类型
3.2.3.1 vg_lite_buffer_format_t
-
这个枚举类型指定了用于缓冲区的颜色格式。
注意:关于图像格式的对齐要求汇总,请参见数值描述后的内存对齐要求。
vg_lite_buffer_format_t | 描述 | 支持作为源 | 支持作为目标 | 对齐(字节) |
---|---|---|---|---|
VG_LITE_ABGR8888 | 每个通道8bits,alpha在低8bits | 是 | 是 | 64 |
VG_LITE_ARGB8888 | 是 | 是 | 64 | |
VG_LITE_BGRA8888 | 是 | 是 | 64 | |
VG_LITE_RGBA8888 | 是 | 是 | 64 | |
VG_LITE_BGRX8888 | 是 | 是 | 64 | |
VG_LITE_RGBX8888 | 是 | 是 | 64 | |
VG_LITE_XBGR8888 | 是 | 是 | 64 | |
VG_LITE_XRGB8888 | 是 | 是 | 64 | |
VG_LITE_ABGR1555 | 是 | 是 | 32 | |
VG_LITE_ARGB1555 | 是 | 是 | 32 | |
VG_LITE_BGRA5551 | 是 | 是 | 32 | |
VG_LITE_RGBA5551 | 是 | 是 | 32 | |
VG_LITE_BGR565 | 是 | 是 | 32 | |
VG_LITE_RGB565 | 是 | 是 | 32 | |
VG_LITE_ABGR4444 | 是 | 是 | 32 | |
VG_LITE_ARGB4444 | 是 | 是 | 32 | |
VG_LITE_BGRA4444 | 是 | 是 | 32 | |
VG_LITE_RGBA4444 | 是 | 是 | 32 | |
VG_LITE_A4 | 4bits alpha, 无RGB | 是 | 否 | 8 |
VG_LITE_A8 | 8bits alpha, 无RGB | 是 | 是 | 16 |
VG_LITE_ABGR2222 | 是 | 是 | 16 | |
VG_LITE_ARGB2222 | 是 | 是 | 16 | |
VG_LITE_BGRA2222 | 是 | 是 | 16 | |
VG_LITE_RGBA2222 | 是 | 是 | 16 | |
VG_LITE_INDEX_1 | 1-bit 索引格式 | 是 | 否 | 8 |
VG_LITE_INDEX_2 | 2-bit索引格式 | 是 | 否 | 8 |
VG_LITE_INDEX_4 | 4-bit索引格式 | 是 | 否 | 8 |
VG_LITE_INDEX_8 | 8-bit索引格式 | 是 | 否 | 8 |
3.2.3.2 vg_lite_buffer_image_mode_t
- 指定如何将图像渲染到缓冲区。
枚举 | 描述 |
---|---|
VG_LITE_NORMAL_IMAGE_MODE | 用混合模式绘制的图像 |
VG_LITE_NONE_IMAGE_MODE | 图像输入被忽略 |
VG_LITE_MULTIPLY_IMAGE_MODE | 图像与绘制颜色相乘 |
3.2.3.3 vg_lite_buffer_layout_t
- 指定内存中的缓冲区数据布局。
枚举 | 描述 |
---|---|
VG_LITE_LINEAR | 线性(扫描线)布局。注意:这种布局 对缓冲区没有对齐要求。 |
VG_LITE_TILED | 数据被组织成4x4像素的嵌片。注意:对于这种布局,缓冲区的起始地址和跨度需要以64字节对齐。 |
3.2.3.4 vg_lite_buffer_transparency_mode_t
- 指定一个缓冲区的透明模式。
枚举 | 描述 |
---|---|
VG_LITE_IMAGE_OPAQUE | 不透明的图像:所有的图像像素都被复制到VG PE进行光栅化。 |
VG_LITE_IMAGE_TRANSPARENT | 透明图像:只有非透明的图像像素被复制到VG PE中。 注意:这种模式只有在图像模式为VG_LITE_NORMAL_IMAGE_MODE或VG_LITE_MULTIPLY_IMAGE_MODE时才有效。 |
3.2.4 结构体
3.2.4.1 vg_lite_buffer_t
- 该结构定义了GPU使用的图像或内存数据的缓冲区布局。
字段 | 类型 | 描述 |
---|---|---|
width | int32_t | 缓冲区像素宽度 |
height | int32_t | 缓冲区像素高度 |
stride | int32_t | 一行的字节数 |
tiled | vg_lite_buffer_layout_t | 线性或平铺 |
format | vg_lite_buffer_format_t | 颜色类型 |
handle | void * | 内存句柄 |
memory | void * | 映射的虚拟地址 |
address | uint32_t | 物理地址 |
yuv | N/A | N/A |
image_mode | vg_lite_buffer_image_mode_t | Blit模式 |
transparency_mode | vg_lite_buffer_transparency_mode_t | 透明模式 |
3.2.5 函数
3.2.5.1 vg_lite_allocate
-
描述
这个函数用于在blit或draw函数中使用缓冲区之前分配内存。
为了让硬件访问一些内存,如源图像或目标缓冲区,需要首先分配。提供的vg_lite_buffer_t结构需要用所请求的缓冲区的大小(宽度和高度)和格式进行初始化。如果stride被设置为0,这个函数将把它填进去。这个函数的唯一输入参数是指向缓冲区结构的指针。如果该结构有所有需要的信息,将为该缓冲区分配适当的内存。
这个函数将调用内核来实际分配内存。vg_lite_buffer_t结构中的内存句柄、逻辑地址和硬件地址将由内核填入。
-
参数
vg_lite_buffer_t *buffer: 指向缓冲区的指针,该指针持有被分配的缓冲区的大小和格式。
3.2.5.2 vg_lite_free
-
描述
这个函数用来取消先前分配的缓冲区,释放出该缓冲区的内存。
-
参数
vg_lite_buffer_t *buffer: 指向被vg_lite_allocate填入的缓冲区结构的指针。
3.2.5.3 vg_lite_buffer_upload
-
描述
该函数将像素数据上传到GPU内存。注意,要上传的数据(像素)的格式必须与缓冲区对象中描述的相同。输入的数据内存缓冲区应该包含足够的数据,以便上传到输入参数 "buffer "所指向的GPU缓冲区。
-
参数
vg_lite_buffer_t *buffer: 指向被vg_lite_allocate填入的缓冲区结构的指针。
uint8_t *data[3]: 指向像素数据的指针。
uint32_t stride[3]: 像素数据的行跨度。
3.2.5.4 vg_lite_map
-
描述
这个函数是用来为一个特定的缓冲区适当地映射内存。它将被用来对GPU需要的缓冲区的物理地址进行适当的转换。
如果你想直接使用一个帧缓冲区作为目标缓冲区,你需要用一个vg_lite_buffer_t结构包裹它,并调用内核将提供的逻辑或物理地址映射到硬件可访问的内存中。例如,如果你知道帧缓冲区的逻辑地址,用这个地址设置vg_lite_buffer_t结构的memory字 段并调用这个函数。如果你知道物理地址,将memory字段设置为NULL,然后用物理地址对地址字段进行编程。
-
参数
vg_lite_buffer_t *buffer: 指向被vg_lite_allocate填入的缓冲区结构的指针。
3.2.5.5 vg_lite_unmap
-
描述
这个函数解除了缓冲区的映射,并释放了之前调用vg_lite_map分配的任何内存资源。
-
参数
vg_lite_buffer_t *buffer: 指向被vg_lite_map填入的缓冲区结构的指针。
3.2.5.6 vg_lite_set_CLUT
-
描述
该函数在上下文状态下为索引彩色图像设置颜色查找表(CLUT)。一旦CLUT被设置(非空),用于索引格式图像渲染的图像像素颜色将根据像素的颜色索引值从颜色查找表(CLUT)中获得。
-
参数
uint32_t count: 颜色查找表中的颜色计数。
对于INDEX_1,表中最多可以有2种颜色。
对于INDEX_2,表中最多可以有4种颜色。
对于INDEX_4,表中最多可以有16种颜色。
对于INDEX_8,表中最多可以有256种颜色。
uint32_t *colors: 该指针指向的颜色查找表(CLUT)将被存储在上下文中,并在需要时被编程到命令缓冲区。在命令缓冲区被提交给硬件之前,CLUT不会生效。颜色为ARGB格式,A在最高位。
注意:驱动程序不验证来自应用程序的CLUT内容。
3.3 矩阵
3.3.1 结构体
3.3.1.1 vg_lite_matrix_t
-
描述
定义了一个3x3浮点数矩阵。
3.3.2 函数
3.3.2.1 vg_lite_identity
-
描述
将矩阵设为单位矩阵。
-
参数
vg_lite_matrix_t *matrix: 指向vg_lite_matrix_t结构体的指针,该结构体将被加载单位矩阵。
3.3.2.2 vg_lite_perspective
-
描述
对矩阵进行透视变换。
-
参数
vg_lite_float_t px: 透视变换矩阵的。
vg_lite_float_t py: 透视变换矩阵的
vg_lite_matrix_t *matrix: 指向将被透视变换的vg_lite_matrix_t结构的指针。
3.3.2.3 vg_lite_rotate
-
描述
对矩阵进行指定角度的旋转变换。
-
参数
vg_lite_float_t degrees: 旋转矩阵的度数(角度制),正数表示顺时针旋转。
vg_lite_matrix_t *matrix: 指向将被旋转的vg_lite_matrix_t结构的指针。
3.3.2.4 vg_lite_scale
-
描述
对矩阵进行垂直和水平缩放。
-
参数
vg_lite_float_t scale_x: 水平方向缩放因子。
vg_lite_float_t scale_y: 竖直方向缩放因子。
vg_lite_matrix_t *matrix: 指向将被缩放的vg_lite_matrix_t结构的指针。
3.3.2.5 vg_lite_translate
-
描述
对矩阵进行平移变换。
-
参数
vg_lite_float_t x: 水平方向的平移。
vg_lite_float_t y: 竖直方向的平移。
vg_lite_matrix_t *matrix: 指向将被平移的vg_lite_matrix_t结构的指针。