Module: Mesa Branch: main Commit: 75dae4f8e3df731165e85039ce16a0c64c2646f1 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=75dae4f8e3df731165e85039ce16a0c64c2646f1
Author: Dmitry Osipenko <[email protected]> Date: Wed Sep 7 23:17:56 2022 +0300 util/disk_cache: Store environment variable values in disk_cache struct Store values of all environment variables related to disk caching within struct disk_cache. This makes code cleaner and also will allow us to combine read-only single-file cache with read-write caches. Reviewed-by: Timothy Arceri <[email protected]> Signed-off-by: Dmitry Osipenko <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18551> --- src/util/disk_cache.c | 56 +++++++++++++++++++++++++++++++++++------------- src/util/disk_cache_os.c | 9 ++++---- src/util/disk_cache_os.h | 11 ++++++++-- 3 files changed, 55 insertions(+), 21 deletions(-) diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c index f2c0fc0e8d5..e2133372185 100644 --- a/src/util/disk_cache.c +++ b/src/util/disk_cache.c @@ -70,9 +70,11 @@ do { \ _dst += _src_size; \ } while (0); -struct disk_cache * -disk_cache_create(const char *gpu_name, const char *driver_id, - uint64_t driver_flags) +static struct disk_cache * +disk_cache_type_create(const char *gpu_name, + const char *driver_id, + uint64_t driver_flags, + enum disk_cache_type cache_type) { void *local; struct disk_cache *cache = NULL; @@ -105,7 +107,8 @@ disk_cache_create(const char *gpu_name, const char *driver_id, goto path_fail; #endif - char *path = disk_cache_generate_cache_dir(local, gpu_name, driver_id); + char *path = disk_cache_generate_cache_dir(local, gpu_name, driver_id, + cache_type); if (!path) goto path_fail; @@ -120,16 +123,16 @@ disk_cache_create(const char *gpu_name, const char *driver_id, if (strcmp(driver_id, "make_check_uncompressed") == 0) cache->compression_disabled = true; - if (debug_get_bool_option("MESA_DISK_CACHE_SINGLE_FILE", false)) { + if (cache_type == DISK_CACHE_SINGLE_FILE) { if (!disk_cache_load_cache_index_foz(local, cache)) goto path_fail; - } else if (debug_get_bool_option("MESA_DISK_CACHE_DATABASE", false)) { + } else if (cache_type == DISK_CACHE_DATABASE) { if (!disk_cache_db_load_cache_index(local, cache)) goto path_fail; - - cache->use_cache_db = true; } + cache->type = cache_type; + cache->stats.enabled = debug_get_bool_option("MESA_SHADER_CACHE_SHOW_STATS", false); @@ -186,7 +189,7 @@ disk_cache_create(const char *gpu_name, const char *driver_id, cache->max_size = max_size; - if (cache->use_cache_db) + if (cache->type == DISK_CACHE_DATABASE) mesa_cache_db_set_size_limit(&cache->cache_db, cache->max_size); /* 4 threads were chosen below because just about all modern CPUs currently @@ -255,6 +258,29 @@ disk_cache_create(const char *gpu_name, const char *driver_id, return NULL; } +struct disk_cache * +disk_cache_create(const char *gpu_name, const char *driver_id, + uint64_t driver_flags) +{ + enum disk_cache_type cache_type; + struct disk_cache *cache; + + if (debug_get_bool_option("MESA_DISK_CACHE_SINGLE_FILE", false)) + cache_type = DISK_CACHE_SINGLE_FILE; + else if (debug_get_bool_option("MESA_DISK_CACHE_DATABASE", false)) + cache_type = DISK_CACHE_DATABASE; + else + cache_type = DISK_CACHE_MULTI_FILE; + + /* Create main writable cache. */ + cache = disk_cache_type_create(gpu_name, driver_id, driver_flags, + cache_type); + if (!cache) + return NULL; + + return cache; +} + void disk_cache_destroy(struct disk_cache *cache) { @@ -268,10 +294,10 @@ disk_cache_destroy(struct disk_cache *cache) util_queue_finish(&cache->cache_queue); util_queue_destroy(&cache->cache_queue); - if (debug_get_bool_option("MESA_DISK_CACHE_SINGLE_FILE", false)) + if (cache->type == DISK_CACHE_SINGLE_FILE) foz_destroy(&cache->foz_db); - if (cache->use_cache_db) + if (cache->type == DISK_CACHE_DATABASE) mesa_cache_db_close(&cache->cache_db); disk_cache_destroy_mmap(cache); @@ -374,9 +400,9 @@ cache_put(void *job, void *gdata, int thread_index) char *filename = NULL; struct disk_cache_put_job *dc_job = (struct disk_cache_put_job *) job; - if (debug_get_bool_option("MESA_DISK_CACHE_SINGLE_FILE", false)) { + if (dc_job->cache->type == DISK_CACHE_SINGLE_FILE) { disk_cache_write_item_to_disk_foz(dc_job); - } else if (dc_job->cache->use_cache_db) { + } else if (dc_job->cache->type == DISK_CACHE_DATABASE) { disk_cache_db_write_item_to_disk(dc_job); } else { filename = disk_cache_get_cache_filename(dc_job->cache, dc_job->key); @@ -539,9 +565,9 @@ disk_cache_get(struct disk_cache *cache, const cache_key key, size_t *size) if (cache->blob_get_cb) { buf = blob_get_compressed(cache, key, size); - } else if (debug_get_bool_option("MESA_DISK_CACHE_SINGLE_FILE", false)) { + } else if (cache->type == DISK_CACHE_SINGLE_FILE) { buf = disk_cache_load_item_foz(cache, key, size); - } else if (cache->use_cache_db) { + } else if (cache->type == DISK_CACHE_DATABASE) { buf = disk_cache_db_load_item(cache, key, size); } else { char *filename = disk_cache_get_cache_filename(cache, key); diff --git a/src/util/disk_cache_os.c b/src/util/disk_cache_os.c index 6ef0e0dd463..1c554e7c5a4 100644 --- a/src/util/disk_cache_os.c +++ b/src/util/disk_cache_os.c @@ -829,12 +829,13 @@ disk_cache_write_item_to_disk(struct disk_cache_put_job *dc_job, */ char * disk_cache_generate_cache_dir(void *mem_ctx, const char *gpu_name, - const char *driver_id) + const char *driver_id, + enum disk_cache_type cache_type) { char *cache_dir_name = CACHE_DIR_NAME; - if (debug_get_bool_option("MESA_DISK_CACHE_SINGLE_FILE", false)) + if (cache_type == DISK_CACHE_SINGLE_FILE) cache_dir_name = CACHE_DIR_NAME_SF; - else if (debug_get_bool_option("MESA_DISK_CACHE_DATABASE", false)) + else if (cache_type == DISK_CACHE_DATABASE) cache_dir_name = CACHE_DIR_NAME_DB; char *path = getenv("MESA_SHADER_CACHE_DIR"); @@ -904,7 +905,7 @@ disk_cache_generate_cache_dir(void *mem_ctx, const char *gpu_name, return NULL; } - if (debug_get_bool_option("MESA_DISK_CACHE_SINGLE_FILE", false)) { + if (cache_type == DISK_CACHE_SINGLE_FILE) { path = concatenate_and_mkdir(mem_ctx, path, driver_id); if (!path) return NULL; diff --git a/src/util/disk_cache_os.h b/src/util/disk_cache_os.h index 5a34a59961f..d36bf3d343e 100644 --- a/src/util/disk_cache_os.h +++ b/src/util/disk_cache_os.h @@ -48,6 +48,12 @@ extern "C" { /* The number of keys that can be stored in the index. */ #define CACHE_INDEX_MAX_KEYS (1 << CACHE_INDEX_KEY_BITS) +enum disk_cache_type { + DISK_CACHE_MULTI_FILE, + DISK_CACHE_SINGLE_FILE, + DISK_CACHE_DATABASE, +}; + struct disk_cache { /* The path to the cache directory. */ char *path; @@ -60,7 +66,7 @@ struct disk_cache { struct mesa_cache_db cache_db; - bool use_cache_db; + enum disk_cache_type type; /* Seed for rand, which is used to pick a random directory */ uint64_t seed_xorshift128plus[2]; @@ -118,7 +124,8 @@ struct disk_cache_put_job { char * disk_cache_generate_cache_dir(void *mem_ctx, const char *gpu_name, - const char *driver_id); + const char *driver_id, + enum disk_cache_type cache_type); void disk_cache_evict_lru_item(struct disk_cache *cache);
