meta: memory leak of CopyPixels usage
authorSergii Romantsov <sergii.romantsov@globallogic.com>
Mon, 27 May 2019 13:45:35 +0000 (16:45 +0300)
committerSergii Romantsov <sergii.romantsov@globallogic.com>
Tue, 16 Jul 2019 10:48:47 +0000 (13:48 +0300)
Meta of CopyPixel generates a buffer object
but does not free it on cleanup.

Fixes: 37d11b13ce1d (meta: Don't pollute the buffer object namespace in _mesa_meta_setup_vertex_objects)
Signed-off-by: Sergii Romantsov <sergii.romantsov@globallogic.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/mesa/drivers/common/meta.c

index 302c5fffeb9f00a199e536446d38ab13c5c57b5b..18ed6e7f16852267cb16e540dc36a94e526c871f 100644 (file)
@@ -104,6 +104,8 @@ 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 void meta_copypix_cleanup(struct gl_context *ctx,
+                                    struct copypix_state *copypix);
 static void meta_decompress_cleanup(struct gl_context *ctx,
                                     struct decompress_state *decompress);
 static void meta_drawpix_cleanup(struct gl_context *ctx,
@@ -422,6 +424,7 @@ _mesa_meta_free(struct gl_context *ctx)
    _mesa_make_current(ctx, NULL, NULL);
    _mesa_meta_glsl_blit_cleanup(ctx, &ctx->Meta->Blit);
    meta_glsl_clear_cleanup(ctx, &ctx->Meta->Clear);
+   meta_copypix_cleanup(ctx, &ctx->Meta->CopyPix);
    _mesa_meta_glsl_generate_mipmap_cleanup(ctx, &ctx->Meta->Mipmap);
    cleanup_temp_texture(ctx, &ctx->Meta->TempTex);
    meta_decompress_cleanup(ctx, &ctx->Meta->Decompress);
@@ -1595,6 +1598,17 @@ meta_glsl_clear_cleanup(struct gl_context *ctx, struct clear_state *clear)
    }
 }
 
+static void
+meta_copypix_cleanup(struct gl_context *ctx, struct copypix_state *copypix)
+{
+   if (copypix->VAO == 0)
+      return;
+   _mesa_DeleteVertexArrays(1, &copypix->VAO);
+   copypix->VAO = 0;
+   _mesa_reference_buffer_object(ctx, &copypix->buf_obj, NULL);
+}
+
+
 /**
  * Given a bitfield of BUFFER_BIT_x draw buffers, call glDrawBuffers to
  * set GL to only draw to those buffers.