util/disk_cache: use a helper to compute cache keys
authorGrazvydas Ignotas <notasas@gmail.com>
Wed, 15 Mar 2017 23:09:27 +0000 (01:09 +0200)
committerTimothy Arceri <tarceri@itsqueeze.com>
Tue, 21 Mar 2017 00:15:52 +0000 (11:15 +1100)
This will allow to hash additional data into the cache keys or even
change the hashing algorithm easily, should we decide to do so.

v2: don't try to compute key (and crash) if cache is disabled

Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/glsl/glsl_parser_extras.cpp
src/compiler/glsl/shader_cache.cpp
src/compiler/glsl/tests/cache_test.c
src/gallium/drivers/radeonsi/si_state_shaders.c
src/mesa/state_tracker/st_shader_cache.c
src/util/disk_cache.c
src/util/disk_cache.h

index 48cbc01ba74f05b081e6fa14621582092b689dc6..8b5df3bdd89f0263ba787ce02a2a1e3f94190d2f 100644 (file)
@@ -1938,19 +1938,22 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader,
                              add_builtin_defines, state, ctx);
 
    if (!force_recompile) {
-      char buf[41];
-      _mesa_sha1_compute(source, strlen(source), shader->sha1);
-      if (ctx->Cache && disk_cache_has_key(ctx->Cache, shader->sha1)) {
-         /* We've seen this shader before and know it compiles */
-         if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
-            _mesa_sha1_format(buf, shader->sha1);
-            fprintf(stderr, "deferring compile of shader: %s\n", buf);
-         }
-         shader->CompileStatus = compile_skipped;
+      if (ctx->Cache) {
+         char buf[41];
+         disk_cache_compute_key(ctx->Cache, source, strlen(source),
+                                shader->sha1);
+         if (disk_cache_has_key(ctx->Cache, shader->sha1)) {
+            /* We've seen this shader before and know it compiles */
+            if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
+               _mesa_sha1_format(buf, shader->sha1);
+               fprintf(stderr, "deferring compile of shader: %s\n", buf);
+            }
+            shader->CompileStatus = compile_skipped;
 
-         free((void *)shader->FallbackSource);
-         shader->FallbackSource = NULL;
-         return;
+            free((void *)shader->FallbackSource);
+            shader->FallbackSource = NULL;
+            return;
+         }
       }
    } else {
       /* We should only ever end up here if a re-compile has been forced by a
index 4b314d59b0e597b70ccd848d6296e7ac2eeb6012..dd8c6c0b408708dffd3cdcda3bfa83dcd4dcfd62 100644 (file)
@@ -1331,7 +1331,7 @@ shader_cache_read_program_metadata(struct gl_context *ctx,
       ralloc_asprintf_append(&buf, "%s: %s\n",
                              _mesa_shader_stage_to_abbrev(sh->Stage), sha1buf);
    }
-   _mesa_sha1_compute(buf, strlen(buf), prog->data->sha1);
+   disk_cache_compute_key(cache, buf, strlen(buf), prog->data->sha1);
    ralloc_free(buf);
 
    size_t size;
index 832693e10395c3f42f319a5051046fa618049ee0..ee6e84b45a434976b0e82a78c877736c59a1e9bf 100644 (file)
@@ -271,7 +271,7 @@ test_put_and_get(void)
 
    cache = disk_cache_create("test", "make_check");
 
-   _mesa_sha1_compute(blob, sizeof(blob), blob_key);
+   disk_cache_compute_key(cache, blob, sizeof(blob), blob_key);
 
    /* Ensure that disk_cache_get returns nothing before anything is added. */
    result = disk_cache_get(cache, blob_key, &size);
@@ -293,7 +293,7 @@ test_put_and_get(void)
    free(result);
 
    /* Test put and get of a second item. */
-   _mesa_sha1_compute(string, sizeof(string), string_key);
+   disk_cache_compute_key(cache, string, sizeof(string), string_key);
    disk_cache_put(cache, string_key, string, sizeof(string));
 
    /* disk_cache_put() hands things off to a thread give it some time to
@@ -332,7 +332,7 @@ test_put_and_get(void)
     * For this test, we force this signature to land in the same
     * directory as the original blob first written to the cache.
     */
-   _mesa_sha1_compute(one_KB, 1024, one_KB_key);
+   disk_cache_compute_key(cache, one_KB, 1024, one_KB_key);
    one_KB_key[0] = blob_key_byte_zero;
 
    disk_cache_put(cache, one_KB_key, one_KB, 1024);
@@ -402,7 +402,7 @@ test_put_and_get(void)
    /* Finally, check eviction again after adding an object of size 1M. */
    one_MB = calloc(1024, 1024);
 
-   _mesa_sha1_compute(one_MB, 1024 * 1024, one_MB_key);
+   disk_cache_compute_key(cache, one_MB, 1024 * 1024, one_MB_key);
    one_MB_key[0] = blob_key_byte_zero;;
 
    disk_cache_put(cache, one_MB_key, one_MB, 1024 * 1024);
index 3596f5af72ae3e9309c3bd0c7ba79c5b902637f7..30856b08ac5151683b262d6a128a26561758a361 100644 (file)
@@ -207,7 +207,8 @@ static bool si_shader_cache_insert_shader(struct si_screen *sscreen,
        }
 
        if (sscreen->b.disk_shader_cache && insert_into_disk_cache) {
-               _mesa_sha1_compute(tgsi_binary, *((uint32_t *)tgsi_binary), key);
+               disk_cache_compute_key(sscreen->b.disk_shader_cache, tgsi_binary,
+                                      *((uint32_t *)tgsi_binary), key);
                disk_cache_put(sscreen->b.disk_shader_cache, key, hw_binary,
                               *((uint32_t *) hw_binary));
        }
@@ -226,7 +227,8 @@ static bool si_shader_cache_load_shader(struct si_screen *sscreen,
                        unsigned char sha1[CACHE_KEY_SIZE];
                        size_t tg_size = *((uint32_t *) tgsi_binary);
 
-                       _mesa_sha1_compute(tgsi_binary, tg_size, sha1);
+                       disk_cache_compute_key(sscreen->b.disk_shader_cache,
+                                              tgsi_binary, tg_size, sha1);
 
                        size_t binary_size;
                        uint8_t *buffer =
index 43831947b235d81a2b99e8a3a32fcc4070311efb..061b27221b399830d1f3b0b33c3ef8e8bcb0a8eb 100644 (file)
@@ -183,7 +183,7 @@ st_load_tgsi_from_disk_cache(struct gl_context *ctx,
          struct st_vertex_program *stvp = (struct st_vertex_program *) glprog;
          stage_sha1[i] = stvp->sha1;
          ralloc_strcat(&buf, " vs");
-         _mesa_sha1_compute(buf, strlen(buf), stage_sha1[i]);
+         disk_cache_compute_key(ctx->Cache, buf, strlen(buf), stage_sha1[i]);
          break;
       }
       case MESA_SHADER_TESS_CTRL: {
@@ -191,7 +191,7 @@ st_load_tgsi_from_disk_cache(struct gl_context *ctx,
             (struct st_tessctrl_program *) glprog;
          stage_sha1[i] = stcp->sha1;
          ralloc_strcat(&buf, " tcs");
-         _mesa_sha1_compute(buf, strlen(buf), stage_sha1[i]);
+         disk_cache_compute_key(ctx->Cache, buf, strlen(buf), stage_sha1[i]);
          break;
       }
       case MESA_SHADER_TESS_EVAL: {
@@ -199,7 +199,7 @@ st_load_tgsi_from_disk_cache(struct gl_context *ctx,
             (struct st_tesseval_program *) glprog;
          stage_sha1[i] = step->sha1;
          ralloc_strcat(&buf, " tes");
-         _mesa_sha1_compute(buf, strlen(buf), stage_sha1[i]);
+         disk_cache_compute_key(ctx->Cache, buf, strlen(buf), stage_sha1[i]);
          break;
       }
       case MESA_SHADER_GEOMETRY: {
@@ -207,7 +207,7 @@ st_load_tgsi_from_disk_cache(struct gl_context *ctx,
             (struct st_geometry_program *) glprog;
          stage_sha1[i] = stgp->sha1;
          ralloc_strcat(&buf, " gs");
-         _mesa_sha1_compute(buf, strlen(buf), stage_sha1[i]);
+         disk_cache_compute_key(ctx->Cache, buf, strlen(buf), stage_sha1[i]);
          break;
       }
       case MESA_SHADER_FRAGMENT: {
@@ -215,7 +215,7 @@ st_load_tgsi_from_disk_cache(struct gl_context *ctx,
             (struct st_fragment_program *) glprog;
          stage_sha1[i] = stfp->sha1;
          ralloc_strcat(&buf, " fs");
-         _mesa_sha1_compute(buf, strlen(buf), stage_sha1[i]);
+         disk_cache_compute_key(ctx->Cache, buf, strlen(buf), stage_sha1[i]);
          break;
       }
       case MESA_SHADER_COMPUTE: {
@@ -223,7 +223,7 @@ st_load_tgsi_from_disk_cache(struct gl_context *ctx,
             (struct st_compute_program *) glprog;
          stage_sha1[i] = stcp->sha1;
          ralloc_strcat(&buf, " cs");
-         _mesa_sha1_compute(buf, strlen(buf), stage_sha1[i]);
+         disk_cache_compute_key(ctx->Cache, buf, strlen(buf), stage_sha1[i]);
          break;
       }
       default:
index d7e1996c41b07e838bdad6e47bb8003ab3ef74d1..2478a1a41707b3ccfcf71b2ca0602717ae44dbd1 100644 (file)
@@ -1063,4 +1063,11 @@ disk_cache_has_key(struct disk_cache *cache, const cache_key key)
    return memcmp(entry, key, CACHE_KEY_SIZE) == 0;
 }
 
+void
+disk_cache_compute_key(struct disk_cache *cache, const void *data, size_t size,
+                       cache_key key)
+{
+   _mesa_sha1_compute(data, size, key);
+}
+
 #endif /* ENABLE_SHADER_CACHE */
index 3659b6dc35897cb75695d2c7fecd6819967a7b31..e3663a65c51e75899ba1e13b2e06e3bc0f48cefe 100644 (file)
@@ -178,6 +178,13 @@ disk_cache_put_key(struct disk_cache *cache, const cache_key key);
 bool
 disk_cache_has_key(struct disk_cache *cache, const cache_key key);
 
+/**
+ * Compute the name \key from \data of given \size.
+ */
+void
+disk_cache_compute_key(struct disk_cache *cache, const void *data, size_t size,
+                       cache_key key);
+
 #else
 
 static inline struct disk_cache *
@@ -222,6 +229,13 @@ disk_cache_has_key(struct disk_cache *cache, const cache_key key)
    return false;
 }
 
+void
+disk_cache_compute_key(struct disk_cache *cache, const void *data, size_t size,
+                       const cache_key key)
+{
+   return;
+}
+
 #endif /* ENABLE_SHADER_CACHE */
 
 #ifdef __cplusplus