Mesa (master): mesa: delete framebuffer texture attachment sampler views

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jun 28 19:31:45 UTC 2019


Module: Mesa
Branch: master
Commit: c37f03d46480e73d7c0cbfe93e91cd8d69d47220
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c37f03d46480e73d7c0cbfe93e91cd8d69d47220

Author: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Date:   Mon Jun 10 16:45:23 2019 +0200

mesa: delete framebuffer texture attachment sampler views

When a context is destroyed the destroy_tex_sampler_cb makes sure that all the
sampler views created by that context are destroyed.
This is done by walking the ctx->Shared->TexObjects hash table.

In a multiple context environment the texture can be deleted by a different context,
so it will be removed from the TexObjects table and will prevent the above mechanism
to work.
This can result in an assertion in st_save_zombie_sampler_view because the
sampler_view owns a reference to a destroyed context.

This issue occurs in blender 2.80.

This commit fixes this by explicitly releasing sampler_view created by the destroyed
context for all texture attachments.

Fixes: 593e36f956 (st/mesa: implement "zombie" sampler views (v2))
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=110944
Signed-off-by: Marek Olšák <marek.olsak at amd.com>

---

 src/mesa/state_tracker/st_context.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
index fbf44ef352c..4d1ee6b418c 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -921,6 +921,19 @@ destroy_tex_sampler_cb(GLuint id, void *data, void *userData)
    st_texture_release_context_sampler_view(st, st_texture_object(texObj));
 }
 
+static void
+destroy_framebuffer_attachment_sampler_cb(GLuint id, void *data, void *userData)
+{
+   struct gl_framebuffer* glfb = (struct gl_framebuffer*) data;
+   struct st_context *st = (struct st_context *) userData;
+
+    for (unsigned i = 0; i < BUFFER_COUNT; i++) {
+      struct gl_renderbuffer_attachment *att = &glfb->Attachment[i];
+      if (att->Texture) {
+        st_texture_release_context_sampler_view(st, st_texture_object(att->Texture));
+      }
+   }
+}
 
 void
 st_destroy_context(struct st_context *st)
@@ -979,6 +992,8 @@ st_destroy_context(struct st_context *st)
       st_framebuffer_reference(&stfb, NULL);
    }
 
+   _mesa_HashWalk(ctx->Shared->FrameBuffers, destroy_framebuffer_attachment_sampler_cb, st);
+
    pipe_sampler_view_reference(&st->pixel_xfer.pixelmap_sampler_view, NULL);
    pipe_resource_reference(&st->pixel_xfer.pixelmap_texture, NULL);
 




More information about the mesa-commit mailing list