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

Author: Mike Blumenkrantz <[email protected]>
Date:   Fri Feb 10 10:42:24 2023 -0500

zink: flag gfx programs as removed-from-cache by default

this fixes some desync where async programs are destroyed before being
added to the cache

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

---

 src/gallium/drivers/zink/zink_program.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/gallium/drivers/zink/zink_program.c 
b/src/gallium/drivers/zink/zink_program.c
index fdaeeb4792f..9ac3af03dce 100644
--- a/src/gallium/drivers/zink/zink_program.c
+++ b/src/gallium/drivers/zink/zink_program.c
@@ -610,6 +610,7 @@ zink_gfx_program_update(struct zink_context *ctx)
          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);
+         prog->base.removed = false;
          generate_gfx_program_modules(ctx, zink_screen(ctx->base.screen), 
prog, &ctx->gfx_pipeline_state);
       }
       
simple_mtx_unlock(&ctx->program_lock[zink_program_cache_stages(ctx->shader_stages)]);
@@ -698,6 +699,7 @@ zink_gfx_program_update_optimal(struct zink_context *ctx)
             if (util_queue_fence_is_signalled(&prog->base.cache_fence)) {
                struct zink_gfx_program *real = prog->full_prog;
                entry->data = real;
+               real->base.removed = false;
                prog->full_prog = NULL;
                prog->base.removed = true;
                zink_gfx_program_reference(zink_screen(ctx->base.screen), 
&prog, NULL);
@@ -708,6 +710,7 @@ zink_gfx_program_update_optimal(struct zink_context *ctx)
       } else {
          ctx->dirty_gfx_stages |= ctx->shader_stages;
          prog = create_gfx_program_separable(ctx, ctx->gfx_stages, 
ctx->gfx_pipeline_state.dyn_state2.vertices_per_patch);
+         prog->base.removed = false;
          _mesa_hash_table_insert_pre_hashed(ht, hash, prog->shaders, prog);
          if (!prog->is_separable) {
             zink_screen_get_pipeline_cache(zink_screen(ctx->base.screen), 
&prog->base, false);
@@ -734,6 +737,7 @@ zink_gfx_program_update_optimal(struct zink_context *ctx)
             struct hash_entry *entry = _mesa_hash_table_search_pre_hashed(ht, 
hash, ctx->gfx_stages);
             struct zink_gfx_program *real = prog->full_prog;
             entry->data = real;
+            real->base.removed = false;
             prog->full_prog = NULL;
             prog->base.removed = true;
             zink_gfx_program_reference(zink_screen(ctx->base.screen), &prog, 
NULL);
@@ -1007,6 +1011,7 @@ zink_create_gfx_program(struct zink_context *ctx,
 
    prog->ctx = ctx;
    prog->gfx_hash = gfx_hash;
+   prog->base.removed = true;
 
    for (int i = 0; i < ZINK_GFX_SHADER_COUNT; ++i) {
       util_dynarray_init(&prog->shader_cache[i][0][0], NULL);
@@ -2033,6 +2038,7 @@ zink_link_gfx_shader(struct pipe_context *pctx, void 
**shaders)
    u_foreach_bit(i, shader_stages)
       assert(prog->shaders[i]);
    _mesa_hash_table_insert_pre_hashed(ht, hash, prog->shaders, prog);
+   prog->base.removed = false;
    
simple_mtx_unlock(&ctx->program_lock[zink_program_cache_stages(shader_stages)]);
    if (zink_debug & ZINK_DEBUG_SHADERDB) {
       struct zink_screen *screen = zink_screen(pctx->screen);

Reply via email to