glsl: pass shader source keys to the disk cache
authorTimothy Arceri <tarceri@itsqueeze.com>
Wed, 23 Aug 2017 06:33:00 +0000 (16:33 +1000)
committerTimothy Arceri <tarceri@itsqueeze.com>
Fri, 25 Aug 2017 03:20:29 +0000 (13:20 +1000)
We don't actually write them to disk here. That will happen in the
following commit.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
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 aa6c067d041ffbb0097db5f25c5064d0d0c92f22..3af14be9a1dee58b8affef09c82b191ed4df4620 100644 (file)
@@ -1406,23 +1406,37 @@ shader_cache_write_program_metadata(struct gl_context *ctx,
 
    write_program_resource_list(metadata, prog);
 
+   struct cache_item_metadata cache_item_metadata;
+   cache_item_metadata.type = CACHE_ITEM_TYPE_GLSL;
+   cache_item_metadata.keys =
+      (cache_key *) malloc(prog->NumShaders * sizeof(cache_key));
+   cache_item_metadata.num_keys = prog->NumShaders;
+
+   if (!cache_item_metadata.keys)
+      goto fail;
+
    char sha1_buf[41];
    for (unsigned i = 0; i < prog->NumShaders; i++) {
       disk_cache_put_key(cache, prog->Shaders[i]->sha1);
+      memcpy(cache_item_metadata.keys[i], prog->Shaders[i]->sha1,
+             sizeof(cache_key));
       if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
          _mesa_sha1_format(sha1_buf, prog->Shaders[i]->sha1);
          fprintf(stderr, "marking shader: %s\n", sha1_buf);
       }
    }
 
-   disk_cache_put(cache, prog->data->sha1, metadata->data, metadata->size);
-
-   blob_destroy(metadata);
+   disk_cache_put(cache, prog->data->sha1, metadata->data, metadata->size,
+                  &cache_item_metadata);
 
    if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
       _mesa_sha1_format(sha1_buf, prog->data->sha1);
       fprintf(stderr, "putting program metadata in cache: %s\n", sha1_buf);
    }
+
+fail:
+   free(cache_item_metadata.keys);
+   blob_destroy(metadata);
 }
 
 bool
index 3796ce617047bef3b27a76ee088578b481130396..8e7912c71b6b5fb0f554023e6bb8b1f181df45b9 100644 (file)
@@ -268,7 +268,7 @@ test_put_and_get(void)
    expect_equal(size, 0, "disk_cache_get with non-existent item (size)");
 
    /* Simple test of put and get. */
-   disk_cache_put(cache, blob_key, blob, sizeof(blob));
+   disk_cache_put(cache, blob_key, blob, sizeof(blob), NULL);
 
    /* disk_cache_put() hands things off to a thread give it some time to
     * finish.
@@ -283,7 +283,7 @@ test_put_and_get(void)
 
    /* Test put and get of a second item. */
    disk_cache_compute_key(cache, string, sizeof(string), string_key);
