是否有可能意外覆盖 VkDeviceMemory 中的“元数据”?

Jax*_*xon 3 vulkan

来自这个reddit帖子的答案。

...驱动程序可能需要一些额外的元数据来管理给定的资源。这就是为什么我们需要调用 vkGet...MemoryRequirements() 函数并分配足够的内存。

但是,vkMapMemory根据上面的答案,映射分配的内存,其中可能包含驱动程序所需的元数据。

当我写入映射内存时,我如何知道我是否覆盖了元数据?

Nic*_*las 7

您应该忽略帖子的这一部分。这是无稽之谈。

事实上,实现可能需要VkBufferVkImage对象的元数据。但是,当您将这些对象绑定到内存时,该元数据不会存储在您提供的数据中。VkDeviceMemory它们与VkBufferVkImage对象相关联。它们在构造这些对象时被分配(这就是为什么创建它们需要 a VkAllocationCallbacks)并在它们被销毁时被释放。

查询缓冲区和图像的内存需求的目的不是为了与缓冲区/图像本身关联的元数据。这是为了布局目的。某些缓冲区的使用必须具有特定的对齐方式,并且大小可能需要向上舍入到该对齐方式。最佳平铺图像的布局是完全不透明的;您不能直接写入平铺图像的字节。您只能使用图像复制命令将其复制到/复制出。