xref: /aosp_15_r20/external/mesa3d/src/util/disk_cache_os.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2014 Intel Corporation
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #ifndef DISK_CACHE_OS_H
25*61046927SAndroid Build Coastguard Worker #define DISK_CACHE_OS_H
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker #include "util/u_queue.h"
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker #if DETECT_OS_WINDOWS
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker /* TODO: implement disk cache support on windows */
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker #else
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker #include "util/fossilize_db.h"
36*61046927SAndroid Build Coastguard Worker #include "util/mesa_cache_db.h"
37*61046927SAndroid Build Coastguard Worker #include "util/mesa_cache_db_multipart.h"
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
40*61046927SAndroid Build Coastguard Worker extern "C" {
41*61046927SAndroid Build Coastguard Worker #endif
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker /* Number of bits to mask off from a cache key to get an index. */
44*61046927SAndroid Build Coastguard Worker #define CACHE_INDEX_KEY_BITS 16
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker /* Mask for computing an index from a key. */
47*61046927SAndroid Build Coastguard Worker #define CACHE_INDEX_KEY_MASK ((1 << CACHE_INDEX_KEY_BITS) - 1)
48*61046927SAndroid Build Coastguard Worker 
49*61046927SAndroid Build Coastguard Worker /* The number of keys that can be stored in the index. */
50*61046927SAndroid Build Coastguard Worker #define CACHE_INDEX_MAX_KEYS (1 << CACHE_INDEX_KEY_BITS)
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker enum disk_cache_type {
53*61046927SAndroid Build Coastguard Worker    DISK_CACHE_NONE,
54*61046927SAndroid Build Coastguard Worker    DISK_CACHE_MULTI_FILE,
55*61046927SAndroid Build Coastguard Worker    DISK_CACHE_SINGLE_FILE,
56*61046927SAndroid Build Coastguard Worker    DISK_CACHE_DATABASE,
57*61046927SAndroid Build Coastguard Worker };
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker struct disk_cache {
60*61046927SAndroid Build Coastguard Worker    /* The path to the cache directory. */
61*61046927SAndroid Build Coastguard Worker    char *path;
62*61046927SAndroid Build Coastguard Worker    bool path_init_failed;
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker    /* Thread queue for compressing and writing cache entries to disk */
65*61046927SAndroid Build Coastguard Worker    struct util_queue cache_queue;
66*61046927SAndroid Build Coastguard Worker 
67*61046927SAndroid Build Coastguard Worker    struct foz_db foz_db;
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker    struct mesa_cache_db_multipart cache_db;
70*61046927SAndroid Build Coastguard Worker 
71*61046927SAndroid Build Coastguard Worker    enum disk_cache_type type;
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker    /* Seed for rand, which is used to pick a random directory */
74*61046927SAndroid Build Coastguard Worker    uint64_t seed_xorshift128plus[2];
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker    /* A pointer to the mmapped index file within the cache directory. */
77*61046927SAndroid Build Coastguard Worker    uint8_t *index_mmap;
78*61046927SAndroid Build Coastguard Worker    size_t index_mmap_size;
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker    /* Pointer to total size of all objects in cache (within index_mmap) */
81*61046927SAndroid Build Coastguard Worker    p_atomic_uint64_t *size;
82*61046927SAndroid Build Coastguard Worker 
83*61046927SAndroid Build Coastguard Worker    /* Pointer to stored keys, (within index_mmap). */
84*61046927SAndroid Build Coastguard Worker    uint8_t *stored_keys;
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker    /* Maximum size of all cached objects (in bytes). */
87*61046927SAndroid Build Coastguard Worker    uint64_t max_size;
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker    /* Driver cache keys. */
90*61046927SAndroid Build Coastguard Worker    uint8_t *driver_keys_blob;
91*61046927SAndroid Build Coastguard Worker    size_t driver_keys_blob_size;
92*61046927SAndroid Build Coastguard Worker 
93*61046927SAndroid Build Coastguard Worker    disk_cache_put_cb blob_put_cb;
94*61046927SAndroid Build Coastguard Worker    disk_cache_get_cb blob_get_cb;
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker    /* Don't compress cached data. This is for testing purposes only. */
97*61046927SAndroid Build Coastguard Worker    bool compression_disabled;
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker    struct {
100*61046927SAndroid Build Coastguard Worker       bool enabled;
101*61046927SAndroid Build Coastguard Worker       unsigned hits;
102*61046927SAndroid Build Coastguard Worker       unsigned misses;
103*61046927SAndroid Build Coastguard Worker    } stats;
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker    /* Internal RO FOZ cache for combined use of RO and RW caches. */
106*61046927SAndroid Build Coastguard Worker    struct disk_cache *foz_ro_cache;
107*61046927SAndroid Build Coastguard Worker };
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker struct cache_entry_file_data {
110*61046927SAndroid Build Coastguard Worker    uint32_t crc32;
111*61046927SAndroid Build Coastguard Worker    uint32_t uncompressed_size;
112*61046927SAndroid Build Coastguard Worker };
113*61046927SAndroid Build Coastguard Worker 
114*61046927SAndroid Build Coastguard Worker struct disk_cache_put_job {
115*61046927SAndroid Build Coastguard Worker    struct util_queue_fence fence;
116*61046927SAndroid Build Coastguard Worker 
117*61046927SAndroid Build Coastguard Worker    struct disk_cache *cache;
118*61046927SAndroid Build Coastguard Worker 
119*61046927SAndroid Build Coastguard Worker    cache_key key;
120*61046927SAndroid Build Coastguard Worker 
121*61046927SAndroid Build Coastguard Worker    /* Copy of cache data to be compressed and written. */
122*61046927SAndroid Build Coastguard Worker    void *data;
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker    /* Size of data to be compressed and written. */
125*61046927SAndroid Build Coastguard Worker    size_t size;
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker    struct cache_item_metadata cache_item_metadata;
128*61046927SAndroid Build Coastguard Worker };
129*61046927SAndroid Build Coastguard Worker 
130*61046927SAndroid Build Coastguard Worker char *
131*61046927SAndroid Build Coastguard Worker disk_cache_generate_cache_dir(void *mem_ctx, const char *gpu_name,
132*61046927SAndroid Build Coastguard Worker                               const char *driver_id,
133*61046927SAndroid Build Coastguard Worker                               enum disk_cache_type cache_type);
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker void
136*61046927SAndroid Build Coastguard Worker disk_cache_evict_lru_item(struct disk_cache *cache);
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker void
139*61046927SAndroid Build Coastguard Worker disk_cache_evict_item(struct disk_cache *cache, char *filename);
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker void *
142*61046927SAndroid Build Coastguard Worker disk_cache_load_item_foz(struct disk_cache *cache, const cache_key key,
143*61046927SAndroid Build Coastguard Worker                          size_t *size);
144*61046927SAndroid Build Coastguard Worker 
145*61046927SAndroid Build Coastguard Worker void *
146*61046927SAndroid Build Coastguard Worker disk_cache_load_item(struct disk_cache *cache, char *filename, size_t *size);
147*61046927SAndroid Build Coastguard Worker 
148*61046927SAndroid Build Coastguard Worker char *
149*61046927SAndroid Build Coastguard Worker disk_cache_get_cache_filename(struct disk_cache *cache, const cache_key key);
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker bool
152*61046927SAndroid Build Coastguard Worker disk_cache_write_item_to_disk_foz(struct disk_cache_put_job *dc_job);
153*61046927SAndroid Build Coastguard Worker 
154*61046927SAndroid Build Coastguard Worker void
155*61046927SAndroid Build Coastguard Worker disk_cache_write_item_to_disk(struct disk_cache_put_job *dc_job,
156*61046927SAndroid Build Coastguard Worker                               char *filename);
157*61046927SAndroid Build Coastguard Worker 
158*61046927SAndroid Build Coastguard Worker bool
159*61046927SAndroid Build Coastguard Worker disk_cache_enabled(void);
160*61046927SAndroid Build Coastguard Worker 
161*61046927SAndroid Build Coastguard Worker bool
162*61046927SAndroid Build Coastguard Worker disk_cache_load_cache_index_foz(void *mem_ctx, struct disk_cache *cache);
163*61046927SAndroid Build Coastguard Worker 
164*61046927SAndroid Build Coastguard Worker void
165*61046927SAndroid Build Coastguard Worker disk_cache_touch_cache_user_marker(char *path);
166*61046927SAndroid Build Coastguard Worker 
167*61046927SAndroid Build Coastguard Worker bool
168*61046927SAndroid Build Coastguard Worker disk_cache_mmap_cache_index(void *mem_ctx, struct disk_cache *cache,
169*61046927SAndroid Build Coastguard Worker                             char *path);
170*61046927SAndroid Build Coastguard Worker 
171*61046927SAndroid Build Coastguard Worker void
172*61046927SAndroid Build Coastguard Worker disk_cache_destroy_mmap(struct disk_cache *cache);
173*61046927SAndroid Build Coastguard Worker 
174*61046927SAndroid Build Coastguard Worker void *
175*61046927SAndroid Build Coastguard Worker disk_cache_db_load_item(struct disk_cache *cache, const cache_key key,
176*61046927SAndroid Build Coastguard Worker                         size_t *size);
177*61046927SAndroid Build Coastguard Worker 
178*61046927SAndroid Build Coastguard Worker bool
179*61046927SAndroid Build Coastguard Worker disk_cache_db_write_item_to_disk(struct disk_cache_put_job *dc_job);
180*61046927SAndroid Build Coastguard Worker 
181*61046927SAndroid Build Coastguard Worker bool
182*61046927SAndroid Build Coastguard Worker disk_cache_db_load_cache_index(void *mem_ctx, struct disk_cache *cache);
183*61046927SAndroid Build Coastguard Worker 
184*61046927SAndroid Build Coastguard Worker void
185*61046927SAndroid Build Coastguard Worker disk_cache_delete_old_cache(void);
186*61046927SAndroid Build Coastguard Worker 
187*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
188*61046927SAndroid Build Coastguard Worker }
189*61046927SAndroid Build Coastguard Worker #endif
190*61046927SAndroid Build Coastguard Worker 
191*61046927SAndroid Build Coastguard Worker #endif
192*61046927SAndroid Build Coastguard Worker 
193*61046927SAndroid Build Coastguard Worker #endif /* DISK_CACHE_OS_H */
194