11 #include "flutter/fml/mapping.h"
19 std::shared_ptr<DeviceHolderVK> device_holder,
20 fml::UniqueFD cache_directory)
21 : caps_(
std::move(caps)),
22 device_holder_(device_holder),
23 cache_directory_(
std::move(cache_directory)) {
24 if (!caps_ || !device_holder->GetDevice()) {
31 cache_directory_, vk_caps.GetPhysicalDeviceProperties());
33 vk::PipelineCacheCreateInfo cache_info;
34 if (existing_cache_data) {
35 cache_info.initialDataSize = existing_cache_data->GetSize();
36 cache_info.pInitialData = existing_cache_data->GetMapping();
39 auto [result, existing_cache] =
40 device_holder->GetDevice().createPipelineCacheUnique(cache_info);
42 if (result == vk::Result::eSuccess) {
43 cache_ = std::move(existing_cache);
48 FML_LOG(INFO) <<
"Existing pipeline cache was invalid: "
49 << vk::to_string(result) <<
". Starting with a fresh cache.";
50 cache_info.pInitialData =
nullptr;
51 cache_info.initialDataSize = 0u;
52 auto [result2, new_cache] =
53 device_holder->GetDevice().createPipelineCacheUnique(cache_info);
54 if (result2 == vk::Result::eSuccess) {
55 cache_ = std::move(new_cache);
58 << vk::to_string(result2);
66 std::shared_ptr<DeviceHolderVK> device_holder = device_holder_.lock();
79 const vk::GraphicsPipelineCreateInfo& info) {
80 std::shared_ptr<DeviceHolderVK> strong_device = device_holder_.lock();
85 auto [result, pipeline] =
86 strong_device->GetDevice().createGraphicsPipelineUnique(*cache_, info);
87 if (result != vk::Result::eSuccess) {
89 << vk::to_string(result);
91 return std::move(pipeline);
95 const vk::ComputePipelineCreateInfo& info) {
96 std::shared_ptr<DeviceHolderVK> strong_device = device_holder_.lock();
101 auto [result, pipeline] =
102 strong_device->GetDevice().createComputePipelineUnique(*cache_, info);
103 if (result != vk::Result::eSuccess) {
105 << vk::to_string(result);
107 return std::move(pipeline);
116 vk_caps.GetPhysicalDeviceProperties(),
static CapabilitiesVK & Cast(Capabilities &base)
The Vulkan layers and extensions wrangler.
PipelineCacheVK(std::shared_ptr< const Capabilities > caps, std::shared_ptr< DeviceHolderVK > device_holder, fml::UniqueFD cache_directory)
vk::UniquePipeline CreatePipeline(const vk::GraphicsPipelineCreateInfo &info)
void PersistCacheToDisk() const
const CapabilitiesVK * GetCapabilities() const
std::unique_ptr< fml::Mapping > PipelineCacheDataRetrieve(const fml::UniqueFD &cache_directory, const VkPhysicalDeviceProperties &props)
Retrieve the previously persisted pipeline cache data. This function provides integrity checks the Vu...
bool PipelineCacheDataPersist(const fml::UniqueFD &cache_directory, const VkPhysicalDeviceProperties &props, const vk::UniquePipelineCache &cache)
Persist the pipeline cache to a file in the given cache directory. This function performs integrity c...