Mesa (main): zink: invoke descriptor_program_deinit for programs on context destroy

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jul 20 20:16:50 UTC 2022


Module: Mesa
Branch: main
Commit: 4123ee3c71461d7d045fec519130128a7fc4e643
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4123ee3c71461d7d045fec519130128a7fc4e643

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Wed Jul 20 11:44:16 2022 -0400

zink: invoke descriptor_program_deinit for programs on context destroy

this should make multi-context shutdown more stable

affects:
glx at glx-visuals-depth -pixmap
glx at glx-visuals-stencil

cc: mesa-stable

Reviewed-by: Adam Jackson <ajax at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17658>

---

 src/gallium/drivers/zink/ci/zink-lvp-fails.txt   |  2 --
 src/gallium/drivers/zink/zink_context.c          | 11 +++++++++++
 src/gallium/drivers/zink/zink_descriptors_lazy.c |  3 +++
 3 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/zink/ci/zink-lvp-fails.txt b/src/gallium/drivers/zink/ci/zink-lvp-fails.txt
index d78ecdd158c..ce0d742d3b1 100644
--- a/src/gallium/drivers/zink/ci/zink-lvp-fails.txt
+++ b/src/gallium/drivers/zink/ci/zink-lvp-fails.txt
@@ -143,9 +143,7 @@ glx at glx-copy-sub-buffer samples=2,Fail
 glx at glx-copy-sub-buffer samples=4,Fail
 glx at glx-swap-pixmap-bad,Fail
 glx at glx-visuals-depth,Crash
-glx at glx-visuals-depth -pixmap,Crash
 glx at glx-visuals-stencil,Crash
-glx at glx-visuals-stencil -pixmap,Crash
 glx at glx_arb_create_context_es2_profile@invalid opengl es version,Fail
 # X error 167 (GLXBadFBConfig (9)) was generated, but X error 8 was expected.
 glx at glx_arb_create_context_no_error@no error,Crash
diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index 4a5bb4852ba..3494733e1ce 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -101,6 +101,17 @@ zink_context_destroy(struct pipe_context *pctx)
    if (ctx->batch.state && !screen->device_lost && VKSCR(QueueWaitIdle)(screen->queue) != VK_SUCCESS)
       mesa_loge("ZINK: vkQueueWaitIdle failed");
 
+   for (unsigned i = 0; i < ARRAY_SIZE(ctx->program_cache); i++) {
+      hash_table_foreach(&ctx->program_cache[i], entry) {
+         struct zink_program *pg = entry->data;
+         screen->descriptor_program_deinit(ctx, pg);
+      }
+   }
+   hash_table_foreach(&ctx->compute_program_cache, entry) {
+      struct zink_program *pg = entry->data;
+      screen->descriptor_program_deinit(ctx, pg);
+   }
+
    if (ctx->blitter)
       util_blitter_destroy(ctx->blitter);
    for (unsigned i = 0; i < ctx->fb_state.nr_cbufs; i++)
diff --git a/src/gallium/drivers/zink/zink_descriptors_lazy.c b/src/gallium/drivers/zink/zink_descriptors_lazy.c
index a42239943a4..abf0b840d14 100644
--- a/src/gallium/drivers/zink/zink_descriptors_lazy.c
+++ b/src/gallium/drivers/zink/zink_descriptors_lazy.c
@@ -354,6 +354,8 @@ void
 zink_descriptor_program_deinit_lazy(struct zink_context *ctx, struct zink_program *pg)
 {
    struct zink_screen *screen = zink_screen(ctx->base.screen);
+   if (!pg->dd)
+      return;
    for (unsigned i = 0; pg->num_dsl && i < ZINK_DESCRIPTOR_TYPES; i++) {
       if (pg->dd->pool_key[i])
          pg->dd->pool_key[i]->use_count--;
@@ -363,6 +365,7 @@ zink_descriptor_program_deinit_lazy(struct zink_context *ctx, struct zink_progra
          VKSCR(DestroyDescriptorUpdateTemplate)(screen->dev, pg->dd->templates[i], NULL);
    }
    ralloc_free(pg->dd);
+   pg->dd = NULL;
 }
 
 static VkDescriptorPool



More information about the mesa-commit mailing list