我在访问 CUDA 缓冲区时遇到问题:我注册了一个 OpenGL 缓冲区以将其与 CUDA 一起使用,cudaGraphicsGLRegisterBuffer() 没有返回错误(即 cudasucess),但是当我想用 cudaGraphicsMapResources() 映射我的 PBO 时,我得到“cudaErrorMapBufferObjectFailed”。
这是我的代码(简化但包含相关部分):
在 .h 文件中
GLuint bufferID;
struct cudaGraphicsResource* PBO_CUDA_Widget;
在 .cpp 文件中
void HDR_GLWidget::initializeGL()
{
cutilSafeCall(cudaGLSetGLDevice(cutGetMaxGflopsDeviceId()));
// create pixel buffer object
glGenBuffersARB(1, &bufferID);
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, bufferID);
glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, width * height * 4, NULL, GL_STREAM_DRAW_ARB);
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
cudaError_t error_test = cudaGraphicsGLRegisterBuffer(&PBO_CUDA_Widget, bufferID, cudaGraphicsMapFlagsWriteDiscard); //no cuda error here
}
void HDR_GLWidget::uploadBuffer
{
cudaError_t error_test = cudaGraphicsMapResources(1, &PBO_CUDA_Widget, 0); //crash here
[...]
}
这是我得到的错误:
First-chance exception at 0x000007fefd47bccd in IHM_Qt_TM_cuda.exe: Microsoft C++ exception: cudaError_enum at memory location 0x073ff200..
我在 GTX580 上装有 Windows 7、CUDA 4.2 的 x64 机器上。
编辑:这是修改后的代码
在 .h 文件中
cudaGraphicsResource* PBO_CUDA_Widget;
GLuint bufferID;
在 .cpp 文件中
void HDR_GLWidget::initializeGL()
{
cutilSafeCall(cudaGLSetGLDevice(cutGetMaxGflopsDeviceId()));
GLenum err = glewInit();
glGenBuffers(1, &bufferID);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, bufferID);
glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, width * height * 4, NULL, GL_STREAM_DRAW);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
cutilSafeCall(cudaMalloc((void**) PBO_CUDA_Widget, width * height * sizeof(uchar4)));
cudaError_t error_reg = cudaGraphicsGLRegisterBuffer((cudaGraphicsResource **)PBO_CUDA_Widget, bufferID, cudaGraphicsMapFlagsWriteDiscard);
}
void HDR_GLWidget::uploadBuffer()
{
cudaError_t error_map = cudaGraphicsMapResources(1, (cudaGraphicsResource_t*)PBO_CUDA_Widget, 0); //error here
[...]
cudaError_t flag_unmap = cudaGraphicsUnmapResources(1, (cudaGraphicsResource_t*)PBO_CUDA_Widget, 0);
}