Vulkan:懒惰分配内存?

时间:2016-04-14 01:10:35

标签: c++ vulkan

我有一种情况,我可能需要在渲染过程中使用模板缓冲区,但是,直到执行渲染过程中途我都不会“知道”。不幸的是,一旦渲染过程正在进行中,Vulkan就无法修改帧缓冲的附件(如D3D12)。但是,我在规范中发现,"lazily allocated memory"在分配内存时使用VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT,而在表面使用VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT概念。

不幸的是,似乎VkMemoryType中的VkPhysicalDeviceMemoryProperties个条目(从vkGetPhysicalDeviceMemoryProperties返回)实际上没有设置此功能位。此外,似乎没有API样本使用这些位。这只是驱动程序级别的未实现功能,并且驱动程序通常不支持此功能吗?

我使用的是Vulkan SDK 1.0.5,Nvidia驱动程序356.45。

1 个答案:

答案 0 :(得分:7)

懒惰分配的内存不会帮助你。或者至少,可能不是,取决于你的场景。原因有两方面。首先,除非你没有深度渲染,否则你必须使用打包的深度/模板图像(因为你不允许有单独的深度和模板缓冲区)。而且,由于你(大概)不希望深度部分被懒惰分配,你没有办法,只能使用实际的记忆而不是懒惰分配的记忆。

其次,你所做的并不是懒惰分配的内存。它不适用于可选的部分渲染。这是因其本质而短暂的图像。

例如,考虑延迟渲染。你需要g-buffers。但是你要在g-buffer pass中填充它们,并且你会在光照过程中消耗掉它们。在那之后,你再也不会使用他们的内容了。

对于许多渲染器而言,这并不重要。但是使用基于图块的渲染器,它可以。为什么?因为如果一个tile大到足以同时存储所有g-buffer数据,那么实现实际上并不需要将g-buffer数据写入内存。它可以将所有内容保留在磁贴内存中,在磁贴中进行光照传递(将它们作为输入附件读取),然后忘记它们存在。

但是Vulkan要求图像在使用之前有内存绑定它们。存在惰性内存,以便您可以满足该要求,同时让实现知道您不会真正使用此内存。或者更重要的是,只有当你做了需要它的事情时才会分配实际内存。

深度缓冲区和深度/模板缓冲区也可能会被懒惰地分配,只要您不需要像普通图像那样访问它们。但即便如此,它也不是一种可以选择模板印刷或深度测试的方法。它是关于使他们的后备存储短暂存在,可以存在于TBR的内存中的内存,而不是其他任何地方。你还在做手术;它只是没有占用实际记忆。