假设我使用
映射缓冲区 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
?
答案 0 :(得分:4)
根据spec,您所做的只是未定义的行为。
MapBufferRange返回的指针值不能作为参数传递 GL命令的值。例如,它们可能不用于指定数组 指针,或指定或查询像素或纹理图像数据;这样 虽然实现可能不会产生不确定的结果 出于性能原因检查此类行为。
让我引用GL_ARB_vertex_buffer_object扩展规范,它最初引入了缓冲区对象和映射操作(强调我的):
在映射至少一个缓冲区对象时是否禁止任何GL命令?
决议:不。通常,应用程序可以使用任何GL 映射缓冲区时希望得到的命令。但是,有几个 对申请的其他限制确实适用: 应用程序不得尝试从中获取数据或从中获取数据 data into,当前映射的缓冲区。 此外, 应用程序可能不会使用Map返回的指针作为 GL命令的参数。 (请注意,最后一个限制不太可能强制执行 实践,但它违反了对如何做的合理期望 应该使用扩展,它似乎不是一个非常 无论如何有趣的使用模型。地图是给用户的,不是 对于GL。)