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



假设我用映射一个缓冲区

map_ptr = glMapBuffer (..)(目标应该不重要,但我们说它是GL_TEXTURE_BUFFER(

接下来我上传纹理数据与:

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

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

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

这个实现的答案取决于它吗?这是否取决于OpenGL驱动程序是否足够智能,可以将传递给glTexImage2D的数据指针识别为GPU内存映射指针,以及是否不需要往返CPU?如果是这样的话,这一功能在当今流行的驱动程序中有多普遍?

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

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

CCD_ 7传给CCD_?

根据规范,您在那里所做的只是未定义的行为

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

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

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

决议:否。一般来说,应用程序可以使用任何GL当缓冲区被映射时,他们希望使用的命令。然而应用程序的其他限制确实适用:应用程序不得尝试从中获取数据或接收数据将数据映射到当前映射的缓冲区中此外应用程序不能将Map返回的指针用作GL命令的参数。(请注意,最后一项限制不太可能在实践,但它违反了关于如何应该使用扩展名,但它似乎不是有趣的使用模型。地图是给用户的,而不是对于GL。(

最新更新