Problems with Qt/OpenGL linked with CUDA library
I have a project where I have to create a library in CUDA and link it into my Qt/OpenGL application.
- loading in Qt/OpenGL an image
- give it to the library (in a way, right now I'm giving the textureId() of my QOpenGLWidget)
- apply a sobel filter in my CUDA code
- return the result (in a way, I do not know what and how to link it in OpenGL)
- display it in Qt/OpenGL
A lot of my Qt/OpenGL code is based on the cube example: http://qt-project.org/doc/qt-4.8/opengl-cube.html
I am getting a lot of problems when I'm trying to link it.
How am I supposed to link the result in Qt/OpenGL ?
I'm getting a freezed windows or the original image (when I remove the "Unmap function from my CUDA code") but I never got my image with the sobel filter on it.
Thank you for your help,
Note: I'm not familiar at all with CUDA and OpenGL so sorry if it is silly questions....
Can you share the code you are using ? Also which version of Qt/CUDA/OpenGL are you using ?
I'm using Qt 5.4.0, OpenGL ES 2.0 and CUDA 6.5.
Which part do you want exactly ? I have a lot of different version as I am having some problems with it but all my Qt/OpenGL code is the same than the Cube example (just using a square instead of a cube, it's the only modification I have done).
At the moment, I'm trying to get a pointer of the CUDA result but I have no idea how to use it in my Qt/OpenGL code and if it is the good way of doing it.
Here the part where I am calling the CUDA library:
@ unsigned char * resultPointer = CUDA_library_processing(m_texture->textureId(), width, height);
where m_texture is my QOpenGLTexture.
Here the CUDA part:
unsigned char* CUDA_library_processing(int opengl_buffer, int width, int height)
struct cudaGraphicsResource * cuda_vbo_resource = 0;
cudaGraphicsGLRegisterBuffer(&cuda_vbo_resource, opengl_buffer, cudaGraphicsRegisterFlagsNone);
cudaGraphicsMapResources(1, &cuda_vbo_resource, 0);
size_t num_bytes = 0;
unsigned char * dev_pointer = 0;
cudaGraphicsResourceGetMappedPointer((void**)dev_pointer, &num_bytes, cuda_vbo_resource);
unsigned char * result_pointer = 0;
cudaMalloc((void **) &result_pointer, (num_bytes));
unsigned char * respointer = (unsigned char *) malloc(num_bytes);
sobelfilter(width, height, dev_pointer, result_pointer);
cudaMemcpy((void**)respointer, (void**)result_pointer, num_bytes, cudaMemcpyDeviceToHost);
cudaGraphicsUnmapResources(1, &cuda_vbo_resource, 0));
Is it a typo or are you missing a & before dev_point in cudaGraphicsResourceGetMappedPointer ?
You seem to be also mis-typecasting respointer and result_pointer in cudaMemcpy
The CUDA section in the article http://blog.qt.io/blog/2015/03/03/qt-weekly-28-qt-and-cuda-on-the-jetson-tk1/ may give an idea how this could be achieved.