Module: Mesa
Branch: main
Commit: 6482cf12ca31ee4595f531966a90310764357f43
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=6482cf12ca31ee4595f531966a90310764357f43

Author: Mike Blumenkrantz <[email protected]>
Date:   Thu Feb  9 12:12:16 2023 -0500

zink: store gfx_hash on zink_gfx_program

this avoids needing to reference ctx->gfx_hash in threads or recalc the hash

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21223>

---

 src/gallium/drivers/zink/zink_program.c | 13 ++++++++-----
 src/gallium/drivers/zink/zink_program.h |  3 ++-
 src/gallium/drivers/zink/zink_types.h   |  1 +
 3 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_program.c 
b/src/gallium/drivers/zink/zink_program.c
index 9a255255ec5..3e7b32799d2 100644
--- a/src/gallium/drivers/zink/zink_program.c
+++ b/src/gallium/drivers/zink/zink_program.c
@@ -607,7 +607,7 @@ zink_gfx_program_update(struct zink_context *ctx)
          update_gfx_program(ctx, prog);
       } else {
          ctx->dirty_gfx_stages |= ctx->shader_stages;
-         prog = zink_create_gfx_program(ctx, ctx->gfx_stages, 
ctx->gfx_pipeline_state.dyn_state2.vertices_per_patch);
+         prog = zink_create_gfx_program(ctx, ctx->gfx_stages, 
ctx->gfx_pipeline_state.dyn_state2.vertices_per_patch, hash);
          zink_screen_get_pipeline_cache(zink_screen(ctx->base.screen), 
&prog->base, false);
          _mesa_hash_table_insert_pre_hashed(ht, hash, prog->shaders, prog);
          generate_gfx_program_modules(ctx, zink_screen(ctx->base.screen), 
prog, &ctx->gfx_pipeline_state);
@@ -933,7 +933,8 @@ assign_io(struct zink_screen *screen,
 struct zink_gfx_program *
 zink_create_gfx_program(struct zink_context *ctx,
                         struct zink_shader **stages,
-                        unsigned vertices_per_patch)
+                        unsigned vertices_per_patch,
+                        uint32_t gfx_hash)
 {
    struct zink_screen *screen = zink_screen(ctx->base.screen);
    struct zink_gfx_program *prog = create_program(ctx, false);
@@ -941,6 +942,7 @@ zink_create_gfx_program(struct zink_context *ctx,
       goto fail;
 
    prog->ctx = ctx;
+   prog->gfx_hash = gfx_hash;
 
    for (int i = 0; i < ZINK_GFX_SHADER_COUNT; ++i) {
       util_dynarray_init(&prog->shader_cache[i][0][0], NULL);
@@ -1017,7 +1019,7 @@ static void
 create_linked_separable_job(void *data, void *gdata, int thread_index)
 {
    struct zink_gfx_program *prog = data;
-   prog->full_prog = zink_create_gfx_program(prog->ctx, prog->shaders, 0);
+   prog->full_prog = zink_create_gfx_program(prog->ctx, prog->shaders, 0, 
prog->gfx_hash);
    precompile_job(prog->full_prog, gdata, thread_index);
 }
 
@@ -1032,7 +1034,7 @@ create_gfx_program_separable(struct zink_context *ctx, 
struct zink_shader **stag
        /* TODO: maybe try variants? grimace */
        
!ZINK_SHADER_KEY_OPTIMAL_IS_DEFAULT(ctx->gfx_pipeline_state.optimal_key) ||
        !zink_can_use_pipeline_libs(ctx))
-      return zink_create_gfx_program(ctx, stages, vertices_per_patch);
+      return zink_create_gfx_program(ctx, stages, vertices_per_patch, 
ctx->gfx_hash);
    /* ensure async gpl creation is done */
    util_queue_fence_wait(&stages[MESA_SHADER_VERTEX]->precompile.fence);
    util_queue_fence_wait(&stages[MESA_SHADER_FRAGMENT]->precompile.fence);
@@ -1043,6 +1045,7 @@ create_gfx_program_separable(struct zink_context *ctx, 
struct zink_shader **stag
 
    prog->ctx = ctx;
    prog->is_separable = true;
+   prog->gfx_hash = ctx->gfx_hash;
 
    prog->shaders[MESA_SHADER_VERTEX] = stages[MESA_SHADER_VERTEX];
    prog->stages_remaining = prog->stages_present = shader_stages;
@@ -1965,7 +1968,7 @@ zink_link_gfx_shader(struct pipe_context *pctx, void 
**shaders)
       
simple_mtx_unlock(&ctx->program_lock[zink_program_cache_stages(shader_stages)]);
       return;
    }
-   struct zink_gfx_program *prog = zink_create_gfx_program(ctx, zshaders, 3);
+   struct zink_gfx_program *prog = zink_create_gfx_program(ctx, zshaders, 3, 
hash);
    u_foreach_bit(i, shader_stages)
       assert(prog->shaders[i]);
    _mesa_hash_table_insert_pre_hashed(ht, hash, prog->shaders, prog);
diff --git a/src/gallium/drivers/zink/zink_program.h 
b/src/gallium/drivers/zink/zink_program.h
index 342f06c3463..527b721fd86 100644
--- a/src/gallium/drivers/zink/zink_program.h
+++ b/src/gallium/drivers/zink/zink_program.h
@@ -149,7 +149,8 @@ get_primtype_idx(enum pipe_prim_type mode)
 struct zink_gfx_program *
 zink_create_gfx_program(struct zink_context *ctx,
                         struct zink_shader **stages,
-                        unsigned vertices_per_patch);
+                        unsigned vertices_per_patch,
+                        uint32_t gfx_hash);
 
 void
 zink_destroy_gfx_program(struct zink_screen *screen,
diff --git a/src/gallium/drivers/zink/zink_types.h 
b/src/gallium/drivers/zink/zink_types.h
index 806429d28c2..cfbbd70e066 100644
--- a/src/gallium/drivers/zink/zink_types.h
+++ b/src/gallium/drivers/zink/zink_types.h
@@ -991,6 +991,7 @@ struct zink_gfx_program {
 
    uint32_t stages_present; //mask of stages present in this program
    uint32_t stages_remaining; //mask of zink_shader remaining in this program
+   uint32_t gfx_hash; //from ctx->gfx_hash
 
    struct zink_shader *shaders[ZINK_GFX_SHADER_COUNT];
    struct zink_shader *last_vertex_stage;

Reply via email to