/* * Copyright 2018 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * */ // // // #include // // // #include "cache_vk.h" #include "assert_vk.h" #include "host_alloc.h" // // // void vk_pipeline_cache_create(VkDevice device, VkAllocationCallbacks const * allocator, char const * const name, VkPipelineCache * pipeline_cache) { VkPipelineCacheCreateInfo pipeline_cache_info = { .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO, .pNext = NULL, .flags = 0, .initialDataSize = 0, .pInitialData = NULL }; FILE * f = fopen(name,"rb"); void * data = NULL; if (f != NULL) { if (fseek(f,0L,SEEK_END) == 0) { pipeline_cache_info.initialDataSize = ftell(f); if (pipeline_cache_info.initialDataSize > 0) { fseek(f, 0L, SEEK_SET); data = vk_host_alloc(allocator,pipeline_cache_info.initialDataSize); size_t read_size = fread(data,pipeline_cache_info.initialDataSize,1,f); pipeline_cache_info.pInitialData = data; } } fclose(f); } vk(CreatePipelineCache(device, &pipeline_cache_info, allocator, pipeline_cache)); if (data != NULL) vk_host_free(allocator,data); } // // // void vk_pipeline_cache_destroy(VkDevice device, VkAllocationCallbacks const * allocator, char const * const name, VkPipelineCache pipeline_cache) { size_t data_size; vkGetPipelineCacheData(device,pipeline_cache,&data_size,NULL); if (data_size > 0) { void * data = vk_host_alloc(allocator,data_size); vkGetPipelineCacheData(device,pipeline_cache,&data_size,data); FILE * f = fopen(name,"wb"); if (f != NULL) { fwrite(data,data_size,1,f); fclose(f); } vk_host_free(allocator,data); } vkDestroyPipelineCache(device,pipeline_cache,allocator); } // // //