zink: add locking for zink_shader::programs

shaders are screen objects now with liveshader caching,
so modifications after creation need to be locked

Reviewed-by: Hoe Hao Cheng <haochengho12907@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12147>
This commit is contained in:
Mike Blumenkrantz 2021-06-09 17:54:06 -04:00 committed by Marge Bot
parent 5c8673d67f
commit f5b9d16823
3 changed files with 6 additions and 0 deletions

View File

@ -938,6 +938,7 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir,
bool have_psiz = false;
ret->programs = _mesa_pointer_set_create(NULL);
simple_mtx_init(&ret->lock, mtx_plain);
nir_variable_mode indirect_derefs_modes = nir_var_function_temp;
if (nir->info.stage == MESA_SHADER_TESS_CTRL ||
@ -1140,6 +1141,7 @@ zink_shader_tcs_create(struct zink_context *ctx, struct zink_shader *vs)
unsigned vertices_per_patch = ctx->gfx_pipeline_state.vertices_per_patch;
struct zink_shader *ret = CALLOC_STRUCT(zink_shader);
ret->programs = _mesa_pointer_set_create(NULL);
simple_mtx_init(&ret->lock, mtx_plain);
nir_shader *nir = nir_shader_create(NULL, MESA_SHADER_TESS_CTRL, &zink_screen(ctx->base.screen)->nir_options, NULL);
nir_function *fn = nir_function_create(nir, "main");

View File

@ -82,6 +82,8 @@ struct zink_shader {
unsigned num_texel_buffers;
uint32_t ubos_used; // bitfield of which ubo indices are used
uint32_t ssbos_used; // bitfield of which ssbo indices are used
simple_mtx_t lock;
struct set *programs;
union {

View File

@ -460,7 +460,9 @@ zink_create_gfx_program(struct zink_context *ctx,
_mesa_sha1_init(&sctx);
for (int i = 0; i < ZINK_SHADER_COUNT; ++i) {
if (prog->modules[i]) {
simple_mtx_lock(&prog->shaders[i]->lock);
_mesa_set_add(prog->shaders[i]->programs, prog);
simple_mtx_unlock(&prog->shaders[i]->lock);
zink_gfx_program_reference(screen, NULL, prog);
_mesa_sha1_update(&sctx, prog->shaders[i]->base.sha1, sizeof(prog->shaders[i]->base.sha1));
}