summaryrefslogtreecommitdiffstats
path: root/src/mesa/state_tracker
diff options
context:
space:
mode:
authorPierre-Eric Pelloux-Prayer <[email protected]>2019-06-10 16:45:23 +0200
committerMarek Olšák <[email protected]>2019-06-28 15:29:08 -0400
commitc37f03d46480e73d7c0cbfe93e91cd8d69d47220 (patch)
tree41646119face0b3d20ebd47eefed00899f5bd089 /src/mesa/state_tracker
parent7389bf9761ae8ed7f28c631954c5d263263f3882 (diff)
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 <[email protected]>
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r--src/mesa/state_tracker/st_context.c15
1 files changed, 15 insertions, 0 deletions
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);