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);

Reply via email to