1 /*
2 * Copyright 2018 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 *
7 */
8
9 //
10 //
11 //
12
13 #include <stdio.h>
14
15 //
16 //
17 //
18
19 #include "cache_vk.h"
20 #include "assert_vk.h"
21 #include "host_alloc.h"
22
23 //
24 //
25 //
26
27 void
vk_pipeline_cache_create(VkDevice device,VkAllocationCallbacks const * allocator,char const * const name,VkPipelineCache * pipeline_cache)28 vk_pipeline_cache_create(VkDevice device,
29 VkAllocationCallbacks const * allocator,
30 char const * const name,
31 VkPipelineCache * pipeline_cache)
32 {
33 VkPipelineCacheCreateInfo pipeline_cache_info = {
34 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
35 .pNext = NULL,
36 .flags = 0,
37 .initialDataSize = 0,
38 .pInitialData = NULL
39 };
40
41 FILE * f = fopen(name,"rb");
42 void * data = NULL;
43
44 if (f != NULL)
45 {
46 if (fseek(f,0L,SEEK_END) == 0)
47 {
48 pipeline_cache_info.initialDataSize = ftell(f);
49
50 if (pipeline_cache_info.initialDataSize > 0)
51 {
52 fseek(f, 0L, SEEK_SET);
53
54 data = vk_host_alloc(allocator,pipeline_cache_info.initialDataSize);
55
56 size_t read_size = fread(data,pipeline_cache_info.initialDataSize,1,f);
57
58 pipeline_cache_info.pInitialData = data;
59 }
60 }
61
62 fclose(f);
63 }
64
65 vk(CreatePipelineCache(device,
66 &pipeline_cache_info,
67 allocator,
68 pipeline_cache));
69
70
71 if (data != NULL)
72 vk_host_free(allocator,data);
73 }
74
75 //
76 //
77 //
78
79 void
vk_pipeline_cache_destroy(VkDevice device,VkAllocationCallbacks const * allocator,char const * const name,VkPipelineCache pipeline_cache)80 vk_pipeline_cache_destroy(VkDevice device,
81 VkAllocationCallbacks const * allocator,
82 char const * const name,
83 VkPipelineCache pipeline_cache)
84 {
85 size_t data_size;
86
87 vkGetPipelineCacheData(device,pipeline_cache,&data_size,NULL);
88
89 if (data_size > 0)
90 {
91 void * data = vk_host_alloc(allocator,data_size);
92
93 vkGetPipelineCacheData(device,pipeline_cache,&data_size,data);
94
95 FILE * f = fopen(name,"wb");
96
97 if (f != NULL)
98 {
99 fwrite(data,data_size,1,f);
100 fclose(f);
101 }
102
103 vk_host_free(allocator,data);
104 }
105
106 vkDestroyPipelineCache(device,pipeline_cache,allocator);
107 }
108
109 //
110 //
111 //
112