diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index b83358a59c3..f24a438d051 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -705,7 +705,6 @@ replace_separable_prog(struct zink_screen *screen, struct hash_entry *entry, str real->base.removed = false; prog->full_prog = NULL; prog->base.removed = true; - zink_gfx_program_reference(screen, &prog, NULL); return real; } @@ -1155,6 +1154,8 @@ 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->gfx_hash); + /* add an ownership ref */ + zink_gfx_program_reference(zink_screen(prog->ctx->base.screen), NULL, prog->full_prog); precompile_job(prog->full_prog, gdata, thread_index); } @@ -1223,7 +1224,7 @@ create_gfx_program_separable(struct zink_context *ctx, struct zink_shader **stag /* We can do this add after the _mesa_set_adds above because we know the prog->shaders[] are * referenced by the draw state and zink_gfx_shader_free() can't be called on them while we're in here. */ - p_atomic_add(&prog->base.reference.count, refs); + p_atomic_add(&prog->base.reference.count, refs - 1); for (int r = 0; r < ARRAY_SIZE(prog->pipelines); ++r) { for (int i = 0; i < ARRAY_SIZE(prog->pipelines[0]); ++i) {