From de3d7dbed521c40344c9f8b2b505b6e2b13a7636 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tapani=20P=C3=A4lli?= Date: Wed, 1 Apr 2020 12:08:41 +0300 Subject: [PATCH] mesa/st: release variants for active programs before unref MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Programs can be shared among many contexts and each program holds a variant list which has context specific variants. When context gets destroyed it must make sure it relases all variants, otherwise remaining context that utilizes same program will attempt to save a zombie shader for already deleted context when releasing program and its variants. Fixes: dEQP-EGL.functional.sharing.gles2.program.render and other flaky multihread dEQP-EGL failures. v2: pass program pointer via & (Marek) Signed-off-by: Tapani Pälli Reviewed-by: Marek Olšák Reviewed-by: Jordan Justen Cc: mesa-stable@lists.freedesktop.org Tested-by: Marge Bot Part-of: (cherry picked from commit 84e845c9696ab673f1d95fda47843028ed0c71a7) --- .pick_status.json | 2 +- src/mesa/state_tracker/st_context.c | 12 ++++++------ src/mesa/state_tracker/st_program.c | 13 +++++++++++++ src/mesa/state_tracker/st_program.h | 3 +++ 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index b88e328949e..1b2214cb226 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1273,7 +1273,7 @@ "description": "mesa/st: release variants for active programs before unref", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": null }, diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index 4354b27f3f9..1116780b672 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -1076,12 +1076,12 @@ st_destroy_context(struct st_context *st) simple_mtx_destroy(&st->zombie_sampler_views.mutex); simple_mtx_destroy(&st->zombie_shaders.mutex); - st_reference_prog(st, &st->fp, NULL); - st_reference_prog(st, &st->gp, NULL); - st_reference_prog(st, &st->vp, NULL); - st_reference_prog(st, &st->tcp, NULL); - st_reference_prog(st, &st->tep, NULL); - st_reference_prog(st, &st->cp, NULL); + st_release_program(st, &st->fp); + st_release_program(st, &st->gp); + st_release_program(st, &st->vp); + st_release_program(st, &st->tcp); + st_release_program(st, &st->tep); + st_release_program(st, &st->cp); /* release framebuffer in the winsys buffers list */ LIST_FOR_EACH_ENTRY_SAFE_REV(stfb, next, &st->winsys_buffers, head) { diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index dba4795e6d7..66dc4d16dd9 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -333,6 +333,19 @@ st_release_variants(struct st_context *st, struct st_program *p) */ } +/** + * Free all basic program variants and unref program. + */ +void +st_release_program(struct st_context *st, struct st_program **p) +{ + if (!*p) + return; + + st_release_variants(st, *p); + st_reference_prog(st, p, NULL); +} + void st_finalize_nir_before_variants(struct nir_shader *nir) { diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h index 6b49f8d4681..89d5ecfd6f3 100644 --- a/src/mesa/state_tracker/st_program.h +++ b/src/mesa/state_tracker/st_program.h @@ -314,6 +314,9 @@ st_get_common_variant(struct st_context *st, extern void st_release_variants(struct st_context *st, struct st_program *p); +extern void +st_release_program(struct st_context *st, struct st_program **p); + extern void st_destroy_program_variants(struct st_context *st);