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