mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 22:00:13 +01:00
mesa/st: release variants for active programs before unref
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 <tapani.palli@intel.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Cc: mesa-stable@lists.freedesktop.org
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4386>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4386>
(cherry picked from commit 84e845c969)
This commit is contained in:
parent
1fdf425560
commit
de3d7dbed5
4 changed files with 23 additions and 7 deletions
|
|
@ -1273,7 +1273,7 @@
|
||||||
"description": "mesa/st: release variants for active programs before unref",
|
"description": "mesa/st: release variants for active programs before unref",
|
||||||
"nominated": true,
|
"nominated": true,
|
||||||
"nomination_type": 0,
|
"nomination_type": 0,
|
||||||
"resolution": 0,
|
"resolution": 1,
|
||||||
"master_sha": null,
|
"master_sha": null,
|
||||||
"because_sha": null
|
"because_sha": null
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1076,12 +1076,12 @@ st_destroy_context(struct st_context *st)
|
||||||
simple_mtx_destroy(&st->zombie_sampler_views.mutex);
|
simple_mtx_destroy(&st->zombie_sampler_views.mutex);
|
||||||
simple_mtx_destroy(&st->zombie_shaders.mutex);
|
simple_mtx_destroy(&st->zombie_shaders.mutex);
|
||||||
|
|
||||||
st_reference_prog(st, &st->fp, NULL);
|
st_release_program(st, &st->fp);
|
||||||
st_reference_prog(st, &st->gp, NULL);
|
st_release_program(st, &st->gp);
|
||||||
st_reference_prog(st, &st->vp, NULL);
|
st_release_program(st, &st->vp);
|
||||||
st_reference_prog(st, &st->tcp, NULL);
|
st_release_program(st, &st->tcp);
|
||||||
st_reference_prog(st, &st->tep, NULL);
|
st_release_program(st, &st->tep);
|
||||||
st_reference_prog(st, &st->cp, NULL);
|
st_release_program(st, &st->cp);
|
||||||
|
|
||||||
/* release framebuffer in the winsys buffers list */
|
/* release framebuffer in the winsys buffers list */
|
||||||
LIST_FOR_EACH_ENTRY_SAFE_REV(stfb, next, &st->winsys_buffers, head) {
|
LIST_FOR_EACH_ENTRY_SAFE_REV(stfb, next, &st->winsys_buffers, head) {
|
||||||
|
|
|
||||||
|
|
@ -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
|
void
|
||||||
st_finalize_nir_before_variants(struct nir_shader *nir)
|
st_finalize_nir_before_variants(struct nir_shader *nir)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -314,6 +314,9 @@ st_get_common_variant(struct st_context *st,
|
||||||
extern void
|
extern void
|
||||||
st_release_variants(struct st_context *st, struct st_program *p);
|
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
|
extern void
|
||||||
st_destroy_program_variants(struct st_context *st);
|
st_destroy_program_variants(struct st_context *st);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue