我正在创建一个像这样的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
会产生“未知错误”所以我非常困在这里。我很欣赏任何想法。
答案 0 :(得分:5)
好的,我自己发现了这个:
cudaGraphicsSubResourceGetMappedArray (&array, resource, 0, 0);
返回cudaArray
即可使用。我还没有考虑cudaArray
的工作方式(我最终可能会使用公益组织),但至少它没有崩溃。
编辑:
来自cudaGraphicsResourceGetMappedPointer()
的CUDA参考指南:
如果资源不是缓冲区,则无法通过指针访问它 并返回cudaErrorUnknown。
来自cudaGraphicsSubResourceGetMappedArray()
的CUDA参考指南:
如果资源不是纹理,则无法通过数组访问它 并返回cudaErrorUnknown。
换句话说,对映射的缓冲区对象使用GetMappedPointer。将GetMappedArray用于映射的纹理对象。