是否可以使用pycuda和GL Interop直接修改GL纹理(不使用PBO)?

时间:2016-09-15 22:42:16

标签: opengl interop kivy pycuda

我正在使用kivy的组合进行一些交互式科学可视化,利用pycuda利用NVIDIA的GPU。

我目前正在考虑使用GL Interop功能,以便在我的CUDA代码修改了一个数组后,我可以立即绘制该数组,而无需经历从GPU设备到主机cpu的缓慢过程,以及然后将数据发送回GPU以显示为OpenGL纹理。

在我尝试这样做时,我一直在阅读pycuda互操作示例,例如Sobel filter和更简单的Tea Pot example。在这两个示例中,都使用了像素缓冲对象(PBO)。

据我了解,Kivy目前不支持或使用PBO,因此为了简单起见,我宁愿避免使用PBO,只是让我的CUDA功能直接在OpenGL纹理数据上运行。这可能吗?这是个坏主意吗?

我目前尝试注册可供CUDA访问的纹理的片段如下所示:

    self.cuda_access = pycuda.gl.RegisteredImage(texture_id, GL_TEXTURE_2D)
    self.mapping_obj = self.cuda_access.map() 
    self.data, self.sz = self.mapping_obj.device_ptr_and_size()

...但是在最后一行,我收到以下错误

pycuda._driver.LogicError: cuGraphicsResourceGetMappedPointer failed: resource not mapped as pointer

......我不知道该如何说服。

非常感谢提前。

0 个答案:

没有答案