在没有上下文共享的情况下,在两个上下文之间共享纹理/图像的最佳方法是什么?

时间:2015-04-29 07:06:08

标签: opengl

我想要做的是从一个上下文中获取渲染结果,并在另一个不与前一个上下文共享的上下文中进行进一步渲染。

我能想到的唯一方法是使用像API这样的glReadPixels将渲染结果从GPU内存复制到系统内存,并在另一个上下文中使用复制的数据。

有更好的方法吗?我的意思是不将数据从GPU内存复制到系统内存,系统再次复制到GPU。

我在Linux下使用GLX。

3 个答案:

答案 0 :(得分:3)

我不知道如何正确分享它们。我能找到的最接近GLX的是GLX_NV_copy_image扩展名。在介绍中,它说:

  

WGL和GLX版本允许在不同上下文中的图像之间进行复制,即使这些上下文位于不同的共享列表中,甚至在不同的物理设备上也是如此。

使用此扩展程序,您可以使用glXCopyImageSubDataNV()函数从一个上下文复制到另一个上下文。虽然这不允许共享,但它可能仍然比自己复制数据快得多。

正如您已经从名称中所知,这是特定于供应商的扩展。我不知道它得到了多大的支持,但你当然不应指望它存在于所有系统中。

其他窗口系统绑定具有甚至在进程之间共享图像的机制。例如。使用与OpenGL ES一起使用的EGL,EGLImage可用于此目的。但是通过浏览GLX规范和扩展列表,我无法发现类似的内容。

答案 1 :(得分:2)

如果黑客正常,您可以使用CUDA或OpenCL。仅适用于支持CUDA或OpenCL的GPU。

答案 2 :(得分:2)

还有一些AMD扩展可能与此版本有关:WGL_AMD_gpu_associationGLX_AMD_gpu_association

虽然此扩展的重点是将GL上下文分配给特定的GPU并在GPU之间有效地复制数据,但它对同一GPU上的两个上下文也很有用:

  

为了提供从一个上下文到另一个上下文数据的加速路径,添加了新的blit函数blitContextFramebufferAMD。

这些扩展以及使用它们的一些同步技术在this AMD whitepaper中有更详细的介绍。