mesa/st: release variants for active programs before unref
authorTapani Pälli <tapani.palli@intel.com>
Wed, 1 Apr 2020 09:08:41 +0000 (12:08 +0300)
committerTapani Pälli <tapani.palli@intel.com>
Mon, 6 Apr 2020 05:00:00 +0000 (08:00 +0300)
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>

src/mesa/state_tracker/st_context.c
src/mesa/state_tracker/st_program.c
src/mesa/state_tracker/st_program.h

index fa309436408f2843a3b05555aef35fd82918252e..645c02f3dfd592ccdff85c4f1168b85f059a76e1 100644 (file)
@@ -1070,12 +1070,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) {
index 466c3f1a29e5028f97c0aa9c1177b0155fa8a8b6..c0e63b8a98c8cae18625c7fe25977c7085885ad9 100644 (file)
@@ -334,6 +334,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)
 {
index 87ac3388d7276c81a6498763190d906b8e46caa7..286fabc01172f772d9b80a1526d9ac50fe6152d3 100644 (file)
@@ -317,6 +317,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);