修改opengl使用的纹理安全吗?
我有一个应用程序,它使用Ogre引擎进行渲染(OpenGL)。有一个纹理绑定到管道。还有一个CUDA调用可以修改纹理。基本上是这样的:修改opengl使用的纹理安全吗?,opengl,cuda,Opengl,Cuda,我有一个应用程序,它使用Ogre引擎进行渲染(OpenGL)。有一个纹理绑定到管道。还有一个CUDA调用可以修改纹理。基本上是这样的: cudaGraphicsMapResources(tex); // call cuda kernel that writes to te texture cudaGraphicsUnmapResources(tex); 这有多安全?CUDA是否可能更新OpenGL当前使用的纹理?我不知道OpenGL,但知道其他API。在DirExtx12或vulkan中,
cudaGraphicsMapResources(tex);
// call cuda kernel that writes to te texture
cudaGraphicsUnmapResources(tex);
这有多安全?CUDA是否可能更新OpenGL当前使用的纹理?我不知道OpenGL,但知道其他API。在DirExtx12或vulkan中,我需要为这种工作设置屏障或其他同步机制。但另一方面,DirectX 11允许安全地更新映射资源,因为它在API中具有同步功能。这样做应该是安全的,主要是因为OpenGL在GPU中存储所有相关的缓冲区和ID。但是请注意,您可能无法更新绑定到GPU的纹理。只要纹理映射到CUDA资源,任何在OpenGL端进行读取或写入的尝试都将导致未定义的结果。中有明确说明。谢谢。事实上,这些东西是有效的,但我想确定没有未定义的行为。您能提供一个链接到说明此保证的文档或其他资源吗?是的,我看到了这一段-
注册资源的图形API在CUDA映射时不应访问任何资源。
。但这意味着什么——通过API访问资源。在映射和取消映射之间,我不会调用任何OpenGL。CUDA内核不会与OpenGL管道同步运行。此外,CUDA或GL也可能在单独的线程中运行。这意味着,当纹理仍映射到CUDA上下文时,可以从GL侧访问纹理。不要这样做。另一方面,您引用的同一文档说,该函数提供了同步保证,在cudaGraphicsMapResources()之前发出的任何图形调用将在流中发出的任何后续CUDA工作开始之前完成。
听起来CUDA与OpenGL进行了同步。