Toybrick

楼主: jefferyzhang

RK3399Pro入门教程(5)图形加速引擎RGA的使用

 

zhanggf

新手上路

积分
32
发表于 2022-4-25 05:01:32 | 显示全部楼层
请问我想将摄像头获取的两帧数据做异或运算。执行improcess_t报错Device or resource busy,请问是什么情况?执行imstatus = imcopy(rga_pre,rga_out);也会有同样的报错。

以下是错误打印:
RgaBlit(1387) RGA_BLIT fail: Device or resource busy
RgaBlit(1388) RGA_BLIT fail: Device or resource busy
fd-vir-phy-hnd-format[10, (nil), (nil), (nil), 0]
rect[0, 0, 1920, 1080, 1920, 1080, 512, 0]
f-blend-size-rotation-col-log-mmu[0, 0, 0, 0, 0, 0, 1]
fd-vir-phy-hnd-format[17, (nil), (nil), (nil), 0]
rect[0, 0, 1920, 1080, 1920, 1080, 512, 0]
f-blend-size-rotation-col-log-mmu[0, 0, 0, 0, 0, 0, 1]
This output the user patamaters when rga call blit fail
srect[x,y,w,h] = [0, 0, 0, 0] src[w,h,ws,hs] = [1920, 1080, 1920, 1080]

drect[x,y,w,h] = [0, 0, 0, 0] dst[w,h,ws,hs] = [1920, 1080, 1920, 1080]

usage[0x80000]

以下是代码:
            cam_frm_idx = camera_source_get_frame(pcam);
            printf("ncap:%u %d %d\n",Time_GetTickCount(),++ncap,cam_frm_idx);  
            if(cam_frm_idx_pre != -1)
            {
                if(outbuffer == NULL)
                    mpp_buffer_get(group,&outbuffer,pfmt->fmt.pix.width*pfmt->fmt.pix.height*3);

                MppBuffer prebuffer = camera_frame_to_buf(pcam, cam_frm_idx_pre);
                MppBuffer curbuffer = camera_frame_to_buf(pcam, cam_frm_idx);

                int pre_fd = mpp_buffer_get_fd(prebuffer);
                int cur_fd = mpp_buffer_get_fd(curbuffer);
                int out_fd = mpp_buffer_get_fd(outbuffer);
                rga_buffer_t rga_pre = wrapbuffer_fd(pre_fd, pfmt->fmt.pix.width,pfmt->fmt.pix.height, RK_FORMAT_RGB_888);
                rga_buffer_t rga_cur = wrapbuffer_fd(cur_fd, pfmt->fmt.pix.width,pfmt->fmt.pix.height, RK_FORMAT_RGB_888);
                rga_buffer_t rga_out = wrapbuffer_fd(out_fd, pfmt->fmt.pix.width,pfmt->fmt.pix.height, RK_FORMAT_RGB_888);


                IM_STATUS imstatus;
                {
                    im_opt_t opt;
                    int out_fence_fd;
                    im_rect srect;
                    im_rect drect;
                    im_rect prect;

                    empty_structure(NULL, NULL, NULL, &srect, &drect, &prect, &opt);
                    imstatus = improcess_t(rga_pre, rga_cur, rga_out, srect, drect, prect, -1, &out_fence_fd, &opt, IM_ALPHA_BLEND_XOR);
                }
                printf("imstatus xor:%u %d\n",Time_GetTickCount(),imstatus);

                printf("push back:%d\n",cam_frm_idx_pre);
                camera_source_put_frame(pcam, cam_frm_idx_pre);
            }
回复

使用道具 举报

ozgaga

注册会员

积分
63
发表于 2022-5-21 18:02:43 | 显示全部楼层
本帖最后由 ozgaga 于 2022-5-21 18:03 编辑

在RV1126上做图像降噪等处理(基于OpenCV,不知有没有更好的方案),但是RV1126的CPU似乎有点弱(bogomips仅100出头,四个核加起来500不到),处理起来非常慢
可以考虑使用CPU+RGA处理吗,不知道RGA能否做图像的卷积、加、减、点乘等操作,不知道RGA能接受多大的工作量
还有就是NPU能否用来做常规的图像处理
回复

使用道具 举报

848451399

新手上路

积分
26
发表于 2022-6-16 15:48:08 | 显示全部楼层
请问有rga的源码吗,我的是3399pro板子,但是使用rga库的时候会报"/lib/aarch64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found (required by librga.so)
"这个错,需要用源码重新编译一个库才能使用吗?
回复

使用道具 举报

jefferyzhang

版主

积分
13606
 楼主| 发表于 2022-6-17 08:46:25 | 显示全部楼层
