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 就不会出现这些问题。
此致
View full article