diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 48f41d61066..702373c0b13 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -3253,8 +3253,10 @@ zink_shader_free(struct zink_context *ctx, struct zink_shader *shader) _mesa_hash_table_remove(ht, he); prog->base.removed = true; } - if (stage != MESA_SHADER_TESS_CTRL || !shader->is_generated) + if (stage != MESA_SHADER_TESS_CTRL || !shader->is_generated) { prog->shaders[stage] = NULL; + prog->stages_remaining &= ~BITFIELD_BIT(stage); + } /* only remove generated tcs during parent tes destruction */ if (stage == MESA_SHADER_TESS_EVAL && shader->generated) prog->shaders[MESA_SHADER_TESS_CTRL] = NULL; diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 08e8f4e3a3b..0b992ac8aff 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -640,6 +640,7 @@ zink_create_gfx_program(struct zink_context *ctx, zink_shader_tcs_create(screen, stages[MESA_SHADER_VERTEX], vertices_per_patch); prog->stages_present |= BITFIELD_BIT(MESA_SHADER_TESS_CTRL); } + prog->stages_remaining = prog->stages_present; assign_io(prog, prog->shaders); diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h index 8a9936919ba..34be80c9a78 100644 --- a/src/gallium/drivers/zink/zink_types.h +++ b/src/gallium/drivers/zink/zink_types.h @@ -798,6 +798,7 @@ struct zink_gfx_program { struct zink_program base; uint32_t stages_present; //mask of stages present in this program + uint32_t stages_remaining; //mask of zink_shader remaining in this program struct nir_shader *nir[ZINK_GFX_SHADER_COUNT]; struct zink_shader_module *modules[ZINK_GFX_SHADER_COUNT]; // compute stage doesn't belong here