c++ Vulkan的内存域操作是如何工作的

tyg4sfes  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(162)

我读了一些关于使用VK_PIPELINE_STAGE_HOST_BIT在CPU和GPU之间复制图像的代码示例。(为了简单起见,我将使用下面的phsuedo代码)对于GPU-〉CPU,它是这样的:1.vkCmdCopyImage(...,源图像,目标图像,...);2.vkCmd管线屏障(...,VK管线级传送位,VK管线级主机位,...);
对于cpu-〉gpu来说,它就像:

  1. vkCmd管道屏障(...,VK管道阶段主机位,VK管道阶段传输位,...);
  2. vkCmdCopyImage(...,源图像,目标图像,...);
    我可以理解cpu-〉gpu部分,因为我们需要使用barrier使src_img对gpu可见,所以我们先执行barrier,然后将src_img复制到dst_img。但对于gpu-〉cpu,它先执行复制,然后再执行barrier。我想知道如果不先使用barrier使src_img对主机可见,映像复制如何成功?仅供参考,代码示例来自此处,https://cpp.hotexamples.com/site/file?hash=0xf064d23ec4332e7951809e5112a592758b3c2c71a4560a9e77da0176b1a9193a请参考函数CopyToImage和函数CopyFromImage
rqqzpn5f

rqqzpn5f1#

我想知道,如果不首先使用barrier使src_img对主机可见,映像复制如何能够成功?
因为主机没有阅读 * 源 * 映像;它阅读的是目标映像,即要复制到 * 的映像。copy命令读取的是源映像,因为copy命令是复制映像的命令。
dest映像在主机存储器中
不,它在 device 内存中。您知道这是因为内存是通过VkDeviceMemory对象封装的,是通过设备内存分配命令分配的,并且将通过设备内存释放命令释放。
这种特定的内存分配与主机共享,但它“属于”设备。
复制操作是一个设备操作。屏障将该操作的 * 结果 * 暴露给主机。

相关问题