您好,
,当从 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 缓冲区有什么建议吗?
谢谢您的帮助。
如果可以帮助某人,我们找到的解决方案是使用 G2D 设备将图像从 GPU 3D 复制到 CPU。
我们的输油管道现在 :
使用此管道,我们可以捕获 1200 万像素的视频,并以 30FPS 的速度对其进行处理。
很抱歉这么晚才回复您。
我们的性能问题似乎与使用 glReadPixels 函数将图像从 GPU 传输到 CPU 的过程有关。
我们可以通过使用 eglSwapBuffers 来改进这一过程,从而解决性能问题。
iMX8MP 上有这方面的信息或特殊方法吗?
您好,
对于 2D 32K x 32K 坐标系,但缓冲区取决于 RAM,所以应该没有问题。因此,请将您的应用程序代码发送给我们,以便在此重现并进行检查。
此致
谢谢您的回答。我使用的是 i.MX8MP。
如果没有限制,您是否有一些关于如何正确操作的建议?我们认为,4048x3040(1200 万像素)的分辨率可能有点过高,一些内部传输(DMA 或非 DMA)可能会导致我们注意到的帧速率下降。
你好
你在使用什么设备?
使用 i.MX6 时,会出现一些与您的应用程序有关的问题,但使用 i.MX8 就不会出现这些问题。
此致