如果我对它的理解正确,那么我应该创建一个空的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条管道也是如此。我在做什么错了?
答案 0 :(得分:0)
Vulkan管道缓存是一个 opaque 对象,仅对驱动程序有意义。您应该在其中使用很少操作。
这个想法是,驱动程序可以使用缓存来加速程序中管道的创建,并且还可以加快应用程序后续运行中管道的创建。
您完全不应尝试解释从vkGetPipelineCacheData
返回的缓存数据。该数据的唯一目的是传递到以后对vkCreatePipelineCache
的调用中。
pData的大小通常也只有32个字节,即使我用它创建10条管道也是如此。我在做什么错了?
驱动程序必须实现vkCreatePipelineCache
,vkGetPipelineCacheData
等。但实际上,它们不必支持缓存。因此,如果您使用的驱动程序没有可缓存的内容,或者尚未完成支持缓存的工作,那么您自然会获得空的缓存(头文件除外)。