如何使用VkPipelineCache?

时间:2019-02-08 18:04:26

标签: vulkan

如果我对它的理解正确,那么我应该创建一个空的VkPipelineCache对象,将其传递到vkCreateGraphicsPipelines中,数据将被写入其中。然后,我可以将其与正在创建的其他管道一起使用,或者将其保存到文件中,并在下次运行时使用它。

我尝试按照LunarG示例添加信息:

uint32_t headerLength = pData[0];
uint32_t cacheHeaderVersion = pData[1];
uint32_t vendorID = pData[2];
uint32_t deviceID = pData[3];

但是我总是得到headerLength为32,其余为0。从规格(https://vulkan.lunarg.com/doc/view/1.0.26.0/linux/vkspec.chunked/ch09s06.html表9.1)来看,cacheHeaderVersion应该始终为1,因为唯一可用的缓存头版本是{{ 1}}。

pData的大小通常也只有32个字节,即使我用它创建10条管道也是如此。我在做什么错了?

1 个答案:

答案 0 :(得分:0)

Vulkan管道缓存是一个 opaque 对象,仅对驱动程序有意义。您应该在其中使用很少操作。

这个想法是,驱动程序可以使用缓存来加速程序中管道的创建,并且还可以加快应用程序后续运行中管道的创建。

您完全不应尝试解释从vkGetPipelineCacheData 返回的缓存数据。该数据的唯一目的是传递到以后对vkCreatePipelineCache的调用中。

  

pData的大小通常也只有32个字节,即使我用它创建10条管道也是如此。我在做什么错了?

驱动程序必须实现vkCreatePipelineCachevkGetPipelineCacheData等。但实际上,它们不必支持缓存。因此,如果您使用的驱动程序没有可缓存的内容,或者尚未完成支持缓存的工作,那么您自然会获得空的缓存(头文件除外)。