将可见帧缓冲区读取到像素缓冲区对象

时间:2014-05-23 17:12:14

标签: c++ opengl cuda gpu

我尝试捕获屏幕截图并对它们进行一些操作。 我的目标是尽可能少地使用CPU并利用GPU,因此我想使用CUDA进行图像处理。

截至目前,我正在使用Windows API(StretchBlt和GetDIBits)将帧缓冲区复制到RAM,并使用cudaMemcpy将其复制到VRAM。

这些内存副本使用CPU,每秒复制多帧时,它会占用大量CPU资源。 这就是为什么我想将帧缓冲区直接复制到VRAM以供CUDA使用。

我发现了一种使用OpenGL PBO的技术,如下所述:http://gravisma.zcu.cz/GraVisMa-2010/Papers/Poster/F13-full.pdf听起来可能就是这样做。

是否有这种事情的例子?

编辑:

我也发现了这个:http://www.songho.ca/opengl/gl_pbo.html。 它说:

  

“PBO的主要优点是快速像素数据传输到和来自   显卡通过DMA(直接内存访问)而不涉及CPU   周期。而且,PBO的另一个优点是异步DMA传输。“

所以看起来PBO看起来是正确的方向,但我真的不确定如何做到这一点。

请举例说明源代码?

平台:Windows XP(仅限win32)

1 个答案:

答案 0 :(得分:3)

如果您需要在CUDA中处理屏幕截图,为什么不使用OpenGL互操作?这使您可以将纹理/缓冲区读取为图像。这样,所有数据都保留在GPU上,CPU永远不会被使用。

稍后,您可以将纹理映射到CPU内存/固定内存并将其保存到文件中(因为您需要截屏)。传输将在DMA和CPU也不参与的情况下发生。