cudaGraphicsResourceGetMappedPointer返回“未知错误”

时间:2012-02-23 03:42:31

标签: opengl interop cuda

我正在创建一个像这样的OpenGL纹理:

glGenTextures( 1, &boardTex );
glBindTexture( GL_TEXTURE_2D, boardTex );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, NULL);

我在board得到一个句柄,所以我假设纹理已成功创建。我想与CUDA共享这个纹理,所以我注册并映射资源:

cudaGLSetGLDevice(0);
cudaGraphicsGLRegisterImage( &boardImage, boardTex, GL_TEXTURE_2D, cudaGraphicsMapFlagsNone );
cudaGraphicsMapResources( 1, &boardImage, 0 );

然后我尝试像这样获取映射指针:

float4* mappedPointer;
size_t mappedSize;
cudaGraphicsResourceGetMappedPointer( (void**)&mappedPointer, &mappedSize, boardImage );

不幸的是,此调用返回错误并拒绝工作。为了以防万一,我确保纹理没有绑定在OpenGL上下文中。还是行不通。 cudaGetErrorString会产生“未知错误”所以我非常困在这里。我很欣赏任何想法。

1 个答案:

答案 0 :(得分:5)

好的,我自己发现了这个:

cudaGraphicsSubResourceGetMappedArray (&array, resource, 0, 0);返回cudaArray即可使用。我还没有考虑cudaArray的工作方式(我最终可能会使用公益组织),但至少它没有崩溃。

编辑:

来自cudaGraphicsResourceGetMappedPointer()的CUDA参考指南:

  

如果资源不是缓冲区,则无法通过指针访问它   并返回cudaErrorUnknown。

来自cudaGraphicsSubResourceGetMappedArray()的CUDA参考指南:

  

如果资源不是纹理,则无法通过数组访问它   并返回cudaErrorUnknown。

换句话说,对映射的缓冲区对象使用GetMappedPointer。将GetMappedArray用于映射的纹理对象。