Vulkan Cookbook 第四章 12 在缓冲区之间复制数据

在缓冲区之间复制数据

在Vulkan中,为了将数据上传到缓冲区,我们不仅限于内存映射技术。既使绑定到它们的内存对象是从不同的内存类型分配的,也可以在缓冲区之间赋值数据。

译者注:示例代码点击此处

怎么做...

1.获取命令缓冲区的句柄。将其存储在名为command_buffer的VkCommandBuffer类型变量中。确保命令缓冲区处于记录状态(请参阅第3章,命令缓冲区和同步中的开始命令缓冲区记录操作内容)。
2.获取将从中复制数据的缓冲区,使用名为source_buffer的VkBuffer类型的变量表示此缓冲区。
3.获取将数据拷贝到的目标缓冲区,使用名为destination_buffer的VkBuffer类型的变量表示此缓冲区。
4.创建名为regions的std::vector<VkBufferCopy>类型的变量。元素数量是我们希望复制的所有区域数量。在每个元素中,指向原缓冲区中的内存偏移量,目标缓冲区中对应内存的偏移量,以及要从给定区域复制的数据大小。
5.调用vkCmdCopyBuffer( command_buffer, source_buffer, destination_buffer, static_cast<uint32_t>(regions.size()), &regions[0] ),使用command_buffer、source_buffer和destination_buffer变量,regions向量中的元素数量以及指向该向量第一个元素的指针做为参数。

这个怎么运作...

在缓冲区之间复制数据是更新给定资源的内存内容的另一种方法。需要将此操作记录到命令缓冲区如下所示:

if( regions.size() > 0 ) {
  vkCmdCopyBuffer( command_buffer, source_buffer, destination_buffer, static_cast<uint32_t>(regions.size()), regions.data() );
}

为获得最佳性能,在呈现期间使用的资源应具有设备本地内存绑定。但是,我们无法映射这样的内存。使用vkCmdCopyBuffer()函数,我们可以从绑定有主机可见内存的另一个缓冲区将数据复制到这样的缓冲区。

提示:必须使用VK_BUFFER_USAGE_TRANSFER_SRC_BIT用法创建可以复制数据的缓冲区。
           必须使用VK_BUFFER_USAGE_TRANSFER_DST_BIT用法创建可以向其拷贝数据的缓冲区。

当我们想要使用缓冲区作为传输操作的目标时(我们想要将数据复制到缓冲区),应该设置一个内存屏障,告知驱动程序从现在开始,在缓冲区上执行的操作由VK_ACCESS_TRANSFER_WRITE_BIT内存访问方式表示。在完成将数据复制到目标缓冲区并用于希望的用途之后,我们应该设置另一个内存屏障。这一次,我们应该告诉驱动程序我们之前的内存操作是什么(之前是VK_ACCESS_TRANSFER_WRITE_BIT操作类型),还有在屏障之后,缓冲区将用于不同目的。所以还要告诉驱动屏障之后内存的访问类型(参见设置缓冲区内存屏障内容)。

猜你喜欢

转载自blog.csdn.net/qq_19473837/article/details/84949320
今日推荐