【发布时间】:2021-11-09 20:13:13
【问题描述】:
在 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。但是在四舍五入的情况下它仍然是一个问题我可以看到。
【问题讨论】: