如果我理解正确,我应该创建一个空VkPipelineCache
对象,将其传入vkCreateGraphicsPipelines
并写入数据。然后我可以将它与我正在创建的其他管道重用或将其保存到文件中并在下次运行时使用它。
我试过按照 LunarG 示例来额外的信息:
uint32_t headerLength = pData[0];
uint32_t cacheHeaderVersion = pData[1];
uint32_t vendorID = pData[2];
uint32_t deviceID = pData[3];
Run Code Online (Sandbox Code Playgroud)
但我总是得到headerLength
32,其余的 0。查看规范(https://vulkan.lunarg.com/doc/view/1.0.26.0/linux/vkspec.chunked/ch09s06.html表 9.1),cacheHeaderVersion 应该始终为 1,因为唯一可用的缓存头版本是VK_PIPELINE_CACHE_HEADER_VERSION_ONE = 1
.
而且 pData 的大小通常只有 32 个字节,即使我用它创建了 10 个管道。我究竟做错了什么?
Vulkan 管道缓存是一个不透明的对象,仅对驱动程序有意义。您需要对其进行的操作 非常少。
这个想法是,驱动程序可以使用缓存来加快程序中管道的创建速度,并且还可以加快应用程序后续运行时管道的创建速度。
您根本不应该尝试解释从vkGetPipelineCacheData
at 处返回的缓存数据。该数据的唯一目的是传递到以后的调用中vkCreatePipelineCache
。
此外,pData 的大小通常只有 32 字节,即使我用它创建 10 个管道也是如此。我究竟做错了什么?
驱动程序必须实现vkCreatePipelineCache
、vkGetPipelineCacheData
等。但它们实际上不必支持缓存。因此,如果您使用的驱动程序没有任何可以缓存的内容,或者没有完成支持缓存的工作,那么您自然会得到一个空缓存(标头除外)。
归档时间: |
|
查看次数: |
1486 次 |
最近记录: |