gpt4 book ai didi

vulkan - 一个很少提及的 Vulkan 函数 "vkCmdUpdateBuffer()",它是做什么用的?

转载 作者:行者123 更新时间:2023-12-05 00:11:08 25 4
gpt4 key购买 nike

这似乎是一个简单的 Vulkan API 问题,但在 Internet 上搜索后我真的找不到答案。
我注意到有一个 Vulkan 函数:

void vkCmdUpdateBuffer(
VkCommandBuffer commandBuffer,
VkBuffer dstBuffer,
VkDeviceSize dstOffset,
VkDeviceSize dataSize,
const void* pData);

乍一看,我认为它可以用来记录命令缓冲区,因为它有前缀 vkCmd以其名义,但文件说

vkCmdUpdateBuffer is only allowed outside of a render pass. This command is treated as “transfer” operation, for the purposes of synchronization barriers.



所以我开始认为这是一个方便的函数,它包装了缓冲区数据传输操作,如使用 memcpy()将数据从主机复制到设备。

然后我的问题是:为什么没有使用 vkCmdUpdateBuffer() 的单个 Vulkan 示例/教程(我已经搜索了所有这些)而不是通过 memcpy() 手动处理数据.我理解错了吗?

最佳答案

全部 vkCmd*函数将命令生成到命令缓冲区中。这个也不异常(exception)。这是一个传输命令,与大多数传输命令一样,您无法在渲染过程中执行它们。但是有很多命令缓冲区生成命令在渲染 channel 中不起作用。

通常 Vulkan 内存传输操作只发生在设备内存之间。主机将某些内容放入设备内存的典型机制是写入映射指针。但根据定义,这要求目标内存是可映射的。所以如果你想写一些东西到不可映射内存,你必须把它复制到可映射内存,然后通过vkCmdCopy*在可映射内存到不可映射内存之间做一个传输操作。职能。

如果您同时进行大量传输,那也没关系。您可以将一堆东西复制到映射内存中,然后提交一个包含所有复制操作的批处理,以将数据复制到适当的位置。

但有时,您只是更新一小块设备内存。如果它不可映射,那么仅仅为了将几千字节的数据传送到 GPU 就需要做很多工作。在这种情况下,vkCmdUpdateBuffer可能是更好的选择,因为它可以“直接”从 CPU 内存复制到任何设备内存。

我说“直接”是因为这显然不是它在做什么。它真的在做你会做的同样的事情,除了它是在命令缓冲区中做的。您可以将 CPU 数据复制到 GPU 可映射内存中,然后创建一个命令,从该可映射内存复制到不可映射内存中。
vkCmdUpdateBuffer做完全相同的事情。它将数据从您提供的指针/大小复制到可映射内存(由命令缓冲区本身提供。这就是为什么它的上限为 64KB)。这个复制会立即发生,就像你做 memcpy 一样。 ,所以当这个函数返回时,你可以用你给它的指针做任何你想做的事情。然后它在命令缓冲区中创建一个命令,该命令从命令缓冲区中的可映射内存复制到目标内存位置。

The documentation for this function明确警告将其用于较大的传输。也就是说,它告诉你不要那样做。这是用于不可映射内存的快速、小型、一次性更新。而已。

这就是教程不讨论它的一个原因:这是一个非常特殊的函数,许多新手用户会尝试使用它,因为它比显式代码更容易。但在大多数情况下,他们不应该使用它。

关于vulkan - 一个很少提及的 Vulkan 函数 "vkCmdUpdateBuffer()",它是做什么用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54673223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com