【问题标题】:Is it safe to modify the texture used by opengl?修改opengl使用的纹理是否安全?
【发布时间】:2017-12-01 10:29:41
【问题描述】:

我有一个使用 Ogre 引擎进行渲染 (OpenGL) 的应用程序。有一个绑定到管道的纹理。还有一个 CUDA 调用可以修改该纹理。基本上是这样的:

cudaGraphicsMapResources(tex);

// call cuda kernel that writes to te texture

cudaGraphicsUnmapResources(tex);

这有多安全? CUDA 是否有可能更新 OpenGL 当前使用的纹理?我不知道 OpenGL,但知道其他 API。在 DirextX 12 或 vulkan 中,我需要为此类工作设置障碍或其他同步机制。但另一方面,DirectX 11 允许安全地更新映射资源,因为它在 API 内部进行了同步。

【问题讨论】:

    标签: opengl cuda


    【解决方案1】:

    这样做应该是安全的,主要是因为 OpenGL 将所有相关的缓冲区和 ID 存储在 GPU 中。但请注意,您可能无法更新绑定到 GPU 的纹理。

    【讨论】:

    • 谢谢。实际上这些东西有效,但我想确保没有未定义的行为。您能否提供解释此保证的文档或其他资源的链接?
    【解决方案2】:

    只要纹理映射到 CUDA 资源,任何在 OpenGL 端读取或写入的尝试都会导致未定义的结果。在CUDA docs 中有明确说明。

    【讨论】:

    • 是的,我看到了这一段 - The graphics API from which resources were registered should not access any resources while they are mapped by CUDA.。但这意味着什么 - 通过 API 访问资源。在映射和取消映射之间,我没有调用任何 OpenGL。
    • CUDA 内核与 OpenGL 管道不同步运行。此外,CUDA 或 GL 可能在单独的线程中运行。这意味着,当它仍然映射到 CUDA 上下文时,可以潜在地从 GL 端访问纹理。不要那样做。
    • 另一方面,您引用的同一文档说 the function provides the synchronization guarantee that any graphics calls issued before cudaGraphicsMapResources() will complete before any subsequent CUDA work issued in stream begins. 听起来 CUDA 与 OpenGL 同步。
    猜你喜欢
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2011-08-22
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多