<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<span style="color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif; font-size: 12pt;">Looks good to me.</span><br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Reviewed-by: Jose Fonseca <jfonseca@vmware.com></div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Though I wonder if this could happen also when not destroying the current context. (Ie, if we need zoombie textures too?)</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Jose</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>From:</b> Brian Paul <brianp@vmware.com><br>
<b>Sent:</b> Friday, March 22, 2019 19:51<br>
<b>To:</b> mesa-dev@lists.freedesktop.org<br>
<b>Cc:</b> Jose Fonseca; Neha Bhende<br>
<b>Subject:</b> [PATCH] st/mesa: fix texture deletion context mix-up issues (v2)</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt">
<div class="PlainText">When we destroy a context, we need to temporarily make that context<br>
the current one for the thread.<br>
<br>
That's because during context tear-down we make many calls to<br>
_mesa_reference_texobj(&texObj, NULL).  Note there's no context<br>
parameter.  If the texture's refcount goes to zero and we need to<br>
delete it, we use the thread's current context.  But if that context<br>
isn't the context we're tearing down, we get into trouble when<br>
deallocating sampler views.  See patch 593e36f956 ("st/mesa:<br>
implement "zombie" sampler views (v2)") for background information.<br>
<br>
Also, we need to release any sampler views attached to the fallback<br>
textures.<br>
<br>
Fixes a crash on exit with a glretrace of the Nobel Clinician<br>
application.<br>
<br>
v2: at end of st_destroy_context(), check if save_ctx == ctx and<br>
unbind the context if so.<br>
---<br>
 src/mesa/state_tracker/st_context.c | 51 ++++++++++++++++++++++++++++---------<br>
 1 file changed, 39 insertions(+), 12 deletions(-)<br>
<br>
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c<br>
index f037384..09d467a 100644<br>
--- a/src/mesa/state_tracker/st_context.c<br>
+++ b/src/mesa/state_tracker/st_context.c<br>
@@ -917,15 +917,39 @@ st_destroy_context(struct st_context *st)<br>
 {<br>
    struct gl_context *ctx = st->ctx;<br>
    struct st_framebuffer *stfb, *next;<br>
+   struct gl_framebuffer *save_drawbuffer;<br>
+   struct gl_framebuffer *save_readbuffer;<br>
+<br>
+   /* Save the current context and draw/read buffers*/<br>
+   GET_CURRENT_CONTEXT(save_ctx);<br>
+   if (save_ctx) {<br>
+      save_drawbuffer = save_ctx->WinSysDrawBuffer;<br>
+      save_readbuffer = save_ctx->WinSysReadBuffer;<br>
+   } else {<br>
+      save_drawbuffer = save_readbuffer = NULL;<br>
+   }<br>
 <br>
-   GET_CURRENT_CONTEXT(curctx);<br>
+   /*<br>
+    * We need to bind the context we're deleting so that<br>
+    * _mesa_reference_texobj_() uses this context when deleting textures.<br>
+    * Similarly for framebuffer objects, etc.<br>
+    */<br>
+   _mesa_make_current(ctx, NULL, NULL);<br>
 <br>
-   if (curctx == NULL) {<br>
-      /* No current context, but we need one to release<br>
-       * renderbuffer surface when we release framebuffer.<br>
-       * So temporarily bind the context.<br>
-       */<br>
-      _mesa_make_current(ctx, NULL, NULL);<br>
+   /* This must be called first so that glthread has a chance to finish */<br>
+   _mesa_glthread_destroy(ctx);<br>
+<br>
+   _mesa_HashWalk(ctx->Shared->TexObjects, destroy_tex_sampler_cb, st);<br>
+<br>
+   /* For the fallback textures, free any sampler views belonging to this<br>
+    * context.<br>
+    */<br>
+   for (unsigned i = 0; i < NUM_TEXTURE_TARGETS; i++) {<br>
+      struct st_texture_object *stObj =<br>
+         st_texture_object(ctx->Shared->FallbackTex[i]);<br>
+      if (stObj) {<br>
+         st_texture_release_context_sampler_view(st, stObj);<br>
+      }<br>
    }<br>
 <br>
    st_context_free_zombie_objects(st);<br>
@@ -933,11 +957,6 @@ st_destroy_context(struct st_context *st)<br>
    mtx_destroy(&st->zombie_sampler_views.mutex);<br>
    mtx_destroy(&st->zombie_shaders.mutex);<br>
 <br>
-   /* This must be called first so that glthread has a chance to finish */<br>
-   _mesa_glthread_destroy(ctx);<br>
-<br>
-   _mesa_HashWalk(ctx->Shared->TexObjects, destroy_tex_sampler_cb, st);<br>
-<br>
    st_reference_fragprog(st, &st->fp, NULL);<br>
    st_reference_prog(st, &st->gp, NULL);<br>
    st_reference_vertprog(st, &st->vp, NULL);<br>
@@ -965,4 +984,12 @@ st_destroy_context(struct st_context *st)<br>
    st = NULL;<br>
 <br>
    free(ctx);<br>
+<br>
+   if (save_ctx == ctx) {<br>
+      /* unbind the context we just deleted */<br>
+      _mesa_make_current(NULL, NULL, NULL);<br>
+   } else {<br>
+      /* Restore the current context and draw/read buffers (may be NULL) */<br>
+      _mesa_make_current(save_ctx, save_drawbuffer, save_readbuffer);<br>
+   }<br>
 }<br>
-- <br>
1.8.5.6<br>
<br>
</div>
</span></font></div>
</div>
</body>
</html>