Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
修改opengl使用的纹理安全吗?_Opengl_Cuda - Fatal编程技术网

修改opengl使用的纹理安全吗?

修改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中,

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

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进行了同步。