2155379_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2155379_zh-CN

2155379_zh-CN

i.MX8MP - 在 V4L2 和 OpenGL 之间共享 G2D 缓冲区时的性能问题

您好,

,当从 V4L2 直接向 OpenGL(GPU GC7000UL)共享高分辨率(4048 x 3040 : 12 MP)的 G2D 缓冲区时,我遇到了一个问题。

下面是我的应用程序的伪代码。

我正在分配 g2d_buffers(4048x3040,YUYV)并保存文件描述符。

struct g2d_buf *_srcBuf = g2d_alloc(4048 * 3040 * 2, true); // cacheable
int g2d_src_buf_fds = g2d_buf_export_fd(&_srcBuf);


然后我使用这个 g2d 文件描述符使用 V4L2 从摄像机设备获取视频帧。

struct v4l2_buffer buf;
buf.memory = V4L2_MEMORY_DMABUF;
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.m.fd = g2d_src_buf_fds;

[...]
ioctl(cam->fd, VIDIOC_QBUF, &buf);
[...]
ioctl(cam->fd, VIDIOC_DQBUF, &buf);

// DMA sync operations
struct dma_buf_sync sync = { 0 };
sync.flags = DMA_BUF_SYNC_START; ioctl(buf_fd, DMA_BUF_IOCTL_SYNC, &sync);
sync.flags = DMA_BUF_SYNC_END ; ioctl(buf_fd, DMA_BUF_IOCTL_SYNC, &sync);

在 OpenGL 方面,我们使用 Vivante 扩展连接到 G2D 缓冲区。

p_glTexDirectVIVMap( GL_TEXTURE_2D,
4048,
3040,
GL_VIV_YUY2,
&_srcBuf->buf_vaddr, // virtual address
(void **)&_srcBuf->buf_paddr // physical address );

工作流程运行正常,因为我们可以在 OpenGL 输出端以正确的帧频(30FPS,即摄像机的帧频)显示图像,但只能在低分辨率(例如 800x600)下显示。

如果我们将分辨率提高到 1200 万像素,就会发现帧速率慢慢下降(当我们使用 4048 x 3040 的全分辨率:1200 万像素时,帧速率下降到 19FPS)。

您对如何共享高分辨率的 g2d 缓冲区有什么建议吗?

谢谢您的帮助。

Re: i.MX8MP - Performance issue when sharing G2D buffers between V4L2 and OpenGL

如果可以帮助某人,我们找到的解决方案是使用 G2D 设备将图像从 GPU 3D 复制到 CPU。

我们的输油管道现在 :

  • V4L2 -> GPU 3D :使用 DMA 缓冲区传输数据
  • 在 G2D 缓冲区中进行 GPU 3D 渲染
  • G2D -> CPU:我们使用 g2d_copy 在 CPU 中获取数据

使用此管道,我们可以捕获 1200 万像素的视频,并以 30FPS 的速度对其进行处理。

Re: i.MX8MP - Performance issue when sharing G2D buffers between V4L2 and OpenGL

很抱歉这么晚才回复您。

我们的性能问题似乎与使用 glReadPixels 函数将图像从 GPU 传输到 CPU 的过程有关。

我们可以通过使用 eglSwapBuffers 来改进这一过程,从而解决性能问题。

iMX8MP 上有这方面的信息或特殊方法吗?

Re: i.MX8MP - Performance issue when sharing G2D buffers between V4L2 and OpenGL

您好,

对于 2D 32K x 32K 坐标系,但缓冲区取决于 RAM,所以应该没有问题。因此,请将您的应用程序代码发送给我们,以便在此重现并进行检查。

此致

Re: i.MX8MP - Performance issue when sharing G2D buffers between V4L2 and OpenGL

谢谢您的回答。我使用的是 i.MX8MP。

如果没有限制,您是否有一些关于如何正确操作的建议?我们认为,4048x3040(1200 万像素)的分辨率可能有点过高,一些内部传输(DMA 或非 DMA)可能会导致我们注意到的帧速率下降。

Re: i.MX8MP - Performance issue when sharing G2D buffers between V4L2 and OpenGL

你好

你在使用什么设备?

使用 i.MX6 时,会出现一些与您的应用程序有关的问题,但使用 i.MX8 就不会出现这些问题。

此致

Tags (1)
No ratings
Version history
Last update:
‎11-23-2025 01:52 AM
Updated by: