我正在创建这样的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会产生“未知错误”,所以我被困在这里了。如果有任何想法我会很感激。
发布于 2012-02-23 05:02:05
好吧,我自己发现的:
cudaGraphicsSubResourceGetMappedArray (&array, resource, 0, 0);返回要使用的cudaArray。我还没有想到cudaArray的工作方式(我可能最终会使用PBO),但至少它没有崩溃。
编辑:
来自cudaGraphicsResourceGetMappedPointer()的数据自动化系统参考指南条目
如果资源不是缓冲区,则不能通过指针访问它,并返回cudaErrorUnknown。
来自cudaGraphicsSubResourceGetMappedArray()的数据自动化系统参考指南条目
如果资源不是纹理,则不能通过数组访问它,并且返回cudaErrorUnknown。
换句话说,对映射的缓冲区对象使用GetMappedPointer。对映射的纹理对象使用GetMappedArray。
https://stackoverflow.com/questions/9406844
复制相似问题