11.8. 内存别名
VkDeviceMemory
内存的一段区间可以被称为 aliased(被别名),若它通过 vkBindImageMemory
,vkBindBufferMemory
,或者通过稀疏内存绑定,被同时绑定到多个资源上。 在两个图像或者两个缓冲区之间的 一段别名内存区间,其定义是:在绑定到两个资源上的内存的一段内存区间。 在两个资源之间(一个是缓冲区或者线性图像,另一个是优化图像)的 一个内存区间别名,其他定义是 绑定到两个资源的内存区间的 相交区域。每个区间首先被填补并按照bufferImageGranularity
对齐。 应用程序可以给内存起别名,但是使用多个别名需要遵循多个限制条件。
注意 如果一些大型的资源被用于不连续的阶段,内存别名可以有效的减少应用程序中设备内存使用痕迹。 |
当一个不透明,非 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
图像被绑定到一个别名区间,图像所有的 图像子资源 在区间上重叠。 当一个线性图像被绑定到一个别名区间,包含 别名区间的图像子资源(遵顼图像被建议的布局方式)将重叠该区域。 当一个 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
图像有稀疏图像块被绑定一个别名区间上, 只有包含这些稀疏图像块的图像子资源会重叠该区间,且当内存被绑定到图像的mip tail与别名区间重叠时,mip tail中的图像子资源 将重叠该区间。
在VK_IMAGE_LAYOUT_PREINITIALIZED
或者 VK_IMAGE_LAYOUT_GENERAL
布局的缓冲区,线性图像子资源,都是 host-accessible subresources。 亦即,只有host端能够正确的寻址,并解释其内容,故若这些别名时是host-accessible 子资源,内存中数据的布局可以通过别名被一致性的解释。 其他布局下的不透明图像和图像子资源,不是host-accessible。
若两个别名都是both host-accessible,那么它们使用一致的方式去解读内存的内容,且写入到别名内的数据可以被另外一个别名读取。
若两个别名都不是host-accessible,那么别名依不同的方式解读内存的内容,通过一个别名写入的内容对于另外一个别名来说也是部分或全未定义的。 若第一个别名是 host-accessible 子资源,那么受影响的字节,是那些通过它的寻址方式内存操作写入的部分。 若第一个别名不能被主机端访问,那么被影响的字节是那些被写入的图像子资源重叠的部分。 若第二个别名是不能被主机端访问的子资源,那么被影响的字节将变得未定义。 若第二个别名不能被主机端访问,所有的稀疏图像块(为稀疏部分驻留图像)或者所有的图像子资源(为非稀疏图像和全驻留稀疏图像)重叠的字节将变得未定义。
若因为写入alias而导致任何图像子资源变成未定义的,那么 图像子资源的每一个必须让它被使用之前从它的布局从VK_IMAGE_LAYOUT_UNDEFINED
转换到一个有效的布局, 或者若内存已经被host端写入,需要从VK_IMAGE_LAYOUT_PREINITIALIZED
转换到一个有效布局。 若稀疏图像的任何稀疏块已经变成未定义的,那么只有包含它们的图像子资源 必须被转换。
两个alias使用一分重叠区间 必须通过使用合适的 access types的内存依赖 来分割,若至少 其中一个使用操作写入,不管alias持续终端内存与否。 若缓冲区或 图像内存屏障被使用来,屏障的周期必须包含整个区间,和/或 重叠的图像子资源的集合。
若在同一个缓冲区中使用两个别名图像视图,那么render pass 必须使用 VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT
声明附件,且必须符合该节中其他的规则。
在着色器中使用 Coherent
修饰的变量来访问别名内存的资源,将不会自动保持一致性。
注意 Memory recycled via an application suballocator (i.e. without freeing and reallocating the memory objects) is not substantially different from memory aliasing. However, a suballocator usually waits on a fence before recycling a region of memory, and signaling a fence involves sufficient implicit dependencies to satisfy all the above requirements. |