[Mesa-dev] [PATCH 4/6] meta: Cleanup the resources we allocate.

Ian Romanick idr at freedesktop.org
Fri May 25 15:28:08 PDT 2012


On 05/24/2012 06:29 PM, Stéphane Marchesin wrote:
> From: Antoine Labour<piman at chromium.org>
>
> When we have multiple shared contexts, and one of them is
> long-running, this will lead to never freeing those resources
> since they are shared. Instead, free them right away on context
> destruction since we know the other context isn't using them.

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

This should also be tagged with:

NOTE: This is a candidate for the 8.0 branch.

> ---
>   src/mesa/drivers/common/meta.c |   72 ++++++++++++++++++++++++++++++++++++---
>   1 files changed, 66 insertions(+), 6 deletions(-)
>
> diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
> index 95336fc..a52de86 100644
> --- a/src/mesa/drivers/common/meta.c
> +++ b/src/mesa/drivers/common/meta.c
> @@ -319,6 +319,10 @@ struct gl_meta_state
>      struct drawtex_state DrawTex;  /**<  For _mesa_meta_DrawTex() */
>   };
>
> +static void meta_glsl_blit_cleanup(struct gl_context *ctx, struct blit_state *blit);
> +static void cleanup_temp_texture(struct gl_context *ctx, struct temp_texture *tex);
> +static void meta_glsl_clear_cleanup(struct gl_context *ctx, struct clear_state *clear);
> +
>   static GLuint
>   compile_shader_with_debug(struct gl_context *ctx, GLenum target, const GLcharARB *source)
>   {
> @@ -335,12 +339,16 @@ compile_shader_with_debug(struct gl_context *ctx, GLenum target, const GLcharARB
>         return shader;
>
>      _mesa_GetShaderiv(shader, GL_INFO_LOG_LENGTH,&size);
> -   if (size == 0)
> +   if (size == 0) {
> +      _mesa_DeleteObjectARB(shader);
>         return 0;
> +   }
>
>      info = malloc(size);
> -   if (!info)
> +   if (!info) {
> +      _mesa_DeleteObjectARB(shader);
>         return 0;
> +   }
>
>      _mesa_GetProgramInfoLog(shader, size, NULL, info);
>      _mesa_problem(ctx,
> @@ -349,6 +357,7 @@ compile_shader_with_debug(struct gl_context *ctx, GLenum target, const GLcharARB
>   		 info, source);
>
>      free(info);
> +   _mesa_DeleteObjectARB(shader);
>
>      return 0;
>   }
> @@ -401,10 +410,15 @@ _mesa_meta_init(struct gl_context *ctx)
>   void
>   _mesa_meta_free(struct gl_context *ctx)
>   {
> -   /* Note: Any textures, VBOs, etc, that we allocate should get
> -    * freed by the normal context destruction code.  But this would be
> -    * the place to free other meta data someday.
> -    */
> +   GET_CURRENT_CONTEXT(old_context);
> +   _mesa_make_current(ctx, NULL, NULL);
> +   meta_glsl_blit_cleanup(ctx,&ctx->Meta->Blit);
> +   meta_glsl_clear_cleanup(ctx,&ctx->Meta->Clear);
> +   cleanup_temp_texture(ctx,&ctx->Meta->TempTex);
> +   if (old_context)
> +      _mesa_make_current(old_context, old_context->WinSysDrawBuffer, old_context->WinSysReadBuffer);
> +   else
> +      _mesa_make_current(NULL, NULL, NULL);
>      free(ctx->Meta);
>      ctx->Meta = NULL;
>   }
> @@ -1068,6 +1082,15 @@ init_temp_texture(struct gl_context *ctx, struct temp_texture *tex)
>      _mesa_GenTextures(1,&tex->TexObj);
>   }
>
> +static void
> +cleanup_temp_texture(struct gl_context *ctx, struct temp_texture *tex)
> +{
> +   if (!tex->TexObj)
> +     return;
> +   _mesa_DeleteTextures(1,&tex->TexObj);
> +   tex->TexObj = 0;
> +}
> +
>
>   /**
>    * Return pointer to temp_texture info for non-bitmap ops.
> @@ -1604,6 +1627,21 @@ _mesa_meta_BlitFramebuffer(struct gl_context *ctx,
>      }
>   }
>
> +static void
> +meta_glsl_blit_cleanup(struct gl_context *ctx, struct blit_state *blit)
> +{
> +   if (blit->ArrayObj) {
> +      _mesa_DeleteVertexArraysAPPLE(1,&blit->ArrayObj);
> +      blit->ArrayObj = 0;
> +      _mesa_DeleteBuffersARB(1,&blit->VBO);
> +      blit->VBO = 0;
> +   }
> +   if (blit->DepthFP) {
> +      _mesa_DeletePrograms(1,&blit->DepthFP);
> +      blit->DepthFP = 0;
> +   }
> +}
> +
>
>   /**
>    * Meta implementation of ctx->Driver.Clear() in terms of polygon rendering.
> @@ -1786,7 +1824,9 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear)
>
>      clear->ShaderProg = _mesa_CreateProgramObjectARB();
>      _mesa_AttachShader(clear->ShaderProg, fs);
> +   _mesa_DeleteObjectARB(fs);
>      _mesa_AttachShader(clear->ShaderProg, vs);
> +   _mesa_DeleteObjectARB(vs);
>      _mesa_BindAttribLocationARB(clear->ShaderProg, 0, "position");
>      _mesa_LinkProgramARB(clear->ShaderProg);
>
> @@ -1799,7 +1839,9 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear)
>
>         clear->IntegerShaderProg = _mesa_CreateProgramObjectARB();
>         _mesa_AttachShader(clear->IntegerShaderProg, fs);
> +      _mesa_DeleteObjectARB(fs);
>         _mesa_AttachShader(clear->IntegerShaderProg, vs);
> +      _mesa_DeleteObjectARB(vs);
>         _mesa_BindAttribLocationARB(clear->IntegerShaderProg, 0, "position");
>
>         /* Note that user-defined out attributes get automatically assigned
> @@ -1814,6 +1856,24 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear)
>      }
>   }
>
> +static void
> +meta_glsl_clear_cleanup(struct gl_context *ctx, struct clear_state *clear)
> +{
> +   if (clear->ArrayObj == 0)
> +      return;
> +   _mesa_DeleteVertexArraysAPPLE(1,&clear->ArrayObj);
> +   clear->ArrayObj = 0;
> +   _mesa_DeleteBuffersARB(1,&clear->VBO);
> +   clear->VBO = 0;
> +   _mesa_DeleteObjectARB(clear->ShaderProg);
> +   clear->ShaderProg = 0;
> +
> +   if (clear->IntegerShaderProg) {
> +      _mesa_DeleteObjectARB(clear->IntegerShaderProg);
> +      clear->IntegerShaderProg = 0;
> +   }
> +}
> +
>   /**
>    * Meta implementation of ctx->Driver.Clear() in terms of polygon rendering.
>    */


More information about the mesa-dev mailing list