Opengl 将缓冲区内存映射指针传递到glTex(Sub)Image2D。纹理上传是异步的吗?

Opengl 将缓冲区内存映射指针传递到glTex(Sub)Image2D。纹理上传是异步的吗?,opengl,textures,buffer,opencl,dma,Opengl,Textures,Buffer,Opencl,Dma,假设我映射一个缓冲区,使用 map\u ptr=glMapBuffer(..)(目标应该无关紧要,但假设其GL\u纹理\u缓冲区) 接下来,我上传纹理数据,包括: glTexImage2D(…,map_ptr),将map_ptr作为我的纹理数据传递。(我没有GL\u像素\u解包\u缓冲区绑定) 从语义上讲,这涉及到将数据从缓冲区的数据存储复制到纹理对象的数据存储,并且该操作可以通过GPU DMA复制来完成 但实际发生了什么?数据是完全在GPU上复制的,还是CPU读取并缓存映射的内存,然后在单独的

假设我映射一个缓冲区,使用

map\u ptr=glMapBuffer(..)
(目标应该无关紧要,但假设其
GL\u纹理\u缓冲区

接下来,我上传纹理数据,包括:

glTexImage2D(…,map_ptr)
,将map_ptr作为我的纹理数据传递。(我没有
GL\u像素\u解包\u缓冲区
绑定)

从语义上讲,这涉及到将数据从缓冲区的数据存储复制到纹理对象的数据存储,并且该操作可以通过GPU DMA复制来完成

但实际发生了什么?数据是完全在GPU上复制的,还是CPU读取并缓存映射的内存,然后在单独的GPU内存位置写回GPU?即,复制是异步的,还是CPU利用CPU周期同步协调复制

答案是否取决于实现?它是否取决于OpenGL驱动程序是否足够智能,能够识别传递给
glTexImage2D
的数据指针是GPU内存映射指针,并且不需要往返CPU?如果是的话,这一特征在当今流行的驾驶者中有多普遍

此外,内存已映射的OpenCL缓冲区的行为如何,即:

map\u ptr=clEnqueueMapBuffer(..)
(OpenCL缓冲区映射内存)


并且
map\u ptr
被传递到
glTexImage2D

您所做的只是根据

MapBufferRange返回的指针值不能作为参数传递 GL命令的值。例如,它们可能不用于指定数组 指针,或指定或查询像素或纹理图像数据;这样的 操作会产生未定义的结果,尽管实现可能不会 出于性能原因检查此类行为

让我引用扩展规范,它最初引入了缓冲区对象和映射操作(emphasis mine):

至少映射一个缓冲区对象时,是否不允许使用任何GL命令

已解决:否。一般来说,应用程序可以使用任何GL 映射缓冲区时所需的命令。然而,有几个 对应用程序的其他限制也适用: 应用程序不得尝试从源或接收器中获取数据 将数据导入当前映射的缓冲区此外 应用程序不能将映射返回的指针用作 GL命令的参数。 (请注意,最后一项限制不太可能在 实践,但它违反了关于如何进行的合理预期 应该使用扩展,而且它似乎不是一个很好的解决方案 无论如何,这是一个有趣的使用模型。地图是给用户的,而不是给用户的 对于德国劳埃德船级社。)


谢谢所以我想实现缓冲区到纹理“转换”的最好方法就是简单地使用缓冲区纹理(由缓冲区支持的纹理)?@Protongun:取决于用例。TBO与纹理完全不同,也就是说,您只能直接从中提取,但不能使用过滤器和包裹模式从中实际采样。在内部,数据布局将完全不同。但是,如果您想将某个缓冲区的内容用作真实纹理,则始终可以将该缓冲区绑定为
GL\u PIXEL\u UNPACK\u buffer
,以直接从中获取
glTexImage*
数据。