summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2013-12-14 11:58:45 -0800
committerCarl Worth <cworth@cworth.org>2014-03-04 12:57:01 -0800
commita4a8af4cbbe726ac00147e30310c1f84c92533bb (patch)
tree519671a940dd9fbccbf5b5080f0c05fb4ab91c97
parentc1bcdcde1c7e0c369f2cc4b4d7e56e9c3ea6707f (diff)
downloadmesa-a4a8af4cbbe726ac00147e30310c1f84c92533bb.tar.gz
meta: Release resources used by _mesa_meta_DrawPixels
_mesa_meta_DrawPixels creates a VAO and (potentially) two fragment programs, but none of them are ever released. Leaking piles of memory is generally frowned upon. Signed-off-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Brian Paul <brianp@vmware.com> Cc: "9.1 9.2 10.0" <mesa-stable@lists.freedesktop.org> (cherry picked from commit fcb498302bff912ca4f3169d37cc04b58e77d0fa)
-rw-r--r--src/mesa/drivers/common/meta.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
index 5bdc402d37a..77b0e8a14b2 100644
--- a/src/mesa/drivers/common/meta.c
+++ b/src/mesa/drivers/common/meta.c
@@ -356,6 +356,7 @@ static void meta_glsl_clear_cleanup(struct gl_context *ctx, struct clear_state *
static void meta_glsl_generate_mipmap_cleanup(struct gl_context *ctx,
struct gen_mipmap_state *mipmap);
static void meta_decompress_cleanup(struct decompress_state *decompress);
+static void meta_drawpix_cleanup(struct drawpix_state *drawpix);
static GLuint
compile_shader_with_debug(struct gl_context *ctx, GLenum target, const GLcharARB *source)
@@ -451,6 +452,7 @@ _mesa_meta_free(struct gl_context *ctx)
meta_glsl_generate_mipmap_cleanup(ctx, &ctx->Meta->Mipmap);
cleanup_temp_texture(ctx, &ctx->Meta->TempTex);
meta_decompress_cleanup(&ctx->Meta->Decompress);
+ meta_drawpix_cleanup(&ctx->Meta->DrawPix);
if (old_context)
_mesa_make_current(old_context, old_context->WinSysDrawBuffer, old_context->WinSysReadBuffer);
else
@@ -2491,7 +2493,24 @@ _mesa_meta_CopyPixels(struct gl_context *ctx, GLint srcX, GLint srcY,
_mesa_meta_end(ctx);
}
+static void
+meta_drawpix_cleanup(struct drawpix_state *drawpix)
+{
+ if (drawpix->ArrayObj != 0) {
+ _mesa_DeleteVertexArrays(1, &drawpix->ArrayObj);
+ drawpix->ArrayObj = 0;
+ }
+ if (drawpix->StencilFP != 0) {
+ _mesa_DeleteProgramsARB(1, &drawpix->StencilFP);
+ drawpix->StencilFP = 0;
+ }
+
+ if (drawpix->DepthFP != 0) {
+ _mesa_DeleteProgramsARB(1, &drawpix->DepthFP);
+ drawpix->DepthFP = 0;
+ }
+}
/**
* When the glDrawPixels() image size is greater than the max rectangle