【Rockchip系列】importbuffer_T 接口

RGA 图像缓冲区预处理

importbuffer_T 接口

对于需要RGA处理的外部内存,可以使用importbuffer_T接口将缓冲区对应的物理地址信息映射到RGA驱动内部,并获取缓冲区相应的地址信息,方便后续稳定、快速地调用RGA完成工作。

参数说明

参数类型(T)数据类型描述
virtual addressvoid *图像缓冲区虚拟地址
physical addressuint64_t图像缓冲区连续的物理地址
fdint图像缓冲区DMA的文件描述符
GraphicBuffer handlebuffer_handle_t图像缓冲区handle, 包含缓冲区地址,文件描述符,分辨率及格式等信息
GraphicBufferGraphicBufferAndroid graphic buffer
AHardwareBufferAHardwareBuffer系统中可被各种硬件组件访问的内存块

注意: 不同的buffer类型调用RGA的性能是不同的,性能排序如下:

physical address > fd > virtual address

一般推荐使用fd作为buffer类型。

接口定义

基于内存大小的导入
IM_API rga_buffer_handle_t importbuffer_fd(int fd, int size);
IM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, int size);
IM_API rga_buffer_handle_t importbuffer_physicaladdr(uint64_t pa, int size);

参数说明:

  • fd/va/pa: [必需] 外部缓冲区
  • size: [必需] 内存大小
基于图像参数的导入
IM_API rga_buffer_handle_t importbuffer_fd(int fd, int width, int height, int format);
IM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, int width, int height, int format);
IM_API rga_buffer_handle_t importbuffer_physicaladdr(uint64_t pa, int width, int height, int format);

参数说明:

  • fd/va/pa: [必需] 外部缓冲区
  • width: [必需] 图像缓冲区的像素宽度步长
  • height: [必需] 图像缓冲区的像素高度步长
  • format: [必需] 图像缓冲区的像素格式
基于自定义参数的导入
IM_API rga_buffer_handle_t importbuffer_fd(int fd, im_handle_param_t *param);
IM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, im_handle_param_t *param);
IM_API rga_buffer_handle_t importbuffer_physicaladdr(uint64_t pa, im_handle_param_t *param);

参数说明:

  • fd/va/pa: [必需] 外部缓冲区
  • param: [必需] 配置缓冲区参数
特定buffer类型的导入
IM_API rga_buffer_handle_t importbuffer_GraphicBuffer_handle(buffer_handle_t hnd);
IM_API rga_buffer_handle_t importbuffer_GraphicBuffer(sp<GraphicBuffer> buf);
IM_API rga_buffer_handle_t importbuffer_AHardwareBuffer(AHardwareBuffer *buf);

参数说明:

  • hnd/buf: [必需] 外部缓冲区

返回值

所有importbuffer_T函数返回rga_buffer_handle_t类型的值,用于描述内存句柄。

使用建议

  1. 选择合适的buffer类型可以显著影响性能。建议优先考虑使用physical address,其次是fd,最后是virtual address。

  2. 在实际应用中,通常推荐使用fd作为buffer类型,因为它在性能和易用性之间取得了良好的平衡。

  3. 根据您的具体需求选择合适的importbuffer_T函数。如果您只知道内存大小,使用第一组函数;如果您有完整的图像参数,使用第二组函数;如果您需要更灵活的参数控制,使用第三组函数。

  4. 对于特定的buffer类型(如GraphicBuffer或AHardwareBuffer),使用专门的导入函数可以简化操作并提高效率。

  5. 请确保在使用完毕后正确释放导入的buffer,以避免内存泄漏。

以下是 `rockchip_drm_init` 函数的代码框图及详细说明: ```mermaid graph TB A[rockchip_drm_init] --> B[drm_dev_init] B --> C[drm_mode_config_init] B --> D[drm_vblank_init] A --> E[rockchip_drm_encoder_init] A --> F[rockchip_drm_connector_init] A --> G[rockchip_drm_crtc_init] A --> H[drm_irq_install] A --> I[drm_dev_register] subgraph 编码器初始化 E --> E1[HDMI编码器初始化] E --> E2[LVDS编码器初始化] E --> E3[DP编码器初始化] end subgraph 连接器初始化 F --> F1[HDMI连接器初始化] F --> F2[LVDS连接器初始化] F --> F3[DP连接器初始化] end subgraph CRTC初始化 G --> G1[HDMI CRTC初始化] G --> G2[LVDS CRTC初始化] G --> G3[DP CRTC初始化] end ``` 详细说明如下: 1. `rockchip_drm_init` 函数首先调用 `drm_dev_init` 函数来初始化 DRM 设备结构体 `drm_device`。该函数会创建并初始化一个 `drm_device` 结构体,并为其分配设备节点和设备文件操作集等资源。 2. 接着,`rockchip_drm_init` 函数调用 `drm_mode_config_init` 函数来初始化 `drm_device` 中的 `mode_config` 数据结构,该结构体用于管理显示模式信息。该函数会创建并初始化一个 `drm_mode_config` 结构体,并为其分配显示模式信息等资源。 3. `rockchip_drm_init` 函数接着调用 `drm_vblank_init` 函数来初始化 `drm_device` 中的垂直同步信号(VBlank)管理器。该管理器用于处理垂直同步信号相关的事件,例如垂直同步中断和垂直同步定时器。 4. `rockchip_drm_init` 函数接着调用 `rockchip_drm_encoder_init` 函数来初始化所有的编码器。该函数会遍历所有支持的编码器,并分别调用对应的初始化函数来初始化编码器相关的数据结构。 5. `rockchip_drm_init` 函数接着调用 `rockchip_drm_connector_init` 函数来初始化所有的连接器。该函数会遍历所有支持的连接器,并分别调用对应的初始化函数来初始化连接器相关的数据结构。 6. `rockchip_drm_init` 函数接着调用 `rockchip_drm_crtc_init` 函数来初始化所有的 CRTC。该函数会遍历所有支持的 CRTC,并分别调用对应的初始化函数来初始化 CRTC 相关的数据结构。 7. `rockchip_drm_init` 函数接着调用 `drm_irq_install` 函数来注册中断处理程序。该函数会向内核注册一个中断处理函数,用于处理显示器相关的中断事件。 8. 最后,`rockchip_drm_init` 函数调用 `drm_dev_register` 函数来注册 DRM 设备。该函数会创建 `/dev/dri/cardX` 设备文件,并将其挂载到文件系统中,以便用户空间程序可以使用标准的文件操作接口来访问 DRM 设备。 需要注意的是,上述代码框图只是对 `rockchip_drm_init` 函数的主要流程进行了概括,实际上该函数还包括了一些错误处理、内存释放等操作。在实际使用中,需要仔细阅读该函数的源代码,以便了解其具体实现和细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jcfszxc

赏我点铜板买喵粮吃吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值