使 Vulkan 内存失效和刷新的正确方法

The proper way to invalidate and flush Vulkan memory

当在 Vulkan 中刷新和使非一致性内存失效时,您需要在起始偏移量和大小都与称为 'nonCoherentAtomSize' 的对齐方式对齐的范围内执行此操作,在我的物理设备上它是 128 字节。为此,您需要向下舍入起始偏移量并将大小向上舍入到此对齐方式(128 字节)。我可以看到的问题是类型的对齐不太严格(较小),这种上下舍入可能会使范围超出分配的内存范围。所以:

// CREATE A BUFFER WITH SIZE 17
VkMemoryRequirements memRequirements;
vkGetBufferMemoryRequirements(logicalDevice, vk_buffer, &memRequirements);

memRequirements.size; // == 20
memRequirements.alignment; // == 4
// ON MY SETUP

假设我分配了 20 字节的内存,并且我在开始时使用了这个缓冲区,(0),我想刷新这个范围,我将刷新大小为 20 的偏移量 0(但这需要四舍五入为128 (nonCoherentAtomSize),比缓冲区大。这不对吧?同样,从 vkAllocateMemory 返回的内存是否保证至少与 nonCoherentAtomSize 对齐?如果不是,内存可能仅从 16 字节开始对齐,如果我向下舍入,那么我会在内存之前刷新一个范围,对吗?

编辑:抱歉,向下取整的情况下是不可能的,因为flush和invalidate的参数是一个偏移量,任何向下取整到其对齐的都不能小于0。但是在向上取整的情况下它仍然是我可以看到一个问题。

没有理由映射未与 nonCoherentAtomSize 对齐的分配范围。如果你这样做,那么你会发现你将无法正确刷新或使该范围的一部分无效。

确实,没有理由只映射您打算映射的分配的 部分 。只需在分配后立即映射整个事物。此时,如果nonCoherentAtomSize对齐的size超出分配范围,则可以使用VK_WHOLE_SIZE指定大小。