我有一个使用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内部具有同步。
答案 0 :(得分:1)
这样做应该是安全的,主要是因为OpenGL在GPU中存储了所有相关的缓冲区和ID。但请注意,您可能无法更新绑定到GPU的纹理。
答案 1 :(得分:1)
只要纹理映射到CUDA资源,任何在OpenGL端读取或写入的尝试都将导致未定义的结果。它在CUDA docs中明确说明。