[Mesa-dev] [PATCH] st/mesa: don't leak pipe_surface if pipe_context is not current

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Tue Jan 8 21:20:53 UTC 2019


On Tue, Jan 8, 2019 at 5:17 PM Marek Olšák <maraeo at gmail.com> wrote:
>
> From: Marek Olšák <marek.olsak at amd.com>
>
> We have found some pipe_surface leaks internally.
>
> This is the same code as surface_destroy in radeonsi.
> Ideally, surface_destroy would be in pipe_screen.
> No, pipe_surfaces are not context objects.
>
> Cc: 18.3 19.0 <mesa-stable at lists.freedesktop.org>

FYI, 19.0 does not branch until 2019-01-29 as per the announcement from Dylan.

> ---
>  src/gallium/auxiliary/util/u_inlines.h | 19 +++++++++++++++++++
>  src/mesa/state_tracker/st_cb_fbo.c     |  5 ++++-
>  2 files changed, 23 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/auxiliary/util/u_inlines.h b/src/gallium/auxiliary/util/u_inlines.h
> index b06fb111709..fa1e920b509 100644
> --- a/src/gallium/auxiliary/util/u_inlines.h
> +++ b/src/gallium/auxiliary/util/u_inlines.h
> @@ -147,20 +147,39 @@ pipe_resource_reference(struct pipe_resource **dst, struct pipe_resource *src)
>
>           old_dst->screen->resource_destroy(old_dst->screen, old_dst);
>           old_dst = next;
>        } while (pipe_reference_described(&old_dst->reference, NULL,
>                                          (debug_reference_descriptor)
>                                          debug_describe_resource));
>     }
>     *dst = src;
>  }
>
> +/**
> + * Same as pipe_surface_release, but used when pipe_context doesn't exist
> + * anymore.
> + */
> +static inline void
> +pipe_surface_release_no_context(struct pipe_surface **ptr)
> +{
> +   struct pipe_surface *surf = *ptr;
> +
> +   if (pipe_reference_described(&surf->reference, NULL,
> +                                (debug_reference_descriptor)
> +                                debug_describe_surface)) {
> +      /* trivially destroy pipe_surface */
> +      pipe_resource_reference(&surf->texture, NULL);
> +      free(surf);
> +   }
> +   *ptr = NULL;
> +}
> +
>  /**
>   * Set *dst to \p src with proper reference counting.
>   *
>   * The caller must guarantee that \p src and *dst were created in
>   * the same context (if they exist), and that this must be the current context.
>   */
>  static inline void
>  pipe_sampler_view_reference(struct pipe_sampler_view **dst,
>                              struct pipe_sampler_view *src)
>  {
> diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c
> index 8901a8680ef..8d099f7b0f9 100644
> --- a/src/mesa/state_tracker/st_cb_fbo.c
> +++ b/src/mesa/state_tracker/st_cb_fbo.c
> @@ -278,22 +278,25 @@ st_renderbuffer_alloc_storage(struct gl_context * ctx,
>   * gl_renderbuffer::Delete()
>   */
>  static void
>  st_renderbuffer_delete(struct gl_context *ctx, struct gl_renderbuffer *rb)
>  {
>     struct st_renderbuffer *strb = st_renderbuffer(rb);
>     if (ctx) {
>        struct st_context *st = st_context(ctx);
>        pipe_surface_release(st->pipe, &strb->surface_srgb);
>        pipe_surface_release(st->pipe, &strb->surface_linear);
> -      strb->surface = NULL;
> +   } else {
> +      pipe_surface_release_no_context(&strb->surface_srgb);
> +      pipe_surface_release_no_context(&strb->surface_linear);
>     }
> +   strb->surface = NULL;
>     pipe_resource_reference(&strb->texture, NULL);
>     free(strb->data);
>     _mesa_delete_renderbuffer(ctx, rb);
>  }
>
>
>  /**
>   * Called via ctx->Driver.NewRenderbuffer()
>   */
>  static struct gl_renderbuffer *
> --
> 2.17.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list