[Mesa-dev] [PATCH] st/mesa: fix texture deletion context mix-up issues (v2)
Roland Scheidegger
sroland at vmware.com
Fri Mar 22 20:09:20 UTC 2019
Looks alright to me, it's all quite tricky stuff...
Reviewed-by: Roland Scheidegger <sroland at vmware.com>
Am 22.03.19 um 20:51 schrieb Brian Paul:
> When we destroy a context, we need to temporarily make that context
> the current one for the thread.
>
> That's because during context tear-down we make many calls to
> _mesa_reference_texobj(&texObj, NULL). Note there's no context
> parameter. If the texture's refcount goes to zero and we need to
> delete it, we use the thread's current context. But if that context
> isn't the context we're tearing down, we get into trouble when
> deallocating sampler views. See patch 593e36f956 ("st/mesa:
> implement "zombie" sampler views (v2)") for background information.
>
> Also, we need to release any sampler views attached to the fallback
> textures.
>
> Fixes a crash on exit with a glretrace of the Nobel Clinician
> application.
>
> v2: at end of st_destroy_context(), check if save_ctx == ctx and
> unbind the context if so.
> ---
> src/mesa/state_tracker/st_context.c | 51 ++++++++++++++++++++++++++++---------
> 1 file changed, 39 insertions(+), 12 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
> index f037384..09d467a 100644
> --- a/src/mesa/state_tracker/st_context.c
> +++ b/src/mesa/state_tracker/st_context.c
> @@ -917,15 +917,39 @@ st_destroy_context(struct st_context *st)
> {
> struct gl_context *ctx = st->ctx;
> struct st_framebuffer *stfb, *next;
> + struct gl_framebuffer *save_drawbuffer;
> + struct gl_framebuffer *save_readbuffer;
> +
> + /* Save the current context and draw/read buffers*/
> + GET_CURRENT_CONTEXT(save_ctx);
> + if (save_ctx) {
> + save_drawbuffer = save_ctx->WinSysDrawBuffer;
> + save_readbuffer = save_ctx->WinSysReadBuffer;
> + } else {
> + save_drawbuffer = save_readbuffer = NULL;
> + }
>
> - GET_CURRENT_CONTEXT(curctx);
> + /*
> + * We need to bind the context we're deleting so that
> + * _mesa_reference_texobj_() uses this context when deleting textures.
> + * Similarly for framebuffer objects, etc.
> + */
> + _mesa_make_current(ctx, NULL, NULL);
>
> - if (curctx == NULL) {
> - /* No current context, but we need one to release
> - * renderbuffer surface when we release framebuffer.
> - * So temporarily bind the context.
> - */
> - _mesa_make_current(ctx, NULL, NULL);
> + /* This must be called first so that glthread has a chance to finish */
> + _mesa_glthread_destroy(ctx);
> +
> + _mesa_HashWalk(ctx->Shared->TexObjects, destroy_tex_sampler_cb, st);
> +
> + /* For the fallback textures, free any sampler views belonging to this
> + * context.
> + */
> + for (unsigned i = 0; i < NUM_TEXTURE_TARGETS; i++) {
> + struct st_texture_object *stObj =
> + st_texture_object(ctx->Shared->FallbackTex[i]);
> + if (stObj) {
> + st_texture_release_context_sampler_view(st, stObj);
> + }
> }
>
> st_context_free_zombie_objects(st);
> @@ -933,11 +957,6 @@ st_destroy_context(struct st_context *st)
> mtx_destroy(&st->zombie_sampler_views.mutex);
> mtx_destroy(&st->zombie_shaders.mutex);
>
> - /* This must be called first so that glthread has a chance to finish */
> - _mesa_glthread_destroy(ctx);
> -
> - _mesa_HashWalk(ctx->Shared->TexObjects, destroy_tex_sampler_cb, st);
> -
> st_reference_fragprog(st, &st->fp, NULL);
> st_reference_prog(st, &st->gp, NULL);
> st_reference_vertprog(st, &st->vp, NULL);
> @@ -965,4 +984,12 @@ st_destroy_context(struct st_context *st)
> st = NULL;
>
> free(ctx);
> +
> + if (save_ctx == ctx) {
> + /* unbind the context we just deleted */
> + _mesa_make_current(NULL, NULL, NULL);
> + } else {
> + /* Restore the current context and draw/read buffers (may be NULL) */
> + _mesa_make_current(save_ctx, save_drawbuffer, save_readbuffer);
> + }
> }
>
More information about the mesa-dev
mailing list