diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index ecb2aa6ba0f..798b53488e6 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -427,20 +427,22 @@ zink_create_gfx_program(struct zink_context *ctx, pipe_reference_init(&prog->base.reference, 1); for (int i = 0; i < ZINK_SHADER_COUNT; ++i) { - if (stages[i] || prog->shaders[i]) + if (stages[i]) { _mesa_hash_table_init(&prog->base.shader_cache[i], prog, keybox_hash, keybox_equals); - prog->shaders[i] = stages[i]; - /* always force shader creation during init */ - ctx->dirty_shader_stages |= BITFIELD_BIT(i); + prog->shaders[i] = stages[i]; + prog->stages_present |= BITFIELD_BIT(i); + } } if (stages[PIPE_SHADER_TESS_EVAL] && !stages[PIPE_SHADER_TESS_CTRL]) { prog->shaders[PIPE_SHADER_TESS_EVAL]->generated = prog->shaders[PIPE_SHADER_TESS_CTRL] = zink_shader_tcs_create(ctx, stages[PIPE_SHADER_VERTEX]); _mesa_hash_table_init(&prog->base.shader_cache[PIPE_SHADER_TESS_CTRL], prog, keybox_hash, keybox_equals); - ctx->dirty_shader_stages |= BITFIELD_BIT(PIPE_SHADER_TESS_CTRL); + prog->stages_present |= BITFIELD_BIT(PIPE_SHADER_TESS_CTRL); } + /* always force shader creation during init */ + ctx->dirty_shader_stages |= prog->stages_present; assign_io(prog, prog->shaders); update_shader_modules(ctx, prog->shaders, prog, false); diff --git a/src/gallium/drivers/zink/zink_program.h b/src/gallium/drivers/zink/zink_program.h index 707a93bebe1..7548b45f213 100644 --- a/src/gallium/drivers/zink/zink_program.h +++ b/src/gallium/drivers/zink/zink_program.h @@ -89,7 +89,9 @@ struct zink_program { struct zink_gfx_program { struct zink_program base; + uint32_t stages_present; //mask of stages present in this program struct nir_shader *nir[ZINK_SHADER_COUNT]; + struct zink_shader_module *modules[ZINK_SHADER_COUNT]; // compute stage doesn't belong here struct zink_shader_module *default_variants[ZINK_SHADER_COUNT][2]; //[default, no streamout]