CUDA + OpenGL Interop without deprecated functionality

c++, cuda, interop, opengl

Solution

You can see on the official example in CUDA 6 SDK, it's called "simpleCUDA2GL" in "3_Imaging" directory. It has two different approaches to access texture inside CUDA kernel. One of them (I think the old one) uses the PBO, and it is 3 times slower on my machine.

Problem

I've previously been able to populate textures in CUDA for use in OpenGL by: - Create and initialize the GL texture (`gl::GenTextures()`, etc.) - Create a GL Pixel Buffer Object - Register the PBO with CUDA In the update/render loop: - `cudaGraphicsMapResource()` with the PBO - Launch the kernel to update the PBO - `cudaGraphicsUnmapResource()` the PBO from CUDA - Load the GL program, bind texture, render as normal - Wash, rinse repeat. However, I'm wondering if PBOs are still the best way to write a texture from a kernel. I've seen articles like this one (updated for v5 here) which don't appear to use PBOs at all. I've seen some references to `cudaTextureObject` and `cudaSurfaceObject`, but their role in OpenGL interop is unclear to me. Are PBOs still the recommended approach? If not, what are the alternatives I should be investigating? (I'm specifically targeting Kepler and newer architectures.)

Original source