848451399 发表于 2022-6-16 15:48
请问有rga的源码吗,我的是3399pro板子,但是使用rga库的时候会报"/lib/aarch64-linux-gnu/libm.so.6: vers ...

https://github.com/airockchip/librga
回复

使用道具 举报

848451399

新手上路

积分
26
发表于 2022-6-17 10:31:34 | 显示全部楼层
本帖最后由 848451399 于 2022-6-17 10:35 编辑

我用的就是这里面的库.开发的时候用这个库会提示librga.so: undefined reference to `log@GLIBC_2.29'
回复

使用道具 举报

hjj414

注册会员

积分
150
发表于 2022-11-5 16:37:40 | 显示全部楼层
848451399 发表于 2022-6-17 10:31
我用的就是这里面的库.开发的时候用这个库会提示librga.so: undefined reference to `' ...

我的Ubuntu18.04的系统也有这个问题,通过下面的方式暂时能用了,
1. 下载glibc-2.29,交叉编译好,
2. 把编译出的libm-2.29.so放到板上,
3. 将libm.so.6链接到这个文件,就可以用librga.so的库了;
理论上GLIBC会兼容旧版本的,目前只替换了libm库,不知道对板上的其他应用有没有影响。。。
回复

使用道具 举报

cang_rong

新手上路

积分
36
发表于 2022-12-3 14:22:32 | 显示全部楼层
我在rk3588上调试rga填充图像,调试代码来自https://github.com/airockchip/librga
在rgaImDemo.cpp中加入:
STATUS = imconfig(IM_CONFIG_SCHEDULER_CORE, IM_SCHEDULER_RGA3_CORE0);
尝试启动RGA3,结果报错:
//=======================================================================
Start selecting mode 0
im2d fill ..
fill red ...
MODE = 9
[main][289]src_buf addr: 0x7f7ff9d010        dst_buf addr: 0x7f7fc18010
open file
open file
[main][306]src_buf addr: 0x7f7ff9d010        dst_buf addr: 0x7f7fc18010
rga_api version 1.8.1_[0]
651, imconfig return:Run successfully
653, imconfig return:Run successfully
RgaCollorFill(1717) RGA_COLORFILL fail: Invalid argument
RgaCollorFill(1718) RGA_COLORFILL fail: Invalid argument
srect[x,y,w,h] = [0, 0, 0, 0] src[w,h,ws,hs] = [0, 0, 0, 0]

drect[x,y,w,h] = [100, 100, 300, 300] dst[w,h,ws,hs] = [300, 300, 1280, 720]

usage[0x280000]
filling .... cost time 138 us, Fatal error: Failed to call RockChipRga interface, query log to find the cause of failure.
open /usr/data/out0w1280-h720-rgba8888.bin and write ok
//=======================================================================
以上是在16GB的开发板上的调试结果,在4GB的开发板上可以正确执行。
查阅文档可知:
**A1.8:**由于目前RGA1/RGA2的MMU仅支持最大32位的物理地址,所以当在搭载4G以上DDR的设备中,传给RGA大于4G内存空间的buffer时,RGA驱动会通过dma接口将高位地址的内存里的数据拷贝至swiotlb预留的低位内存上,并返回对应的地址以供RGA读写,RGA工作结束后再通过dma将结果拷贝至原本的高位目标地址上,因此增加了CPU的介入,导致librga整体的工作时间严重增加。对于这种仅搭载RGA2/RGA1,并且设备DDR大于4G的情况,建议调用RGA时使用低于4G空间的内存,保证RGA的效率。

问题:
在rk3588j 16GB的板卡上如何正确使用RGA3?
回复

使用道具 举报

lwb

新手上路

积分
40
发表于 2023-1-9 14:47:43 | 显示全部楼层
本帖最后由 lwb 于 2023-1-9 16:20 编辑

RK3568  Android使用Mediacodec + OpenGLES已经实现了多路视频解码渲染。有两个疑问:
1、OpenGL中的硬件加速使用就是RGA  ?
2、RGA属于GPU类型?3、现在想用mpp+rga来实现多路视频解码渲染,伦理上会有更好的性能吗?

回复

使用道具 举报

richard

注册会员

积分
60
发表于 2023-2-3 11:25:29 | 显示全部楼层
请问rga->go这套接口和imcvtcolor这两套接口有什么区别呢
回复

使用道具 举报

jefferyzhang

版主

积分
13606
 楼主| 发表于 2023-2-3 11:59:38 | 显示全部楼层
richard 发表于 2023-2-3 11:25
请问rga->go这套接口和imcvtcolor这两套接口有什么区别呢

第一个很老了,不再支持;
请用第二个。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表