-   disk_cache_put(cache, string_key, string, sizeof(string));
+   disk_cache_put(cache, string_key, string, sizeof(string), NULL);
 
    /* disk_cache_put() hands things off to a thread give it some time to
     * finish.
@@ -324,7 +324,7 @@ test_put_and_get(void)
    disk_cache_compute_key(cache, one_KB, 1024, one_KB_key);
    one_KB_key[0] = blob_key[0];
 
-   disk_cache_put(cache, one_KB_key, one_KB, 1024);
+   disk_cache_put(cache, one_KB_key, one_KB, 1024, NULL);
 
    free(one_KB);
 
@@ -367,8 +367,8 @@ test_put_and_get(void)
    setenv("MESA_GLSL_CACHE_MAX_SIZE", "1M", 1);
    cache = disk_cache_create("test", "make_check", 0);
 
-   disk_cache_put(cache, blob_key, blob, sizeof(blob));
-   disk_cache_put(cache, string_key, string, sizeof(string));
+   disk_cache_put(cache, blob_key, blob, sizeof(blob), NULL);
+   disk_cache_put(cache, string_key, string, sizeof(string), NULL);
 
    /* disk_cache_put() hands things off to a thread give it some time to
     * finish.
@@ -394,7 +394,7 @@ test_put_and_get(void)
    disk_cache_compute_key(cache, one_MB, 1024 * 1024, one_MB_key);
    one_MB_key[0] = blob_key[0];
 
-   disk_cache_put(cache, one_MB_key, one_MB, 1024 * 1024);
+   disk_cache_put(cache, one_MB_key, one_MB, 1024 * 1024, NULL);
 
    free(one_MB);
 
index af432e0b3c7b9640b37a8828018a998ffe7d67bd..35bc0db74e8c1c7538a4f349c9621f3d30033bb1 100644 (file)
@@ -213,7 +213,7 @@ static bool si_shader_cache_insert_shader(struct si_screen *sscreen,
                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));
+                              *((uint32_t *) hw_binary), NULL);
        }
 
        return true;
index ba964eb5f0bcc45d132b8de5d97e40f15ac1c1fb..2c38f27ffd23b46a1978ab41b68ead84991e60dd 100644 (file)
@@ -47,7 +47,7 @@ write_tgsi_to_cache(struct blob *blob, struct pipe_shader_state *tgsi,
    blob_write_bytes(blob, tgsi->tokens,
                     num_tokens * sizeof(struct tgsi_token));
 
-   disk_cache_put(st->ctx->Cache, sha1, blob->data, blob->size);
+   disk_cache_put(st->ctx->Cache, sha1, blob->data, blob->size, NULL);
 }
 
 /**
index d2cd4e85c4659f3dd93ea5bc5ea32bcc331a9aa7..6e85a5e2bea59e0ffd499248d14e00649f703ee5 100644 (file)
@@ -768,7 +768,8 @@ deflate_and_write_to_disk(const void *in_data, size_t in_data_size, int dest,
 
 static struct disk_cache_put_job *
 create_put_job(struct disk_cache *cache, const cache_key key,
-               const void *data, size_t size)
+               const void *data, size_t size,
+               struct cache_item_metadata *cache_item_metadata)
 {
    struct disk_cache_put_job *dc_job = (struct disk_cache_put_job *)
       malloc(sizeof(struct disk_cache_put_job) + size);
@@ -931,10 +932,11 @@ cache_put(void *job, int thread_index)
 
 void
 disk_cache_put(struct disk_cache *cache, const cache_key key,
-               const void *data, size_t size)
+               const void *data, size_t size,
+               struct cache_item_metadata *cache_item_metadata)
 {
    struct disk_cache_put_job *dc_job =
-      create_put_job(cache, key, data, size);
+      create_put_job(cache, key, data, size, cache_item_metadata);
 
    if (dc_job) {
       util_queue_fence_init(&dc_job->fence);
index ef5ec2ac921ec4e4d65e2ff43253ef8a3a3d39c4..d2e4d9a69c7b255fcf2a766d31d3b2bba10fb551 100644 (file)
@@ -141,7 +141,8 @@ disk_cache_remove(struct disk_cache *cache, const cache_key key);
  */
 void
 disk_cache_put(struct disk_cache *cache, const cache_key key,
-               const void *data, size_t size);
+               const void *data, size_t size,
+               struct cache_item_metadata *cache_item_metadata);
 
 /**
  * Retrieve an item previously stored in the cache with the name <key>.
@@ -207,7 +208,8 @@ disk_cache_destroy(struct disk_cache *cache) {
 
 static inline void
 disk_cache_put(struct disk_cache *cache, const cache_key key,
-          const void *data, size_t size)
+               const void *data, size_t size,
+               struct cache_item_metadata *cache_item_metadata)
 {
    return;
 }