[Mesa-dev] [PATCH 7/8] st/mesa/glsl: use a thread queue to write to shader cache

Timothy Arceri tarceri at itsqueeze.com
Fri Mar 10 02:28:54 UTC 2017


This uses a thread queue for the GLSL IR cache and the TGSI cache
when adding entries.

This should help reduce any overhead added by the shader cache
when programs are not found in the cache.
---
 src/compiler/glsl/shader_cache.cpp       | 7 ++++---
 src/mesa/state_tracker/st_shader_cache.c | 7 ++++---
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/src/compiler/glsl/shader_cache.cpp b/src/compiler/glsl/shader_cache.cpp
index 1865e96..bbe10a1 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -53,20 +53,21 @@
 #include "ir_rvalue_visitor.h"
 #include "ir_uniform.h"
 #include "linker.h"
 #include "link_varyings.h"
 #include "main/core.h"
 #include "nir.h"
 #include "program.h"
 #include "shader_cache.h"
 #include "util/mesa-sha1.h"
 #include "util/string_to_uint_map.h"
+#include "util/u_queue.h"
 
 extern "C" {
 #include "main/enums.h"
 #include "main/shaderobj.h"
 #include "program/program.h"
 }
 
 static void
 compile_shaders(struct gl_context *ctx, struct gl_shader_program *prog) {
    for (unsigned i = 0; i < prog->NumShaders; i++) {
@@ -1272,23 +1273,23 @@ shader_cache_write_program_metadata(struct gl_context *ctx,
       disk_cache_put_key(cache, prog->Shaders[i]->sha1);
       if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
          fprintf(stderr, "marking shader: %s\n",
                  _mesa_sha1_format(sha1_buf, prog->Shaders[i]->sha1));
       }
    }
 
    struct disk_cache_put_job *dc_job =
       disk_cache_create_put_job(cache, prog->data->sha1, metadata->data,
                                 metadata->size, metadata);
-   disk_cache_put(dc_job, 0);
-
-   free(metadata);
+   util_queue_fence_init(&dc_job->fence);
+   util_queue_add_job(&cache->cache_queue, dc_job, &dc_job->fence,
+                      disk_cache_put, disk_cache_destroy_put_job);
 
    if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
       fprintf(stderr, "putting program metadata in cache: %s\n",
               _mesa_sha1_format(sha1_buf, prog->data->sha1));
    }
 }
 
 bool
 shader_cache_read_program_metadata(struct gl_context *ctx,
                                    struct gl_shader_program *prog)
diff --git a/src/mesa/state_tracker/st_shader_cache.c b/src/mesa/state_tracker/st_shader_cache.c
index 040fbc1..3753533 100644
--- a/src/mesa/state_tracker/st_shader_cache.c
+++ b/src/mesa/state_tracker/st_shader_cache.c
@@ -22,20 +22,21 @@
  */
 
 #include <stdio.h>
 
 #include "st_program.h"
 #include "st_shader_cache.h"
 #include "compiler/glsl/program.h"
 #include "pipe/p_shader_tokens.h"
 #include "program/ir_to_mesa.h"
 #include "util/u_memory.h"
+#include "util/u_queue.h"
 
 static void
 write_stream_out_to_cache(struct blob *blob,
                           struct pipe_shader_state *tgsi)
 {
    blob_write_bytes(blob, &tgsi->stream_output,
                     sizeof(tgsi->stream_output));
 }
 
 static void
@@ -43,21 +44,23 @@ write_tgsi_to_cache(struct blob *blob, struct pipe_shader_state *tgsi,
                     struct st_context *st, unsigned char *sha1,
                     unsigned num_tokens)
 {
    blob_write_uint32(blob, num_tokens);
    blob_write_bytes(blob, tgsi->tokens,
                     num_tokens * sizeof(struct tgsi_token));
 
    struct disk_cache_put_job *dc_job =
       disk_cache_create_put_job(st->ctx->Cache, sha1, blob->data, blob->size,
                                 blob);
-   disk_cache_put(dc_job, 0);
+   util_queue_fence_init(&dc_job->fence);
+   util_queue_add_job(&st->ctx->Cache->cache_queue, dc_job, &dc_job->fence,
+                      disk_cache_put, disk_cache_destroy_put_job);
 }
 
 /**
  * Store tgsi and any other required state in on-disk shader cache.
  */
 void
 st_store_tgsi_in_disk_cache(struct st_context *st, struct gl_program *prog,
                             struct pipe_shader_state *out_state,
                             unsigned num_tokens)
 {
@@ -129,22 +132,20 @@ st_store_tgsi_in_disk_cache(struct st_context *st, struct gl_program *prog,
    default:
       unreachable("Unsupported stage");
    }
 
    if (st->ctx->_Shader->Flags & GLSL_CACHE_INFO) {
       char sha1_buf[41];
       _mesa_sha1_format(sha1_buf, sha1);
       fprintf(stderr, "putting %s tgsi_tokens in cache: %s\n",
               _mesa_shader_stage_to_string(prog->info.stage), sha1_buf);
    }
-
-   free(blob);
 }
 
 static void
 read_stream_out_from_cache(struct blob_reader *blob_reader,
                            struct pipe_shader_state *tgsi)
 {
    blob_copy_bytes(blob_reader, (uint8_t *) &tgsi->stream_output,
                     sizeof(tgsi->stream_output));
 }
 
-- 
2.9.3



More information about the mesa-dev mailing list