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

时间:2014-08-06 18:25:51

标签: opengl textures buffer opencl dma

假设我使用

映射缓冲区

map_ptr = glMapBuffer (..)(目标不重要,但让我们说GL_TEXTURE_BUFFER

接下来我上传纹理数据:

glTexImage2D(..., map_ptr),将map_ptr作为我的纹理数据传递。 (我没有GL_PIXEL_UNPACK_BUFFER界限

从语义上讲,这涉及将数据从缓冲区的数据存储复制到纹理对象的数据存储,并且可以使用GPU DMA副本完成操作。

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

该实现的答案是否依赖?是否取决于OpenGL驱动程序是否足够智能以识别传递给GPU内存映射指针的glTexImage2D的数据指针,以及是否不需要往返CPU?如果是这样,今天流行的驱动程序中这个功能有多常见?

另外,对于内存映射的OpenCL缓冲区的行为如何,例如:

map_ptr = clEnqueueMapBuffer(..)(OpenCL缓冲区映射内存)

并且map_ptr已传递给glTexImage2D

1 个答案:

答案 0 :(得分:4)

根据spec,您所做的只是未定义的行为

  

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

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

  

在映射至少一个缓冲区对象时是否禁止任何GL命令?

     

决议:不。通常,应用程序可以使用任何GL   映射缓冲区时希望得到的命令。但是,有几个   对申请的其他限制确实适用:   应用程序不得尝试从中获取数据或从中获取数据   data into,当前映射的缓冲区。 此外,   应用程序可能不会使用Map返回的指针作为   GL命令的参数。   (请注意,最后一个限制不太可能强制执行   实践,但它违反了对如何做的合理期望   应该使用扩展,它似乎不是一个非常   无论如何有趣的使用模型。地图是给用户的,不是   对于GL。)